|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 就可以退出程序
|
|