鱼C论坛

 找回密码
 立即注册
查看: 2164|回复: 7

[已解决]这个题都有点看不懂,大家给看看

[复制链接]
发表于 2017-10-16 22:03:11 | 显示全部楼层 |阅读模式

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

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

x
下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。(程序已经按标准答案给出)

assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,17h
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end

求个详细解读过程
最佳答案
2017-10-16 22:57:57
本帖最后由 兰陵月 于 2017-10-16 23:14 编辑
  1. assume cs:code                                ;这行不需要解释了吧?
  2.        
  3. code segment                                ;这行相信也不需要解释
  4.         mov ax,cs                                ;将CS的值传递给AX
  5.         mov ds,ax                                ;将AX的值(此时AX值和CS值相同)传递给DS,
  6.                                                         ;这样CS和DS的值就是一样的了
  7.        
  8.         mov ax,0020h                        ;将0020h这个值给AX
  9.         mov es,ax                                ;将AX的值(此时AX的值为0020H)传递给ES,
  10.                                                         ;执行完毕后,ES的值就是0020H了
  11.         mov bx,0                                ;将0给BX,BX等下将作为偏移地址
  12.                        
  13.         mov cx,17h                                ;下面紧跟着一个名称为S的循环,这里设置循环次数23次即17H
  14.                                                         ;循环体开始
  15. s:        mov al,[bx]                                ;假设此时为第1次循环,此时BX=0。此句是将
  16.                                                         ;DS:[0]处的1个字节传给al,
  17.                                                         ;由第4行和第5行可以知道,DS和CS的值相同,
  18.                                                         ;所以DS:[0]其实也就是CS:[0]处的值,
  19.                                                         ;而CS段指向code段,也就是mov ax,4c00h
  20.                                                         ;语句所在的段。这样就与CS段扯上关系了。
  21.                                                         ;同时由于ES=0020H,而ES:[0]=0020:00,也即0:200。
  22.                                                         ;这样就达到了将“mov ax,4c00h”之前的
  23.                                                         ;指令复制到内存0:200处的目的。
  24.                                                                        
  25.         mov es:[bx],al                        ;假设此时为第1次循环,此时BX=0。
  26.                                                         ;此句是将al的值给ES:[0]处
  27.                                                         ;也就是DS:[0],同时也是CS:[0]处的值)
  28.         inc bx                                        ;bx自加1后,又开始下一轮循环。
  29.                                                         ;在下一轮循环中,bx的值已经为1了,
  30.                                                         ;因此DS:[bx]就变成DS:[1]了,同样ES:[BX]也变成ES:[1]了。
  31.         loop s
  32.        
  33.         mov ax,4c00h
  34.         int 21h
  35. code ends
  36.        
  37. end
复制代码


我无语这个编辑器了,从notepad++里出来,就变成这个排版了

至于为什么循环次数是17H,也即23次,请看下图,这是编译好后debug的



123.jpg

从上图中我们可以看到mov ax,4c00H语句所在的地址为0780:0017,

而指令第一句mov ax,cs语句所在的地址为0780:0000,他们之间刚好相差17H,这就是循环次数17H的由来。

