能力值:
( 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是为什么,具体值是什么呢
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
忘了说,稍微有点长,能看完的都谢谢你了
|
能力值:
(RANK:260 )
|
-
-
4 楼
1.这段程序并不长。逆向工作者经常需要阅读成千上万行的汇编指令。
2.本论坛不帮人做作业。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
严格来说不是作业
答案都摆那了
主要是想知道怎么来的
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
1.因为题目的要求是把代码段内的指令当作数据,复制到目的地址。
不是说了么,所以第一个空填code
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
答案已经说的很清楚了
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
太感谢icersg了,你已经不止一次的帮助我了
事实上刚开始我以为mov ax,code无法编译通过
然后自己测试编译连接,"果然"过不去,然后就匆匆发帖求助了
事后检查发现纯属操作失误导致其生成文件在其他文件夹,而误以为编译无法通过
之所以第一个空填code
是因为之前assume cs:code
假设CS为code了,类似于后面的S:跟loop s
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
不客气,共同进步~
|
能力值:
(RANK:260 )
|
-
-
10 楼
不好意思,语气有点问题。向你道歉。
主要是我一看标题,就以为是问作业呢。
既然已经明白了,我也不多说了。
代码自搬移和重定位在底层的汇编语言中经常用到的,所以看到要移动代码,马上就应该想到让数据段与代码段重合。
在MBR,或其它特别在意代码密度的地方,常用push cs; pop ds这样的指令对来
这两条指令都是单字节指令,而使用AX寄存器的两条指令都是双字节。对于只有512字节的MBR来说,能少一个字节是一个字节。
有兴趣可以看一下FreeBSD的boot0.s,此MBR代码可谓最精彩的程序之一了。
感谢天才程序员Robert Nordier给我们带来如此精彩的代码。
|
能力值:
( LV9,RANK:180 )
|
-
-
11 楼
以以前的纯DOS而言,这一题有可能崩掉系统
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
楼上说的没错!
|
能力值:
( LV3,RANK:20 )
|
-
-
13 楼
哥们是不是看王爽的汇编?
那个code直接引用就是指程序的首地址啊
你要复制之前的程序不得找到那个地址才能复制嘛
小弟不才,不知道对不对
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
哇,,高手啊 。。不知到第二个空有没有更好的方法,想来想去,可以改一条语句,
将MOV CX,__ 改成sub cx,5H
但还是不够好,还得计算 Mov ax,40ccH int 21H 这两条语句占的字节数。。。。
不知道高手有没有更智能的方法啊???
拜谢!!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
见识了 都是大牛啊
|
|
|