微笑向暖~ 发表于 2017-10-16 22:03:11

这个题都有点看不懂,大家给看看

下面的程序的功能是将“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

求个详细解读过程

丶忘却的年少o 发表于 2017-10-16 22:44:19

首先既然是移动,肯定有起始地址和目标地址
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 22:57:57

本帖最后由 兰陵月 于 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-17 14:16:46

兰陵月 发表于 2017-10-16 22:57
我无语这个编辑器了,从notepad++里出来,就变成这个排版了

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

你这个也太详细了,有些东西还是自己操作才能理解

兰陵月 发表于 2017-10-17 14:37:41

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

{:5_109:}{:5_109:}{:5_109:}

楼主应该是刚刚开始学习汇编,可能会需要~

微笑向暖~ 发表于 2017-10-17 16:48:32

兰陵月 发表于 2017-10-16 22:57
我无语这个编辑器了,从notepad++里出来,就变成这个排版了

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

首先非常感谢你,虽然我还是看不懂,但是我会慢慢去理解的,感谢感谢!!!

weizhongyang 发表于 2017-10-17 17:02:21

{:5_106:}

兰陵月 发表于 2017-10-17 23:58:17

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

{:10_258:}{:10_258:}
页: [1]
查看完整版本: 这个题都有点看不懂,大家给看看