用汇编语言将 .string 转换为 .quad
Posted
技术标签:
【中文标题】用汇编语言将 .string 转换为 .quad【英文标题】:Converting a .string to .quad in assembly language 【发布时间】:2016-06-19 03:55:24 【问题描述】:我刚开始学习汇编语言,我们有一个家庭作业,作业的目的是编写一个程序,将表示为字符串的有符号整数转换为 2 的补码编码。
所以我认为我们需要做的一件事是,当我们输入一个像“10”这样的字符串时,我们需要将它分解成“1”和“0”,然后进行转换 2 的补码编码(让我知道如果您认为这是正确的方法)。
所以我做了这个小程序——只是为了提取“10”中的“1”。
以下是代码中的数字的一些 cmets
将字符代码“1”(0x31)移入寄存器rax
。
那是R[rax] <- M[R[rbx]+0] = M[asc] = 0x31
。
将字符代码“0”(0x30)移动到寄存器rcx
。
那是R[rcx] <- M[R[rbx]+1] = M[asc+1] = 0x30
。
将字符代码“1”(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
【问题讨论】:
如果它更容易首先使用汇编以外的语言。例如像 C 或许多其他的。不,这并不意味着使用 strtoul。但是遍历字符串,想出算法,然后一旦你用一种你很自然的语言得到算法,然后用汇编语言简单地编写该算法。 如果我不能很快弄清楚,那么我会这样做并发布它。 请edit 改进您的问题标题。就像现在一样,它是对您的作业的背诵,而不是问题或问题描述。我的直接反应是投票结束作为您作业的副本/粘贴。您的标题应该描述您遇到的问题或您提出的问题,并且应该是在搜索结果中看到的对未来读者有意义的内容。 我改了标题,希望有意义 【参考方案1】:回答您的问题:
%al
(和%ar
)是寄存器。这是一个很好的图表:
“0”的 ASCII 字符是 0x30
。 “1”的 ASCII 字符是 0x31
。因此,您的“1 和 0 字符串将类似于 0x30303130...
x/xg $answ
给出错误的原因是它是 gdb 语法错误。这是一个很好的“备忘单”:
还有:
Jonathan Barlett 的“从头开始编程”是一个精彩资源。而且它是完全免费的——他把全文发布到网上:http://savannah.nongnu.org/projects/pgubook/
【讨论】:
你是说“x/xg $answ”是我唯一的错误 不,我只是在回答具体问题。您的主要问题仍然是弄清楚如何将带符号的字符串转换为相应的位。正数很容易:您只需一次处理一个字节,减去“0x30”并将该位移动到您的结果中。负数更具挑战性:例如,“-1”将具有与“1”完全不同的位模式。建议:首先让它为 1 个正数 0..9 工作。请也看一下 PGU 的书。 我还没有完成任务。我在想我需要先分解每个字符,然后当我弄清楚时,我会努力转换它们。以上是关于用汇编语言将 .string 转换为 .quad的主要内容,如果未能解决你的问题,请参考以下文章