汇编语言如何比较空字符

assembly language how to compare to null character

我正在从输入字符串中一个字符一个字符地读取,交换字符的半字节,然后复制到输出字符串。所以我需要一个条件来结束循环:我的结束条件是如果我得到一个 NULL 字符(存储在 rdi 中),这意味着我已经到达输入字符串的末尾并退出循环。以下是我的实现,但我在“cmpq 0x00,%rdi”这一行遇到分段错误。

注意: r12 是输入字符串,r11 是字符串的索引,rdi 是函数“swap”的第一个输入参数,如果 rdi 是 NULL 字符,这意味着输入字符串中没有更多字符,我退出循环并执行不调用交换。

loop:
     movq (%r12, %r11, 1) %rdi
     
     cmpq 0x00, %rdi --> this is causing segmentation fault, why?
     je exit

     call swap

     ...

jmp loop

exit:
    leave
    ret

谁能告诉我为什么 cmpq 0x00, %rdi 会导致分段错误?如何检查字符是否为 NULL?我以为 0x00 表示空字符?

在 AT&T 语法中,一个朴素的数字指的是一个 地址 。您正在将 %rdi 与从地址 0x0 获取的值进行比较,即您正在取消引用空指针。

如果您想要立即数,请使用 $cmpq [=14=]x0, %rdi

但是,如果您要查找空 字符(即零字节),您的代码就没有意义,因为您正在加载和比较 8 字节的 qword (%rdi 是一个 64 位寄存器)。如果你想要一个字节,使用一个 8 位寄存器。如果你喜欢 %rdi,它的低 8 位是寄存器 %dil,但也许你更喜欢 %al 这样的东西。所以:

movb (%r12, %r11, 1), %al
cmpb [=10=]x00, %al
je exit