|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
代码与小甲鱼视频中的代码略有差异。代码如下ASSUME CS:CODE,DS:DATA,SS:STACK
DATA SEGMENT
DB 'welcome to masm!'
db 02h,24h,71h
DATA ENDS
STACK SEGMENT
DW 8 DUP(0)
STACK ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX ;DS为数据源
MOV BX,0
MOV AX,STACK
MOV SS,AX
MOV SP,10H
MOV AX,0B872H
MOV CX,3
S:
PUSH CX
PUSH AX
MOV ES,AX ;ES为目的数据段地址,初次地址为B872H
MOV SI,0
MOV DI,0
MOV CX,10H
S1:
MOV AL,DS:[SI] ;每次循环,从DS:[SI]中取出数据,存储到AL中
MOV ES:[DI],AL ;每次循环,将AL中的数据放入到ES:[DI]中
INC SI
ADD DI,2
LOOP S1
MOV DI,0
POP BX
MOV AL,DS:10H[BX] ;取出颜色
MOV CX,10H
S2:
MOV ES:1[DI],AL ;写入颜色
ADD DI,2
LOOP S2
POP AX
POP CX
ADD AX,0AH
INC BX
LOOP S
MOV AX,4C00H
INT 21H
CODE ENDS
END START
问题如下:
通过调试可知,通过“MOV AL,DS:[SI]”可以读取目标数据存入AL,但是“MOV ES:[DI],AL ”无法将AL写入到ES:[DI](初次写入位置B8720H),这是为啥呢。。。。求指教。
本帖最后由 jackz007 于 2019-8-20 14:35 编辑 MOV DI,0
POP BX ; 这一句破坏了堆栈平衡
MOV AL,DS:10H[BX] ; 取出颜色
改成下面这样就可以了: MOV DI,0
XOR BX,BX ; 让 BX 指向数据段开头位置(0 偏移)
MOV AL,DS:10H[BX] ; 取出颜色
由于堆栈平衡被破坏,在循环中,ES 的值不正确,导致无法正常显示信息。
楼主可以参考一下我修改的代码: ASSUME CS:CODE , DS:DATA
DATA SEGMENT PARA PUBLIC 'DATA'
MESSAGE DB 'welcome to masm!' , 00h
COLOR DB 02h
DATA ENDS
STACK SEGMENT STACK
DW 8 DUP(0)
STACK ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX ;DS为数据源
MOV AX,0B872H
MOV CX,3
CLD
M1: MOV ES,AX
PUSH AX
MOV SI,OFFSET MESSAGE
XOR DI,DI
M2: LODSB
OR AL,AL
JZ M3
STOSB
MOV AL,COLOR
STOSB
JMP M2
M3: POP AX
ADD AX,0AH
LOOP M1
XOR AX,AX
INT 016H
MOV AX,4C00H
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
任何时候,想退出 debug.exe 只要键入 q 就可以退出程序
|
|