汇编实验4
3) 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。assume cs:code
code segment
mov ax, code ;code为所填写的数据
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx, 18h ;18h为所填写的数据
s: mov al,
mov es:,al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
这里18和code 是填空题 杂个CX 是18呢?
本帖最后由 s0512 于 2013-1-23 20:18 编辑
我的理解是:当程序加载到内存,CX默认存放程序的字节数。所以,
CX=CX-掉MOV AX,4C00 后的指令字节数就是正确答案!!
因为调试器的关系(TD加载后CX为0),代码MOV改成了ADD。ADD CX,1验证结果正确
其实是这样的
你可以看到使用的loop循环
那么loop循环中实现的结果为 单字节复制
那么就引出一个问题
在 “ mov ax,4c00h”之前有多少个字节 就是CX的值
而第一个空更是不用说了
如果把代码复制走的话总要知道这段代码在哪吧
本帖最后由 HelloWorld123 于 2013-1-20 21:46 编辑
代码这样改的话你应该理解了吧
cx的值就是 loopend 到 start的 字节数
assume cs:code
code segment
start: mov ax,code
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,offset loopend - offset start
s: mov al,
mov es:,al
inc bx
loop s
loopend:nop
mov ax,4c00h
int 21h
code endsend
本帖最后由 NGtailang 于 2013-1-23 10:22 编辑
mov cx,?:(18h)
这个18 ,楼主可以这样理解。
cx后面填的都是数字,但是首先我们不知道程序要复制多长
所以我们可以用0来代替,先把程序编译,连接,运行后。
-r 后可以看出程序的总长度,因为cx是存放代码长度的,cx=23,哪章讲过忘记了。
程序复制的是从 mov ax,code 开始到 loop s结束,长度为cx中数据减去最后两个语句的长度,由-u 可以看出最后两个长度为5字节,所以cx=23h-5h=18h,dos默认为16位,等出结果
昏迷.... 不知楼主理解木有 同求
页:
[1]