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
答案 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