鱼C论坛

 找回密码
 立即注册
查看: 2702|回复: 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 编辑
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的



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 编辑
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的



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-11-25 01:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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