String 从字符串程序集x86_64获取单个字符
首先是一点背景知识:我使用带有AT&T语法的x86_64汇编,并使用GCC编译器进行编译。 我已经做了几个星期的装配工作,但这个极其简单的问题让我完全难倒了: 我只想访问字符串中的单个字符。在我所知道的任何其他语言中,这都仅仅是这样做的问题(C++): 我知道字符串只是字符数组,所以我尝试这样做:String 从字符串程序集x86_64获取单个字符,string,assembly,character,x86-64,String,Assembly,Character,X86 64,首先是一点背景知识:我使用带有AT&T语法的x86_64汇编,并使用GCC编译器进行编译。 我已经做了几个星期的装配工作,但这个极其简单的问题让我完全难倒了: 我只想访问字符串中的单个字符。在我所知道的任何其他语言中,这都仅仅是这样做的问题(C++): 我知道字符串只是字符数组,所以我尝试这样做: .text testString: .asciz "ABCDEFG" .global main main: pushq %rbp movq %rsp, %rbp leaq
.text
testString: .asciz "ABCDEFG"
.global main
main:
pushq %rbp
movq %rsp, %rbp
leaq testString, %rbx
addq $1, %rbx
movq %rbx, %rdi
movq $0, %rax
call printf
movq $0, %rdi
call exit
我将字符串的地址放入RBX并递增。但是,因为RBX的值只是指向字符串开头的指针,所以当我增加它时,我只得到指向字符串第二个字符的指针。因此,我的输出非常简单
BCDEFG
我试过谷歌、youtube、Quora等等,但我似乎找不到这个看似愚蠢的问题的简单答案。
那么:如何从字符串中获取字符的实际值,以便在代码中使用它呢
提前多谢!
-Vlad是的,这是正确的,这正是C代码在编写
printf(testString+1)之后所做的代码>。您在rbx
中有地址,然后可以加载该字符并对其执行任何操作。不幸的是,您尚未指定所需的内容,但它可以像movb(%rbx),%al
一样简单。显然,如果您不想弄乱指针,也可以将其写成movbteststring+1,%al
。注:请注意,这当然不是testString[0]
,而是testString[1]
。非常感谢!这似乎奏效了。最后一个问题:试图将此值移出%al
并移到大型寄存器(如%rsi
)中会出现分段错误。我尝试使用movzx%al,%rsi
将其归零,以将其扩展到正确的大小,但这似乎没有帮助。我正在尝试将其移动到%RSI,以便可以使用printfprintf
打印它,它需要一个指向字符串的指针。你不能向它传递字符。您已尝试执行printf((char*)testString[1])代码>在C中也会崩溃。要打印字符,您可以将其转换为字符串,或者使用格式字符串,如%c“
,并将字符作为附加参数传递。显然,您也可以使用putchar
而不是printf
。
BCDEFG