首页
社区
课程
招聘
[已解决]汇编作业,求思路
发表于: 2008-10-29 13:13 4482

[已解决]汇编作业,求思路

2008-10-29 13:13
4482
  


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

assume  cs:code
code  segment
   mov ax,___
   mov ds,ax
   mov ax,0020h
   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

提示:
1)复制的是什么,从哪里到哪里?
2)复制的是什么,有多少个字节,如何知道复制的字节数量?


求解题思路,答案在下面,非原配套答案,为网上网友收集的答案

高手们可以把答案翻译看看,我是没看懂答案在写什么   

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

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

提示:
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)


以上为答案,我看不懂

我应该怎么去想这个问题,那个填code是为什么,具体值是什么呢
2008-10-29 13:17
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
忘了说,稍微有点长,能看完的都谢谢你了
2008-10-29 13:19
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
1.这段程序并不长。逆向工作者经常需要阅读成千上万行的汇编指令。

2.本论坛不帮人做作业。
2008-10-29 13:23
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
严格来说不是作业

答案都摆那了

主要是想知道怎么来的
2008-10-29 13:37
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1.因为题目的要求是把代码段内的指令当作数据,复制到目的地址。

不是说了么,所以第一个空填code
2008-10-29 13:57
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
答案已经说的很清楚了
2008-10-29 14:52
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
太感谢icersg了,你已经不止一次的帮助我了

事实上刚开始我以为mov ax,code无法编译通过

然后自己测试编译连接,"果然"过不去,然后就匆匆发帖求助了

事后检查发现纯属操作失误导致其生成文件在其他文件夹,而误以为编译无法通过

之所以第一个空填code

是因为之前assume cs:code

假设CS为code了,类似于后面的S:loop s
2008-10-29 14:59
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不客气,共同进步~
2008-10-29 18:02
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
10
不好意思,语气有点问题。向你道歉。

主要是我一看标题,就以为是问作业呢。

既然已经明白了,我也不多说了。
代码自搬移和重定位在底层的汇编语言中经常用到的,所以看到要移动代码,马上就应该想到让数据段与代码段重合。

在MBR,或其它特别在意代码密度的地方,常用push cs; pop ds这样的指令对来

这两条指令都是单字节指令,而使用AX寄存器的两条指令都是双字节。对于只有512字节的MBR来说,能少一个字节是一个字节。

有兴趣可以看一下FreeBSD的boot0.s,此MBR代码可谓最精彩的程序之一了。

感谢天才程序员Robert Nordier给我们带来如此精彩的代码。
2008-10-29 19:05
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
11
以以前的纯DOS而言,这一题有可能崩掉系统
2008-10-29 19:21
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼上说的没错!
2008-10-29 19:53
0
雪    币: 210
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
哥们是不是看王爽的汇编?
那个code直接引用就是指程序的首地址啊
你要复制之前的程序不得找到那个地址才能复制嘛
小弟不才,不知道对不对
2008-10-30 15:48
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
哇,,高手啊 。。不知到第二个空有没有更好的方法,想来想去,可以改一条语句,
将MOV CX,__ 改成sub cx,5H
但还是不够好,还得计算 Mov ax,40ccH int 21H 这两条语句占的字节数。。。。
不知道高手有没有更智能的方法啊???

拜谢!!!!
2010-11-9 00:02
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
见识了 都是大牛啊
2010-11-9 02:41
0
游客
登录 | 注册 方可回帖
返回
//