繁体   English   中英

了解指针和汇编中的转换

[英]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 charint你可以看到,从指令名称本身:MOVéžERO扩展 YTE到L翁。

括号表示指针取消引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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