【问题标题】:Converting a .string to .quad in assembly language用汇编语言将 .string 转换为 .quad
【发布时间】:2016-06-19 03:55:24
【问题描述】:

我刚开始学习汇编语言,我们有一个家庭作业,作业的目的是编写一个程序,将表示为字符串的有符号整数转换为 2 的补码编码。

所以我认为我们需要做的一件事是,当我们输入一个像“10”这样的字符串时,我们需要将它分解成“1”和“0”,然后进行转换 2 的补码编码(让我知道如果您认为这是正确的方法)。

所以我做了这个小程序——只是为了提取“10”中的“1”。

以下是代码中的数字的一些 cmets

  1. 将字符代码“1”(0x31)移入寄存器rax。
    那是R[rax] <- M[R[rbx]+0] = M[asc] = 0x31。

  2. 将字符代码“0”(0x30)移动到寄存器rcx。
    那是R[rcx] <- M[R[rbx]+1] = M[asc+1] = 0x30。

  3. 将字符代码“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 改进您的问题标题。就像现在一样,它是对您的作业的背诵,而不是问题或问题描述。我的直接反应是投票结束作为您作业的副本/粘贴。您的标题应该描述您遇到的问题或您提出的问题,并且应该是在搜索结果中看到的对未来读者有意义的内容。
  • 我改了标题,希望有意义

标签: assembly x86 gdb att


【解决方案1】:

回答您的问题:

  • %al(和%ar)是寄存器。这是一个很好的图表:

    • RAX 是 64 位值
    • EAX 是 32 位值
    • AX 是低 16 位
    • AL 是低 8 位
    • AH 是 8 到 15 位(从零开始)
  • “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 的书。
  • 我还没有完成任务。我在想我需要先分解每个字符,然后当我弄清楚时,我会努力转换它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2021-08-22
  • 2019-08-03
  • 2013-11-21
  • 1970-01-01
  • 2014-09-16
  • 2017-04-07
相关资源
最近更新 更多