汇编语言如何与null字符进行比较



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

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

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 $0x0, %rdi

但是,如果您正在寻找一个null字符(即零字节(,则您的代码没有意义,因为您正在加载和比较一个8字节的qword(%rdi是一个64位寄存器(。如果需要单个字节,请使用8位寄存器。如果你喜欢%rdi,它的低8位是寄存器%dil,但也许你想要%al之类的东西。因此:

movb (%r12, %r11, 1), %al
cmpb $0x00, %al
je exit

最新更新