gpt4 book ai didi

c - 如何将 Turbo-C 远指针分配和取消引用转换为 x86 程序集?

转载 作者:太空宇宙 更新时间:2023-11-04 05:47:45 25 4
gpt4 key购买 nike

我要进行汇编测试,我有一个关于汇编指针的问题。我正在尝试做一个练习,但我无法解决它。

考虑 C 中的语句:

int x=100, y=200;
int far *ptx;
int far *pty;

假设指令已经执行:

ptx=&x;
pty=(int *)malloc(sizeof(int));

我的问题是如何在汇编中对以下几点进行编码:

  1. ptx=pty
  2. *ptx=*pty

最佳答案

这些声明应该在全局范围内吗?如果是这样,C 变量的静态存储上将有 asm 标签。如果不是(函数内的局部变量),它们将在堆栈上并且 IDK 他们希望您如何知道它们将位于 BP 的偏移量。

无论哪种方式,它们都是 32 位 seg:off(little-endian,因此在低 16 位中偏移)远指针,因此将一个复制到另一个只是一个 4 字节的副本,您可以使用 2 个整数加载 +商店。

指针变量(当它们没有优化掉或进入寄存器时)将指针值本身存储在内存中,就像intlong。在 C 中,当您执行 *pty 时,编译器必须将指针值加载到寄存器中,然后再次加载指向的内存。


我假设 DS 指的是指针值本身存储在内存中的数据段。并且 sizeof(int)=2,因为对于 16 位 C 实现来说这似乎很可能。

要解引用并加载pty指向的内存,即*pty,您需要将部分指针的段部分加载到段寄存器中,并且将偏移部分放入 SI、DI 或 BX(可用作寻址模式一部分的寄存器)。 x86 对此有说明,例如 les / lds .

因为我们可能不想修改 DS,所以我将只使用 ES。 (不同的汇编程序对段覆盖使用不同的语法,例如 NASM 的 [es: di] 但我认为 TASM 可能是 es:[di]。)

;; *ptx = *pty
;; clobbers: ES, DI, and AX
; load *pty
les di, [pty] ; load pty from [DS:pty] into ES:DI
mov ax, es:[di] ; load *pty into AX

; store *ptx
les di, [ptx] ; load ptx from [DS:ptx] into ES:DI
stosw ; store to *ptx from AX

STOSW将 AX 存储到 ES:DI 并根据方向标志 DF 递增或递减 DI。我们不关心此指令运行后 DI 的值,但 Turbo C++ 的标准调用约定(和现代 x86 约定)表示 DF=0(向上递增) 在函数进入/退出时。

如果您还没有了解字符串指令,请使用普通的 mov 和另一个段覆盖。

(@MichaelPetch 说 DS 通常在 16 位实模式调用约定中保留调用,但是 ES 可以 在不保存/恢复它的情况下自由破坏,所以显然我猜对了。)


或者,如果您可以破坏 DS 和 ES,则可以使用 MOVSW。在这附近使用 push/pop ds 来保存/恢复会是更多指令。 (但代码量仍然更小)

;; assuming DS is correct for referencing static data like [pty]
les di, [pty] ; load pty from [DS:pty] into ES:DI
lds si, [ptx] ; load ptx from [DS:ptx] into DS:SI
movsw ; copy a word from [DS:SI] to [ES:DI]

请注意,我在第二个地方使用了 lds,因为我假设静态存储中的两个全局变量都可以通过 DS 的传入值访问,任何段值都不是另一个远指针的一部分。

如果你有一个“巨大”或“大”内存模型(或其他模型,其中已知并非所有静态数据都适合一个 64k 段),这会更复杂,但你的问题没有显示任何关于ptxpty 实际存储的位置。


此外,我假设您不应该根据它们最近的分配方式优化它们,即使问题向您展示了它们指向的内容。

如果你知道ptx = &x,那么你不需要从内存中加载ptx,你可以直接mov [x], ax code>(再次假设一个代码模型,其中像 x 这样的静态数据可以通过 DS 访问)。

此外,当 *pty 指向新的 malloced 存储时,读取它没有什么意义,因为它是未初始化的。另一种方式是有道理的。我可能分析过度了。

关于c - 如何将 Turbo-C 远指针分配和取消引用转换为 x86 程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55954071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com