空手套小白狼 发表于 2012-5-7 12:25:56

汇编实验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-20 11:55:29

本帖最后由 s0512 于 2013-1-23 20:18 编辑

   我的理解是:当程序加载到内存,CX默认存放程序的字节数。所以,
CX=CX-掉MOV AX,4C00 后的指令字节数就是正确答案!!
因为调试器的关系(TD加载后CX为0),代码MOV改成了ADD。ADD CX,1验证结果正确

HelloWorld123 发表于 2013-1-20 17:28:29

其实是这样的
你可以看到使用的loop循环
那么loop循环中实现的结果为 单字节复制
那么就引出一个问题
在 “    mov ax,4c00h”之前有多少个字节 就是CX的值
而第一个空更是不用说了
如果把代码复制走的话总要知道这段代码在哪吧

HelloWorld123 发表于 2013-1-20 17:32:38

本帖最后由 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:20:59

本帖最后由 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位,等出结果

好多鱼^^ 发表于 2013-1-23 14:41:42

昏迷.... 不知楼主理解木有 同求
页: [1]
查看完整版本: 汇编实验4