Assembly 如何在&;处从字符串中提取字符;T组件
我目前正在AT&T做I/O,但我被一个愚蠢的问题困扰了相当长的一段时间,所以我决定转向堆栈溢出 我想分离字符串的一部分,该部分是在处理函数之前从函数中的用户输入的,并将其存储在$in中:Assembly 如何在&;处从字符串中提取字符;T组件,assembly,gdb,x86-64,att,Assembly,Gdb,X86 64,Att,我目前正在AT&T做I/O,但我被一个愚蠢的问题困扰了相当长的一段时间,所以我决定转向堆栈溢出 我想分离字符串的一部分,该部分是在处理函数之前从函数中的用户输入的,并将其存储在$in中: pushq %rbp movq %rsp, %rbp movq $in, %rdi movq $5,%rsi movq stdin, %rdx call fgets 在我被卡住的函数中,我试图从字符串中提取一个字符来比较它是否是asc
pushq %rbp
movq %rsp, %rbp
movq $in, %rdi
movq $5,%rsi
movq stdin, %rdx
call fgets
在我被卡住的函数中,我试图从字符串中提取一个字符来比较它是否是ascii数字、特殊符号等。但目前的问题是“提取”部分
我已经尝试了我能想到的一切,推动它,我有一种感觉,这将是一样容易的添加/减去地址,但我不能得到语法进入我的头脑
以下是最新的尝试:
movq $in, %r10
movb (%r10), %al
movb %al, (%rdx)
但我无法通过gdb访问它:
(gdb) x/12cb $al
0x31: Cannot access memory at address 0x31
感谢您的回复 在
$al
上使用x
命令毫无意义x
将地址作为参数<代码>$al太小,无法包含地址。看起来您试图通过传递包含字符串第一个字节的寄存器的值来查看字符串(12cb
)。那不行!寄存器中的值可能来自字符串缓冲区的第一个字节,但它现在是该字节的独立副本,与字符串的其余部分无关。在中尝试x/12cb以查看缓冲区。IIRCx
调试器命令用于检查内存。你想打印的是寄存器,不是内存。错误消息表明您感兴趣的字节只是0x31(这不是一个有效的内存地址)。啊,我看我把地址错当成了寄存器。缓冲区是正确的,包含输入,但是我想从字符串中返回一个字符,如果不象gdb那样,我不知道如何做/控制字符。有指针吗?不清楚您想要什么。我想检查字符串的字符,并根据用户输入的字符(ASCII)处理输入:+-或整数1-99或空格。为此,我有多个函数,这个函数应该返回一个类似于getint()函数的字符。为此,我在监视gdb中的值时尝试从字符串中提取一个字符。它证明了我无法使用我使用的方法来监控值,因此我想知道如何才能做到这一点,或者如何执行我前面描述的操作。