下面的程序的功能是将“mov ax,4c00h“之前的指令复制倒内存0:200处,补全程序。上机调试,追踪运行结果。
assume cs:code
code segment
mov ax,()
mov ds,ax
mov ax,0200h
mov es,ax
mov bx,0
mov cx,()
s:
mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
()内为要填数据,第一个填的是code,第二个就不解了。
答案给出的解释是:可以先假设要复制8位[1h~0ffh]数据(因为我们肉眼就可以看出此程序的长度不可能大于0ffh个字节)的字节数(如:10h),把程序补全,以便通过编译。这时我们以准确的第一空所填内容code与假想的第二空内容10h将程序补充完整并将其编译、连接、运行,接着进行DEBUG,在DEBUG时我们可用R命令查看CX的值,这时我们可以看到CX的值为1D,由此我们可以算出该程序的长度[1Dh-5h]=18h,之所以减5是为了满足题目的要求(因为mov ax,4c00h/int 21h这两条指令的长度等于5)
可是为什么用DEBUG后,CX会变成1Dh呢,为什么这便是全部代码的长度了呢?这个小弟实在费解,请各位大虾不吝赐教!!
------解决方案--------------------------------------------------------
Start Stop Length Name
00000H 0001CH 0001DH CODE ;从生成的映像文件中可以看出1D是CODE的长度。
提示:(1)复制的是什么?从哪里到哪里?(2)复制的是什么?有多少个字节?读者如何知道要复制的字节的数量?;略
这是《汇编语言》里的,问一下应该复制多少字节?答:复制24个字节,因为18H=24D。
------解决方案--------------------------------------------------------
mov ax, code再mov dx, ax,是让代码段与数据段重合。
mov cx,长度可以用两段想减的方法
------解决方案--------------------------------------------------------
code segment
assume cs:code
start:
mov ax, cs
mov ds, ax
mov ax, 0200h
mov es, ax
mov bx, 0
mov cx, offset endstart ;;;;;;;;;;;
sub cx, offset start ;;;;;;;;;;;;;;;;;;
s:
mov al, [bx]
mov es:[bx],al
inc bx
loop s
endstart:
mov ax,4c00h
int 21h
code ends
end start
------解决方案--------------------------------------------------------
这题目出的有问题。0:200是中断向量表的一部分,覆盖了可能会出问题,根据mov ax,0200h、mov es,ax这两条指令来看应该是复制到200:0。
cx应该是要复制代码的长度,但程序中没有定义对应的标号,所以只能是自己计算或者大概估计代码的长度。
------解决方案--------------------------------------------------------
to LS,因为4CH功能的al是程序的返回值,返回0表示程序执行成功,mov ax, 4c00h、int 21h只是一个习惯。