使用汇编语言将.string转换为.quad

时间:2016-06-19 03:55:24

标签: assembly x86 gdb att

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

所以我认为我们需要做的一件事是当我们输入一个类似" 10"我们需要将其分解为类似的" 1"和" 0"然后进行转换2的补码编码(如果您认为这是一种正确的方法,请告诉我)。

所以我做了这个小程序 - 只是为了提取" 1" " 10"。

以下是代码中的一些注释,其中数字在代码中

  1. 移动&#34; 1&#34;的字符代码(0x31)进入寄存器rax 那是R[rax] <- M[R[rbx]+0] = M[asc] = 0x31

  2. 移动&#34; 0&#34;的字符代码(0x30)进入寄存器rcx 那是R[rcx] <- M[R[rbx]+1] = M[asc+1] = 0x30

  3. 移动&#34; 1&#34;的字符代码(0x31)进入answ。另外,我不确定%al做了什么,我的老师建议这样做。

  4. 然后在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
    

1 个答案:

答案 0 :(得分:1)

回答你的问题:

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

    • RAX是64位值
    • EAX是32位值
    • AX是低16位
    • AL是低8位
    • AH是位8到15(从零开始)
  • &#34; 0&#34;的ASCII字符是0x30。 &#34; 1&#34;的ASCII字符是0x31。所以你的&#34; 1和0的字符串看起来像0x30303130...

  • x/xg $answ出错的原因是它是gdb语法错误。这是一本好的&#34;备忘单&#34;:

ALSO:

  • &#34; Jonathan Barlett的“从头开始编程”是精彩的资源。并且它完全免费 - 他在线发布了整个文本:

http://savannah.nongnu.org/projects/pgubook/