gpt4 book ai didi

linux - 汇编语言中的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:49 25 4
gpt4 key购买 nike

我想了解如何在汇编中使用指针。通过阅读有关内部的一些教程,我认为已经理解了一些概念。但是当我去尝试时,它确实起作用了。下面是一些将 C 翻译成 ASM 的尝试。

C

const char *s = "foo";
unsigned z = *(unsigned*)s;
if(!(z & 0xFF))
do_something();
if(!(z & 0xFFFF))
do_b_something();

(这里没有完整的代码,但它是一个单词检查,因此,还有两个stmts分别检查0xFF0000,0xF000000。

ASM:

mov ebp,str
mov eax,ebp

mov eax,[eax]
and eax,0xFF
cmp eax,0
je etc

mov eax,[eax]
and eax,0xFFFF
cmp eax,0
je etc

它返回一个段错误。

然后尝试:

mov eax,dword ptr [eax]

这是由 gcc 编译器生成的,您可以在其他一些汇编代码中看到它,返回

无效符号

在 FASM 汇编器上。 FASM 并不真正支持它,还是我遗漏了什么?

最佳答案

我想这就是你想要做的:

    mov  ebp,str
mov eax,ebp

mov ebx,[eax]
test ebx,0xFF
jz low_byte_empty

do_something:
; some code here...

low_byte_empty:
test ebx,0xFFFF
jz low_word_empty

do_b_something:
; some code here.

low_word_empty:

解释:

首先,正如 JasonD 在他的回答中已经提到的那样,您正在加载一个指向 eax 的指针,然后对其执行逻辑 and,然后您仍在使用结果在 eax 中寻址内存(0x0 ... 0xFF 范围内的一些内存偏移量)。

那么你的代码出了什么问题:你不能在同一个寄存器中同时保存一个指向内存地址的指针和一个值。所以我选择从[eax]加载值到ebx,你也可以使用其他一些32位的通用寄存器(ecxedx, esi, edi) 根据您的需要。

那么,你不需要使用cmp检查寄存器是否为空,因为所有 cmp 所做的就是执行减法和设置标志。但 ZF(零标志)已由 and 设置,所以 cmp 在这里是完全没有必要的。然后,因为这里不需要 cmp 并且我们也不需要结果,我们只想更新标志,最好使用 test . test 执行与 and 完全相同的逻辑 AND,唯一的区别是 test 不存储结果,它只更新标志。

关于linux - 汇编语言中的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14774298/

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