不过这个程序里提出这个东东没有多大意义,不要去纠结,因为在一般情况你不会找这个循环次数,话说还有其他的方法也可以找出来~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-16 22:44:19 | 显示全部楼层
首先既然是移动,肯定有起始地址和目标地址
cs是程序代码段地址,要复制程序那就要从这个位置开始,ip是从0开始的。所以这么看下来,起始地址是cs:ip。ds代表移动的起始地址的段地址,es代表移动后的目标地址的段地址。
思路就是:ds指向cs,bx指向ip,那么起始地址就可以用ds:[bx]来操作;目标地址是0:200,es:si代表目标地址(这里有个小技巧,0:200这个地址可以es = 20,si = 0,这样算起来物理地址还是 200h,既然si和bx都是从0开始,而且拿多少个就要存多少个,那么就可以用bx来代表起始偏移地址和目标偏移地址)。移动的次数需要查下课本了,我记得mov语句是占3个字节吧,具体忘记了。就是一个一个字节不断的从其实搬运到目的就好了。
对了,机器码1和0组合起来的字节数对应过来就是指令,所以搬运过去数据就可以了,这个在头几节课有讲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-16 22:57:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 兰陵月 于 2017-10-16 23:14 编辑
  1. assume cs:code                                ;这行不需要解释了吧?
  2.        
  3. code segment                                ;这行相信也不需要解释
  4.         mov ax,cs                                ;将CS的值传递给AX
  5.         mov ds,ax                                ;将AX的值(此时AX值和CS值相同)传递给DS,
  6.                                                         ;这样CS和DS的值就是一样的了
  7.        
  8.         mov ax,0020h                        ;将0020h这个值给AX
  9.         mov es,ax                                ;将AX的值(此时AX的值为0020H)传递给ES,
  10.                                                         ;执行完毕后,ES的值就是0020H了
  11.         mov bx,0                                ;将0给BX,BX等下将作为偏移地址
  12.                        
  13.         mov cx,17h                                ;下面紧跟着一个名称为S的循环,这里设置循环次数23次即17H
  14.                                                         ;循环体开始
  15. s:        mov al,[bx]                                ;假设此时为第1次循环,此时BX=0。此句是将
  16.                                                         ;DS:[0]处的1个字节传给al,
  17.                                                         ;由第4行和第5行可以知道,DS和CS的值相同,
  18.                                                         ;所以DS:[0]其实也就是CS:[0]处的值,
  19.                                                         ;而CS段指向code段,也就是mov ax,4c00h
  20.                                                         ;语句所在的段。这样就与CS段扯上关系了。
  21.                                                         ;同时由于ES=0020H,而ES:[0]=0020:00,也即0:200。
  22.                                                         ;这样就达到了将“mov ax,4c00h”之前的
  23.                                                         ;指令复制到内存0:200处的目的。
  24.                                                                        
  25.         mov es:[bx],al                        ;假设此时为第1次循环,此时BX=0。
  26.                                                         ;此句是将al的值给ES:[0]处
  27.                                                         ;也就是DS:[0],同时也是CS:[0]处的值)
  28.         inc bx                                        ;bx自加1后,又开始下一轮循环。
  29.                                                         ;在下一轮循环中,bx的值已经为1了,
  30.                                                         ;因此DS:[bx]就变成DS:[1]了,同样ES:[BX]也变成ES:[1]了。
  31.         loop s
  32.        
  33.         mov ax,4c00h
  34.         int 21h
  35. code ends
  36.        
  37. end
复制代码


我无语这个编辑器了,从notepad++里出来,就变成这个排版了

至于为什么循环次数是17H,也即23次,请看下图,这是编译好后debug的



123.jpg

从上图中我们可以看到mov ax,4c00H语句所在的地址为0780:0017,

而指令第一句mov ax,cs语句所在的地址为0780:0000,他们之间刚好相差17H,这就是循环次数17H的由来。

不过这个程序里提出这个东东没有多大意义,不要去纠结,因为在一般情况你不会找这个循环次数,话说还有其他的方法也可以找出来~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-10-17 14:16:46 | 显示全部楼层
兰陵月 发表于 2017-10-16 22:57
我无语这个编辑器了,从notepad++里出来,就变成这个排版了

至于为什么循环次数是17H,也即23次,请 ...

你这个也太详细了,有些东西还是自己操作才能理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-17 14:37:41 | 显示全部楼层
已然就位 发表于 2017-10-17 14:16
你这个也太详细了,有些东西还是自己操作才能理解



楼主应该是刚刚开始学习汇编,可能会需要~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-17 16:48:32 | 显示全部楼层
兰陵月 发表于 2017-10-16 22:57
我无语这个编辑器了,从notepad++里出来,就变成这个排版了

至于为什么循环次数是17H,也即23次,请 ...

首先非常感谢你,虽然我还是看不懂,但是我会慢慢去理解的,感谢感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-17 17:02:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-17 23:58:17 | 显示全部楼层
微笑向暖~ 发表于 2017-10-17 16:48
首先非常感谢你,虽然我还是看不懂,但是我会慢慢去理解的,感谢感谢!!!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 06:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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