String 从字符串程序集x86_64获取单个字符

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

首先是一点背景知识:我使用带有AT&T语法的x86_64汇编,并使用GCC编译器进行编译。 我已经做了几个星期的装配工作,但这个极其简单的问题让我完全难倒了: 我只想访问字符串中的单个字符。在我所知道的任何其他语言中,这都仅仅是这样做的问题(C++):

我知道字符串只是字符数组,所以我尝试这样做:

.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,以便可以使用printf
printf
打印它,它需要一个指向字符串的指针。你不能向它传递字符。您已尝试执行
printf((char*)testString[1])在C中也会崩溃。要打印字符,您可以将其转换为字符串,或者使用格式字符串,如
%c“
,并将字符作为附加参数传递。显然,您也可以使用
putchar
而不是
printf
BCDEFG