繁体   English   中英

组装中的内存中复制

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM