王爽《汇编语言》第五章实验四的疑问

时间:2022-10-31 00:42:48
王爽《汇编语言》第五章实验四

(3)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。  
assume cs:code  
code segment  
mov ax, —— 1
mov ds,ax  
mov ax,0020h  
move es,ax  
mov bx,0  
mov cx, —— 2
s:mov al,[bx]  
move s:[bx],al  
inc bx  
loop s  
mov ax,4cooh  
int 21h  
code ends  
end  

分析:此段程序的功能是复制部分自身。 
    第一个横线处没什么疑问,填cs,即元数据的地址来自代码段。 
    第二个横线处认为将mov cx, cx改为sub cx,5较合理,但在虚拟8086模式下直接运行程序,再进入debug察看0020:00~0020:1b段内存空间内容时显示其结果仍然是全盘复制,为什么? 

13 个解决方案

#1


请楼主参考一下吧:http://topic.csdn.net/u/20090329/07/418e26a4-91b6-4ef3-98b9-6c69045f7d93.html

#2


用debug的T命令就不会出现问题,但问题是直接执行程序的话,mov cx,cx跟sub cx,5是相同的结果,?

#3


这个题第二问我是随便写的一个数,然后用U 命令查看,找到偏移地址后退出---改的。

象你说的,我的理解是:CX的值是不确定的,在 mov ax,4c00H 前加个标号,然后用

mov cx,标号-5  

试试看

#4


我是随便写一个比 cx实际要大的  只要将全部的都复制上就行

#5


mark

#6


一空填CS
二空
1,先填个很小的数先生成EXE文件再DEBUG下,取mov ax,4cooh的IP值再次填上
2,直接干脆填s+8

#7


LZ说: 改为sub cx,5。。。仍然是全盘复制。。。
估计是你先前填了一个很大的值,已将不要求复制的部分已复制过去了,你随即再将CX改小后复制,当你查看0020:0  20H时后面那部分是你上次复制过去留在那的。。。
验证办法:
1,可以先将CX填小点。
2,没次调试前把0020:0-20H段清下零。

#8


该回复于2009-09-28 09:36:42被版主删除

#9


assume cs:codesg 
codesg segment 
mov ax,cs
mov ds,ax 
mov ax,20h 
mov es,ax 
mov bx,0 
sub cx,5  (cx本身就是程序的长度,mov ax,4c00h,int 21h这两句长度是5,于是cx减去5就可以了) 
s: mov al,[bx] 
mov es:[bx],al 
inc bx 
loop s 
mov ax,4c00h 
int 21h 
codesg ends 
end

#10


mov cx, cx将mov ax,4c00h和int 21h 都复制进去了

#11


引用 9 楼 tinyparticle 的回复:
 
 sub cx,5  (cx本身就是程序的长度,mov ax,4c00h,int 21h这两句长度是5,于是cx减去5就可以了)


这到好,老师叫你填空:6-2= ,你却把题目改掉,改成:答:2+2= 1+3

#12


引用 11 楼 nanlingcg 的回复:
引用 9 楼 tinyparticle 的回复:

sub cx,5  (cx本身就是程序的长度,mov ax,4c00h,int 21h这两句长度是5,于是cx减去5就可以了)



这到好,老师叫你填空:6-2=?,你却把题目改掉,改成:答:2+2=1+3。

