汇编 - 将字符数组转换为整数

时间:2014-11-15 15:52:40

标签: linux assembly 64-bit

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 ......

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

-Kyle

2 个答案:

答案 0 :(得分:2)

我要把我的脖子伸出来并且认为那是

ADD RCX,[RAX]

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

答案 1 :(得分:1)

一个快速的解决方案:

更改

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

(不仅增加了一个字节,而且增加了整个8字节-64位数)

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