鱼C论坛

 找回密码
 立即注册
查看: 4479|回复: 5

[已解决]实验九,“MOV ES:[DI],AL”无法写入数据

[复制链接]
发表于 2019-8-20 10:54:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码与小甲鱼视频中的代码略有差异。代码如下
  1. ASSUME CS:CODE,DS:DATA,SS:STACK
  2. DATA SEGMENT
  3.         DB 'welcome to masm!'
  4.         db 02h,24h,71h
  5. DATA ENDS

  6. STACK SEGMENT
  7.         DW 8 DUP(0)
  8. STACK ENDS

  9. CODE SEGMENT
  10. START:
  11.                 MOV AX,DATA
  12.                 MOV DS,AX   ;DS为数据源
  13.                 MOV BX,0
  14.                 MOV AX,STACK
  15.                 MOV SS,AX
  16.                 MOV SP,10H
  17.                 MOV AX,0B872H
  18.                
  19.                 MOV CX,3
  20. S:               
  21.                 PUSH CX
  22.                 PUSH AX
  23.                 MOV ES,AX   ;ES为目的数据段地址,初次地址为B872H
  24.                 MOV SI,0
  25.                 MOV DI,0
  26.                 MOV CX,10H
  27. S1:               
  28.                 MOV AL,DS:[SI] ;每次循环,从DS:[SI]中取出数据,存储到AL中
  29.                 MOV ES:[DI],AL ;每次循环,将AL中的数据放入到ES:[DI]中
  30.                 INC SI
  31.                 ADD DI,2
  32.                 LOOP S1
  33.                                
  34.                 MOV DI,0
  35.                 POP BX
  36.                 MOV AL,DS:10H[BX] ;取出颜色
  37.                 MOV CX,10H
  38. S2:
  39.                 MOV ES:1[DI],AL  ;写入颜色
  40.                 ADD DI,2
  41.                 LOOP S2
  42.                
  43.                 POP AX
  44.                 POP CX
  45.                 ADD AX,0AH
  46.                 INC BX
  47.                 LOOP S       
  48.                
  49.                 MOV AX,4C00H
  50.                 INT 21H               
  51. CODE ENDS
  52. END START
  53.                
复制代码


问题如下:
通过调试可知,通过“MOV AL,DS:[SI]”可以读取目标数据存入AL,但是“MOV ES:[DI],AL ”无法将AL写入到ES:[DI](初次写入位置B8720H),这是为啥呢。。。。求指教。
最佳答案
2019-8-20 12:19:26
本帖最后由 jackz007 于 2019-8-20 14:35 编辑
  1.                 MOV DI,0
  2.                 POP BX            ; 这一句破坏了堆栈平衡
  3.                 MOV AL,DS:10H[BX] ; 取出颜色
复制代码


      改成下面这样就可以了:
  1.                 MOV DI,0
  2.                 XOR BX,BX         ; 让 BX 指向数据段开头位置(0 偏移)
  3.                 MOV AL,DS:10H[BX] ; 取出颜色
复制代码


      由于堆栈平衡被破坏,在循环中,ES 的值不正确,导致无法正常显示信息。

      楼主可以参考一下我修改的代码:
  1. ASSUME CS:CODE , DS:DATA

  2. DATA SEGMENT PARA PUBLIC 'DATA'
  3. MESSAGE DB 'welcome to masm!' , 00h
  4.   COLOR DB 02h
  5. DATA ENDS

  6. STACK SEGMENT STACK
  7.         DW 8 DUP(0)
  8. STACK ENDS

  9. CODE SEGMENT PARA PUBLIC 'CODE'
  10. MAIN PROC FAR
  11.                 MOV AX,DATA
  12.                 MOV DS,AX              ;DS为数据源
  13.                 MOV AX,0B872H
  14.                 MOV CX,3
  15.                 CLD
  16.             M1: MOV ES,AX
  17.                 PUSH AX
  18.                 MOV SI,OFFSET MESSAGE
  19.                 XOR DI,DI
  20.             M2: LODSB
  21.                 OR AL,AL
  22.                 JZ M3
  23.                 STOSB
  24.                 MOV AL,COLOR
  25.                 STOSB
  26.                 JMP M2                 
  27.             M3: POP AX
  28.                 ADD AX,0AH
  29.                 LOOP M1
  30.                 XOR AX,AX
  31.                 INT 016H
  32.                 MOV AX,4C00H
  33.                 INT 21H               
  34. MAIN ENDP
  35. CODE ENDS
  36. END MAIN
