(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
试试看
象你说的,我的理解是:CX的值是不确定的,在 mov ax,4c00H 前加个标号,然后用
mov cx,标号-5
试试看
#4
我是随便写一个比 cx实际要大的 只要将全部的都复制上就行
#5
mark
#6
一空填CS
二空
1,先填个很小的数先生成EXE文件再DEBUG下,取mov ax,4cooh的IP值再次填上
2,直接干脆填s+8
二空
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段清下零。
估计是你先前填了一个很大的值,已将不要求复制的部分已复制过去了,你随即再将CX改小后复制,当你查看0020:0 20H时后面那部分是你上次复制过去留在那的。。。
验证办法:
1,可以先将CX填小点。
2,没次调试前把0020:0-20H段清下零。
#8
#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
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
这到好,老师叫你填空:6-2= ?,你却把题目改掉,改成:答:2+2= 1+3。
#12
那我改改喽
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
没事数字节数麻烦不,程序再大点或者后面再长点,就要用一个手指着机器码一个手按着计算器在那算了。。。
#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
试试看
象你说的,我的理解是:CX的值是不确定的,在 mov ax,4c00H 前加个标号,然后用
mov cx,标号-5
试试看
#4
我是随便写一个比 cx实际要大的 只要将全部的都复制上就行
#5
mark
#6
一空填CS
二空
1,先填个很小的数先生成EXE文件再DEBUG下,取mov ax,4cooh的IP值再次填上
2,直接干脆填s+8
二空
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段清下零。
估计是你先前填了一个很大的值,已将不要求复制的部分已复制过去了,你随即再将CX改小后复制,当你查看0020:0 20H时后面那部分是你上次复制过去留在那的。。。
验证办法:
1,可以先将CX填小点。
2,没次调试前把0020:0-20H段清下零。
#8
#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
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
这到好,老师叫你填空:6-2= ?,你却把题目改掉,改成:答:2+2= 1+3。
#12
那我改改喽
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
没事数字节数麻烦不,程序再大点或者后面再长点,就要用一个手指着机器码一个手按着计算器在那算了。。。