鱼C论坛

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

实验4第三题的疑惑

[复制链接]
发表于 2011-5-2 14:15:56 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 loop 于 2011-5-29 23:41 编辑

3) 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
  1. assume cs:code

  2. code segment

  3.      mov ax,[u]code[/u]  ;code为所填写的数据

  4.      mov ds,ax

  5.      mov ax,0020h

  6.      mov es,ax



  7.      mov bx,0

  8.      mov cx,18h   ;18h为所填写的数据

  9. s:   mov al,[bx]

  10.      mov es:[bx],al

  11.      inc bx

  12.      loop s



  13.      mov ax,4c00h

  14.      int 21h

  15. code ends

  16. end
复制代码
提示:
1.因为题目的要求是把代码段内的指令当作数据,复制到目的地址。所以,源数据段ds和代码段cs相同,通过 mov ax,code/mov ds,ax ('/'符号是指两条指令的分隔)来设置源数据段。
2.可以先假设要复制8位[1h~0ffh]数据(因为我们肉眼就可以看出此程序的长度不可能大于0ffh个字节)的字节数(如:10h),把程序补全,以便通过编译。这时我们以准确的第一空所填内容code与假想的第二空内容10h将程序补充完整并将其编译、连接、运行,接着进行DEBUG,在DEBUG时我们可用R命令查看CX的值,这时我们可以看到CX的值为1D,由此我们可以算出该程序的长度[1Dh-5h]=18h,之所以减5是为了满足题目的要求(因为mov ax,4c00h/int 21h这两条指令的长度等于5)

请问:
mov ax,code  ;code为所填写的数据
这句代码是什么意思
另外
.因为题目的要求是把代码段内的指令当作数据 这个是小甲鱼老是的解答
(3)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。   这个是原问题
我怎么看不出是题目要求把代码段内的指令当作数据??
程序的长度[1Dh-5h]=18h,之所以减5是为了满足题目的要求(因为mov ax,4c00h/int 21h这两条指令的长度等于5) 这里也没搞明白,为什么等于18h

请帮忙解释下,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-2 18:59:12 | 显示全部楼层
:funk:
楼主。谨记。内存是从0开始数的。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-2 21:44:05 | 显示全部楼层
我也没搞懂 ,等待求解……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-2 21:46:35 | 显示全部楼层
  刚刚在其他帖子中看到的解释:
mov ax,code  ;把代码段地址传送到ax中
  mov ds,ax      ;把代码段的地址传给数据段
也就是让数据段和代码段处于同一段

也不是很懂,继续等待……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-2 23:21:50 | 显示全部楼层
具体的代码我不发了!针对你的这个疑问:我怎么看不出是题目要求把代码段内的指令当作数据??
不是题目要求你把它看成是数据!题目要你把MOV AX,4C00H 代码之上的所有代码复制到指定地点 这些代码在内存中就是数据 所以在复制的时候我们不必管他是什么 他就是数据 所以复制的时候只要给出这些数据的内存单元地址 例:mov ax,ds:[0]  就是把程序入口的第一条指令送给AX 再由MOV 指令把AX中的内容送入指定内存单元里面去 如此循环 至于循环多少次 就是说 MOV AX,4C00H 前面的代码占有多少个内存单元 这个大小可以在DEBUG中自己想办法解决的 这里不讲了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-2 23:39:16 | 显示全部楼层
呃!我还是打上代码 和代码一起解释:
assume cs:code
code segment
mov ax,code   ;这里把代码段的段地址送给AX 也就是程序的入口CS:IP的CS
mov ds,ax       ;这里就是把数据段的段地址定为AX=CODE=CS
mov ax,0020h
mov es,ax ;这里为了以后做准备(要把mov ax,4c00h前的代码(数据啦)复制到0:200)
mov bx,0  ;这个其实是来做偏移地址的,后面就知道了
mov cx,___ ;这里填多少?其实有个麻烦办法 你现在这里随便填个数据然后编译连接 用DEBUG加载 在去查看 程序入口 和 MOV AX,4C00H 这两条指令的地址你就知道有多大了 就是循环多少次了 比较麻烦 知道简便方法的说声 只能用到这五章的知识不用越后
s:mov al,[bx]  ;bx的作用来了 就是把 DS:[BX]中的内容送给al  此时DS=CS BX=0 大家都知道了吧!
mov es:[bx],al  ;es=0020h bx=0 就是把AL中的内容放到 00200内存单元里面去 al=ds:[bx]内存单元中的内容 看上面的那条指令你就知道了
inc bx ;使bx加1 这样就指向了下一个内存单元
loop s ;这个我不说了
mov ax,4c00h
int 21h ;这两条指令还有疑问 我也跳楼去了
code ends
end
可能我没有直接对你的问题回答 但相信你仔细看完 应该就能解答自己的疑问了 不能解答 也不要喷我哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-20 17:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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