复制代码


    任何时候,想退出 debug.exe 只要键入 q 就可以退出程序
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-8-20 12:19:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-8-20 14:35 编辑
  1.                 MOV DI,0
  2.                 POP BX            ; 这一句破坏了堆栈平衡
  3.                 MOV AL,DS:10H[BX] ; 取出颜色
复制代码


      改成下面这样就可以了:
  1.                 MOV DI,0
  2.                 XOR BX,BX         ; 让 BX 指向数据段开头位置(0 偏移)
  3.                 MOV AL,DS:10H[BX] ; 取出颜色
复制代码


      由于堆栈平衡被破坏,在循环中,ES 的值不正确,导致无法正常显示信息。

      楼主可以参考一下我修改的代码:
  1. ASSUME CS:CODE , DS:DATA

  2. DATA SEGMENT PARA PUBLIC 'DATA'
  3. MESSAGE DB 'welcome to masm!' , 00h
  4.   COLOR DB 02h
  5. DATA ENDS

  6. STACK SEGMENT STACK
  7.         DW 8 DUP(0)
  8. STACK ENDS

  9. CODE SEGMENT PARA PUBLIC 'CODE'
  10. MAIN PROC FAR
  11.                 MOV AX,DATA
  12.                 MOV DS,AX              ;DS为数据源
  13.                 MOV AX,0B872H
  14.                 MOV CX,3
  15.                 CLD
  16.             M1: MOV ES,AX
  17.                 PUSH AX
  18.                 MOV SI,OFFSET MESSAGE
  19.                 XOR DI,DI
  20.             M2: LODSB
  21.                 OR AL,AL
  22.                 JZ M3
  23.                 STOSB
  24.                 MOV AL,COLOR
  25.                 STOSB
  26.                 JMP M2                 
  27.             M3: POP AX
  28.                 ADD AX,0AH
  29.                 LOOP M1
  30.                 XOR AX,AX
  31.                 INT 016H
  32.                 MOV AX,4C00H
  33.                 INT 21H               
  34. MAIN ENDP
  35. CODE ENDS
  36. END MAIN
复制代码


    任何时候,想退出 debug.exe 只要键入 q 就可以退出程序
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-20 14:48:19 | 显示全部楼层
jackz007 发表于 2019-8-20 12:19
改成下面这样就可以了:


谢谢。
不用“XOR BX,BX ”,我直接把“POP BX”砍掉,也能正常运行了(因为代码开头的时候已经将BX置0了)

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-20 15:01:41 | 显示全部楼层
jackz007 发表于 2019-8-20 12:19
改成下面这样就可以了:

这个题还有个地方不是很懂:
运行exe时,可以正确的出现结果了,为什么debug单步调试时,用“-D B872:0”直接查看目标内存单元,却看不到预期的数据呢???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-20 15:15:17 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-20 15:18 编辑
徒手拆高达 发表于 2019-8-20 15:01
这个题还有个地方不是很懂:
运行exe时,可以正确的出现结果了,为什么debug单步调试时,用“-D B872:0 ...


        因为你要看的是显存的内容,是会和屏显的内容同步改变的。

        也可以说,不用去看这个地址的内容,因为,此刻,这些内容正在屏幕上。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-20 15:30:29 | 显示全部楼层
jackz007 发表于 2019-8-20 15:15
因为你要看的是显存的内容,是会和屏显的内容同步改变的。

        也可以说,不用去看这个 ...

原来如此 非常感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 23:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表