【问题标题】:Assembly - Convert Character Array to Interger汇编 - 将字符数组转换为整数
【发布时间】:2014-11-15 15:52:40
【问题描述】:

RAX 指向以感叹号结尾的一串数字(例如“1234!”)。我一直在尝试将这些数字转换为实际数字,但它正在做同样非常奇怪的事情......这是代码:

CHARINT:                ; convert ASCII encoded numbers to an actual number
 XOR RCX,RCX                    ; clear RCX for use - running total
 .LOOP:                         ; set loopback point
 CMP BYTE [RAX],33              ; if we're on our terminating character, end
 JE .DONE

 PUSH RAX                       ; multiply our previous number by ten to make room for the next digit
  MOV RAX,RCX
  MOV RCX,10
  MUL RCX
  MOV RCX,RAX
 POP RAX

 SUB BYTE [RAX],0x30            ; convert from ASCII
 ADD RCX,[RAX]                  ; add our most recent digit

 INC RAX                        ; next digit

 JMP .LOOP
 .DONE:
 MOV RAX,RCX
RET

由于某种原因,当我要求它在每次迭代期间打印 RAX 的值时,数字遵循一个迷人的序列,Wolfram Alpha has quite a bit to say about...

无论如何,我知道我可能遗漏了一些非常简单的东西,如果有人向我指出,我将不胜感激。谢谢!

-凯尔

【问题讨论】:

    标签: linux assembly 64-bit


    【解决方案1】:

    我会伸出我的脖子发表意见

    ADD RCX,[RAX]
    

    不会将 [RAX} 处的 BYTE 添加到 RCX,但可能会从该内存地址添加超过 8 位。

    【讨论】:

      【解决方案2】:

      一个快速的'n'dirty解决方案:

      改变

      SUB BYTE [RAX],0x30            ; convert from ASCII
      ADD RCX,[RAX]                  ; add our most recent digit
      

      (不仅添加一个字节,而且添加整个 8-byte-64-bit-bunch)

      SUB BYTE [RAX],0x30            ; convert from ASCII
      MOVZX RDX, BYTE [RAX]          ; load one byte into a 64-bit register
      ADD RCX,RDX 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        • 2012-08-24
        • 1970-01-01
        相关资源
        最近更新 更多