|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 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,[bx] ;假设此时为第1次循环,此时BX=0。此句是将
- ;DS:[0]处的1个字节传给al,
- ;由第4行和第5行可以知道,DS和CS的值相同,
- ;所以DS:[0]其实也就是CS:[0]处的值,
- ;而CS段指向code段,也就是mov ax,4c00h
- ;语句所在的段。这样就与CS段扯上关系了。
- ;同时由于ES=0020H,而ES:[0]=0020:00,也即0:200。
- ;这样就达到了将“mov ax,4c00h”之前的
- ;指令复制到内存0:200处的目的。
-
- mov es:[bx],al ;假设此时为第1次循环,此时BX=0。
- ;此句是将al的值给ES:[0]处
- ;也就是DS:[0],同时也是CS:[0]处的值)
- inc bx ;bx自加1后,又开始下一轮循环。
- ;在下一轮循环中,bx的值已经为1了,
- ;因此DS:[bx]就变成DS:[1]了,同样ES:[BX]也变成ES:[1]了。
- 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的由来。
不过这个程序里提出这个东东没有多大意义,不要去纠结,因为在一般情况你不会找这个循环次数,话说还有其他的方法也可以找出来~
|
|