![](/img/trans.png)
[英]C Pointers, Casting, Pointer to a pointer to a function, help understanding complex pointers
[英]understanding pointers and casting in assembly
在汇编中给了我一个函数,该函数基本上将大写字母转换为小写字母。 这是一些组装,
Q1:
pushq %rbp
movq %rsp, %rbp
subq $24, %rsp
movq %rdi, -24(%rbp)
movl $0, -4(%rbp)
movl $0. -8%(%rbp)
jmp .L2
L2:
movl -4(%rbp) %edx
movq -24(%rbp), %rax
addq %rdx, %rax
movzbl (%rax), %eax
testb %al, %al
jne .L4
...
其余大部分都是重复性的,但是L2确实让我感到困惑。 到目前为止,这是我的逻辑:我们将param1存储到-24(%rbp)中。 我们创建local1和local2,将它们都设置为0,然后跳转到L2。 我将local1移至%edx,将param1移至%rax。 现在,这让我感到困惑,我被告知下一行,addq最终以local1作为指向param1的指针。 我只是推断添加local1 + param1并将它们存储到%rax中。 那怎么可能?
接下来是movzbl。 据我了解,我们取消了%rax的引用,因此我们得到了eax =(int)rax之类的东西。
还告诉我将其视为将char转换为int。 哪一个是正确的,我怎么知道我正在打字? 如果%rax周围没有括号怎么办? 它是一个int整数,因为它是4个字节,%eax是一个32位寄存器。 预先感谢您的帮助,我有点迷失了。
local1
不是指针,而是索引(计数器)。 该代码正在执行以下操作:
void toupper(char* text)
{
int i = 0; /* at rbp-4 */
int j = 0; /* unused, at rbp-8 */
int ch; /* in eax */
while((ch = *(text + i)) != 0)
{
...
}
}
请注意,在C指针算术中, *(text + i)
当然等效于text[i]
。
是的, movzbl
正在将一个unsigned char
到int
你可以看到,从指令名称本身:MOVéžERO扩展乙 YTE到L翁。
括号表示指针取消引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.