汇编语言如何比较空字符
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
我正在从输入字符串中一个字符一个字符地读取,交换字符的半字节,然后复制到输出字符串。所以我需要一个条件来结束循环:我的结束条件是如果我得到一个 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