鱼C论坛

 找回密码
 立即注册
查看: 2281|回复: 5

汇编实验4

[复制链接]
发表于 2012-5-7 12:25:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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,[bx]
     mov es:[bx],al
     inc bx
     loop s

     mov ax,4c00h
     int 21h
code ends
end
这里18和code 是填空题 杂个CX 是18呢?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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验证结果正确
QQ截图20130119140623.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-20 17:28:29 | 显示全部楼层
其实是这样的
你可以看到使用的loop循环
那么loop循环中实现的结果为 单字节复制
那么就引出一个问题
在 “    mov ax,4c00h”之前有多少个字节 就是CX的值
而第一个空更是不用说了
如果把代码复制走的话总要知道这段代码在哪吧

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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,[bx]
     mov es:[bx],al
     inc bx
     loop s
loopend:nop
     mov ax,4c00h
     int 21h
code endsend


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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位,等出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-23 14:41:42 | 显示全部楼层
昏迷.... 不知楼主理解木有 同求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 22:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表