[英]in-memory copying in assembly
首先,使用NASM,目标是x86,并在x86的16位实模式下运行。 我想将一个存储位置上的代码复制到另一个存储位置,然后对目标进行一次调用/跳转,因此我可以在那里执行代码。 该代码最初位于0x1000:0x0(段:偏移)。 现在,我想将其复制到0x3000:0x0。 代码的大小为512字节。 我正在尝试按照以下例程进行操作。
org 0x500
;The code to be copied is located at 0x1000:0x0. We want to copy it to 0x3000:0x0
copy:
mov esi,0x1000 ; source address of the code in DS:SI
mov edi,0x3000 ; destination address of the code in ES:DI
mov ecx,0x200 ; size of the code, 512 bytes (0x200)
rep movsb ; copy bytes from address in SI to address in DI.
jmp 0x3000:0x0 ; jump to the destination , and execute the code there.
要复制的代码仅打印一个字符串。 因此,如果上面的代码片段有效,我会在屏幕上看到该字符串。 另外,我已经验证了复制的代码可以正常工作,并且确实存在于0x1000:0x0处,因此没有犯任何明显/愚蠢的错误。 上面的例程由于某种原因而失败。 我认为可能的失败点可能是错误的地址。 我不确定在复制之前要在SI和DI中添加什么。 这些应该是偏移量还是实际地址? 文档没有明确说明。 另外,我应该明确初始化ES和DS吗?
我尝试了各种组合尝试使此工作奏效,但无济于事。 其中之一是:
org 0x500
;The code to be copied is located at 0x1000:0x0. We want to copy it to 0x3000:0x0
copy:
mov bx,0x1000
mov ds,bx ; set DS explicitly to 0x1000.
mov esi,0x0 ; source address of the code in DS:SI (0x1000:0x0)
mov bx,0x3000
mov es,bx ; set ES explicitly to 0x3000
mov edi,0x0 ; destination address of the code in ES:DI (0x3000:0x0)
mov ecx,0x200 ; size of the code, 512 bytes (0x200)
rep movsb ; copy bytes from address in SI to address in DI.
jmp 0x3000:0x0 ; jump to the destination , and execute the code there.
因此,在这里我明确设置了ES:DI和DS:SI。 这也没有用。 我还尝试将实际的物理地址提供给SI和DI,但失败了。 现在,我没有选择了。 我敢肯定在这里犯了一些概念上的内存寻址错误,但是我无法抓住它。 (是的,复制的代码为512字节,原始二进制)。
谢谢。
您确定复制的代码是独立于位置的,还是在地址0x3000而不是0x1000处正确的代码? 一些指令(如CALL和长JMP)是绝对的,其他指令(如短JMP)是相对于指令地址的。
只要发布的方向标记是清楚的(如果没有,请执行“ CLD”指令),并且只要您不浪费自己的堆栈或任何东西,您发布的第二段示例代码就应该起作用。
如果它不起作用(并且考虑到第一个示例太糟了),我很容易以为您在其他地方出错了(例如,可能是从错误的磁盘扇区将数据加载到了0x1000: 0x0000,则表示您正在正确复制错误的数据或其他内容)。
任何人可能给您的最佳建议是学习如何像Bochs仿真器中内置的调试器那样单步执行代码(并查看寄存器内容,设置断点,检查内存等)。
这个问题终于怪异地解决了。 好的,程序的前几行具有以下内容:
org 0x500
mov ax,cs
mov ds,ax
mov es,ax
接下来是复制例程。 我将代码编辑为此:(并且有效)
org 0x500
xor ax,ax ;make ax 0, instead of copying CS to it
mov ds,ax
mov es,ax
进行此更改后,我发布的第一个复印例程也起作用了。 我不知道为什么。 我只是玩弄这些细分值,然后单击了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.