这个题都有点看不懂,大家给看看
下面的程序的功能是将“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,
mov es:,al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
求个详细解读过程
首先既然是移动,肯定有起始地址和目标地址
cs是程序代码段地址,要复制程序那就要从这个位置开始,ip是从0开始的。所以这么看下来,起始地址是cs:ip。ds代表移动的起始地址的段地址,es代表移动后的目标地址的段地址。
思路就是:ds指向cs,bx指向ip,那么起始地址就可以用ds:来操作;目标地址是0:200,es:si代表目标地址(这里有个小技巧,0:200这个地址可以es = 20,si = 0,这样算起来物理地址还是 200h,既然si和bx都是从0开始,而且拿多少个就要存多少个,那么就可以用bx来代表起始偏移地址和目标偏移地址)。移动的次数需要查下课本了,我记得mov语句是占3个字节吧,具体忘记了。就是一个一个字节不断的从其实搬运到目的就好了。
对了,机器码1和0组合起来的字节数对应过来就是指令,所以搬运过去数据就可以了,这个在头几节课有讲 本帖最后由 兰陵月 于 2017-10-16 23:14 编辑
assume cs:code ;这行不需要解释了吧?
code segment ;这行相信也不需要解释
mov ax,cs ;将CS的值传递给AX
mov ds,ax ;将AX的值(此时AX值和CS值相同)传递给DS,
;这样CS和DS的值就是一样的了
mov ax,0020h ;将0020h这个值给AX
mov es,ax ;将AX的值(此时AX的值为0020H)传递给ES,
;执行完毕后,ES的值就是0020H了
mov bx,0 ;将0给BX,BX等下将作为偏移地址
mov cx,17h ;下面紧跟着一个名称为S的循环,这里设置循环次数23次即17H
;循环体开始
s: mov al, ;假设此时为第1次循环,此时BX=0。此句是将
;DS:处的1个字节传给al,
;由第4行和第5行可以知道,DS和CS的值相同,
;所以DS:其实也就是CS:处的值,
;而CS段指向code段,也就是mov ax,4c00h
;语句所在的段。这样就与CS段扯上关系了。
;同时由于ES=0020H,而ES:=0020:00,也即0:200。
;这样就达到了将“mov ax,4c00h”之前的
;指令复制到内存0:200处的目的。
mov es:,al ;假设此时为第1次循环,此时BX=0。
;此句是将al的值给ES:处
;也就是DS:,同时也是CS:处的值)
inc bx ;bx自加1后,又开始下一轮循环。
;在下一轮循环中,bx的值已经为1了,
;因此DS:就变成DS:了,同样ES:也变成ES:了。
loop s
mov ax,4c00h
int 21h
code ends
end
我无语这个编辑器了,从notepad++里出来,就变成这个排版了
至于为什么循环次数是17H,也即23次,请看下图,这是编译好后debug的
从上图中我们可以看到mov ax,4c00H语句所在的地址为0780:0017,
而指令第一句mov ax,cs语句所在的地址为0780:0000,他们之间刚好相差17H,这就是循环次数17H的由来。
不过这个程序里提出这个东东没有多大意义,不要去纠结,因为在一般情况你不会找这个循环次数,话说还有其他的方法也可以找出来~ 兰陵月 发表于 2017-10-16 22:57
我无语这个编辑器了,从notepad++里出来,就变成这个排版了
至于为什么循环次数是17H,也即23次,请 ...
你这个也太详细了,有些东西还是自己操作才能理解 已然就位 发表于 2017-10-17 14:16
你这个也太详细了,有些东西还是自己操作才能理解
{:5_109:}{:5_109:}{:5_109:}
楼主应该是刚刚开始学习汇编,可能会需要~ 兰陵月 发表于 2017-10-16 22:57
我无语这个编辑器了,从notepad++里出来,就变成这个排版了
至于为什么循环次数是17H,也即23次,请 ...
首先非常感谢你,虽然我还是看不懂,但是我会慢慢去理解的,感谢感谢!!! {:5_106:} 微笑向暖~ 发表于 2017-10-17 16:48
首先非常感谢你,虽然我还是看不懂,但是我会慢慢去理解的,感谢感谢!!!
{:10_258:}{:10_258:}
页:
[1]