我刚开始学习汇编语言,我们得到了一个作业,其中作业的目的是编写一个程序,将表示为字符串的有符号整数转换为2的补码编码。
所以我认为我们需要做的一件事是当我们输入一个类似" 10"我们需要将其分解为类似的" 1"和" 0"然后进行转换2的补码编码(如果您认为这是一种正确的方法,请告诉我)。
所以我做了这个小程序 - 只是为了提取" 1" " 10"。
以下是代码中的一些注释,其中数字在代码中
移动" 1"的字符代码(0x31)进入寄存器rax
那是R[rax] <- M[R[rbx]+0] = M[asc] = 0x31
。
移动&#34; 0&#34;的字符代码(0x30)进入寄存器rcx
那是R[rcx] <- M[R[rbx]+1] = M[asc+1] = 0x30
。
移动&#34; 1&#34;的字符代码(0x31)进入answ
。另外,我不确定%al
做了什么,我的老师建议这样做。
然后在gdb中我暂停了ret
语句,如break *main+18
然后我输入x/xg $answ
之后我收到错误
值无法转换为整数
我不确定如何解决这个问题。谢谢您的帮助。该计划是:
.data
asc: .string "10"
answ: .quad
.text
.globl main
main:
mov $asc, %rbx
mov 0(%rbx), %rax #1
mov 1(%rbx), %rcx #2
mov %al, 3(%rbx) #3
ret
答案 0 :(得分:1)
回答你的问题:
%al
(和%ar
)是寄存器。这是一个很好的图表:
&#34; 0&#34;的ASCII字符是0x30
。 &#34; 1&#34;的ASCII字符是0x31
。所以你的&#34; 1和0的字符串看起来像0x30303130...
x/xg $answ
出错的原因是它是gdb语法错误。这是一本好的&#34;备忘单&#34;:
ALSO: