我正在读取一个输入数字字符串,逐个字符地迭代它以转换十进制的每个数字。
现在在我的一个寄存器中的每次迭代中,例如AL
,我都有一位数,让我们说
Input: 12345678
Iteration_1 : 1
Iteration_2 : 2
...
Iteration_8 : 8
我想将这些整数添加到DD
变量中,这样在迭代结束时我会得到一个DD
变量,其中包含我可用于操作的整数。
有这种感觉吗?我怎样才能在每次迭代时将当前数字附加到DD变量?
答案 0 :(得分:0)
将寄存器归零以用作"结果到目前为止"。
顶
获得一个角色。
确保您确实拥有有效的十进制数字。
减去' 0'将字符转换为数字。
到目前为止,乘以"结果"十点。
添加新号码。
回到顶部。
这就是我用的......
;--------------------
atoi:
; expects: address of string on stack
; returns: number in eax
; "trashes" ecx and edx
; actually, edx is "next character"
; and ecx (cl) is the "invalid" character
; think of "192.168.0.1"...
; caller cleans up stack
push ebx
mov edx, [esp + 8] ; pointer to string
xor ebx, ebx ; assume not negative
cmp byte [edx], '-'
jnz .notneg
inc ebx ; indicate negative
inc edx ; move past the '-'
.notneg:
xor eax, eax ; clear "result"
.top:
movzx ecx, byte [edx]
inc edx
cmp ecx, byte '0'
jb .done
cmp ecx, byte '9'
ja .done
; we have a valid character - multiply
; result-so-far by 10, subtract '0'
; from the character to convert it to
; a number, and add it to result.
lea eax, [eax + eax * 4]
lea eax, [eax * 2 + ecx - '0']
jmp short .top
.done:
test ebx, ebx
jz .notminus
neg eax
.notminus:
pop ebx
ret
;------------------------
现在只是mov [myvar], eax
。这有一些缺点!我刚刚退出任何无效的角色。这会捕获一个以零结尾的字符串,或以换行符终止的字符串(因为我从Linux获得)或其他任何内容。很好,但如果他们搞砸了,我就不会对用户大吼大叫。我也无法检查是否有溢出。如果你需要那个,就放弃可爱的伎俩"和imul eax, 10
一起使用......如果你不需要处理负数,可以简化一下。
答案 1 :(得分:-1)
MOV CX, #8
loop:
MOV DX, #1
ADDS AX, DX
ADDS DX, #1
SUBS CX, CX, #1
BNE loop
DD dw 0
MOV DD, AX