那我改改喽
mov cx,___这个空用0代替(因为无论如何cx都占2个字节,以后再把0替换过来),也就是mov cx,0。 
然后编译连接代码,生成.exe程序放到debug中。再-r,就可以看到cx中的取值(cx中存放的是这个.exe程序的总字节数
但是应该去掉mov ax,4c00h(对应机器码B8004C)和int 21h(对应机器码CD21)两句代码所占的字节数,总共五个字节,所以应该是28-5=23,转换成十六进制就是17h。
然后重新编辑源程序,把mov cx,0替换成mov cx,17h就行了。 

#13


引用 12 楼 tinyparticle 的回复:
引用 11 楼 nanlingcg 的回复:
 引用 9 楼 tinyparticle 的回复:

 sub cx,5  (cx本身就是程序的长度,mov ax,4c00h,int 21h这两句长度是5,于是cx减去5就可以了)


 这到好,老师叫你填空:6-2=?,你却把题目改掉,改成:答:2+2=1+3。


 那我改改喽
 mov cx,___这个空用0代替(因为无论如何cx都占2个字节,以后再把0替换过来),也就是mov cx,0。
 然后编译连接代码,生成.exe程序放到debug中。再-r,就可以看到cx中的取值(cx中存放的是这个.exe程序的总字节数
 但是应该去掉mov ax,4c00h(对应机器码B8004C)和int 21h(对应机器码CD21)两句代码所占的字节数,总共五个字节,所以应该是28-5=23,转换成十六进制就是17h。
 然后重新编辑源程序,把mov cx,0替换成mov cx,17h就行了。

没事数字节数麻烦不,程序再大点或者后面再长点,就要用一个手指着机器码一个手按着计算器在那算了。。。

#1


请楼主参考一下吧:http://topic.csdn.net/u/20090329/07/418e26a4-91b6-4ef3-98b9-6c69045f7d93.html

#2


用debug的T命令就不会出现问题,但问题是直接执行程序的话,mov cx,cx跟sub cx,5是相同的结果,?

#3


这个题第二问我是随便写的一个数,然后用U 命令查看,找到偏移地址后退出---改的。

象你说的,我的理解是:CX的值是不确定的,在 mov ax,4c00H 前加个标号,然后用

mov cx,标号-5  

试试看

#4


我是随便写一个比 cx实际要大的  只要将全部的都复制上就行

#5


mark

#6


一空填CS
二空
1,先填个很小的数先生成EXE文件再DEBUG下,取mov ax,4cooh的IP值再次填上
2,直接干脆填s+8

#7


LZ说: 改为sub cx,5。。。仍然是全盘复制。。。
估计是你先前填了一个很大的值,已将不要求复制的部分已复制过去了,你随即再将CX改小后复制,当你查看0020:0  20H时后面那部分是你上次复制过去留在那的。。。
验证办法:
1,可以先将CX填小点。
2,没次调试前把0020:0-20H段清下零。

#8


该回复于2009-09-28 09:36:42被版主删除

#9


assume cs:codesg 
codesg segment 
mov ax,cs
mov ds,ax 
mov ax,20h 
mov es,ax 
mov bx,0 
sub cx,5  (cx本身就是程序的长度,mov ax,4c00h,int 21h这两句长度是5,于是cx减去5就可以了) 
s: mov al,[bx] 
mov es:[bx],al 
inc bx 
loop s 
mov ax,4c00h 
int 21h 
codesg ends 
end

#10


mov cx, cx将mov ax,4c00h和int 21h 都复制进去了

#11


引用 9 楼 tinyparticle 的回复:
 
 sub cx,5  (cx本身就是程序的长度,mov ax,4c00h,int 21h这两句长度是5,于是cx减去5就可以了)


这到好,老师叫你填空:6-2= ,你却把题目改掉,改成:答:2+2= 1+3

#12


引用 11 楼 nanlingcg 的回复:
引用 9 楼 tinyparticle 的回复:

sub cx,5  (cx本身就是程序的长度,mov ax,4c00h,int 21h这两句长度是5,于是cx减去5就可以了)



这到好,老师叫你填空:6-2=?,你却把题目改掉,改成:答:2+2=1+3。

那我改改喽
mov cx,___这个空用0代替(因为无论如何cx都占2个字节,以后再把0替换过来),也就是mov cx,0。 
然后编译连接代码,生成.exe程序放到debug中。再-r,就可以看到cx中的取值(cx中存放的是这个.exe程序的总字节数
但是应该去掉mov ax,4c00h(对应机器码B8004C)和int 21h(对应机器码CD21)两句代码所占的字节数,总共五个字节,所以应该是28-5=23,转换成十六进制就是17h。
然后重新编辑源程序,把mov cx,0替换成mov cx,17h就行了。 

#13


引用 12 楼 tinyparticle 的回复:
引用 11 楼 nanlingcg 的回复:
 引用 9 楼 tinyparticle 的回复:

 sub cx,5  (cx本身就是程序的长度,mov ax,4c00h,int 21h这两句长度是5,于是cx减去5就可以了)


 这到好,老师叫你填空:6-2=?,你却把题目改掉,改成:答:2+2=1+3。


 那我改改喽
 mov cx,___这个空用0代替(因为无论如何cx都占2个字节,以后再把0替换过来),也就是mov cx,0。
 然后编译连接代码,生成.exe程序放到debug中。再-r,就可以看到cx中的取值(cx中存放的是这个.exe程序的总字节数
 但是应该去掉mov ax,4c00h(对应机器码B8004C)和int 21h(对应机器码CD21)两句代码所占的字节数,总共五个字节,所以应该是28-5=23,转换成十六进制就是17h。
 然后重新编辑源程序,把mov cx,0替换成mov cx,17h就行了。

没事数字节数麻烦不,程序再大点或者后面再长点,就要用一个手指着机器码一个手按着计算器在那算了。。。