所以我对汇编语言相当陌生,我对基础知识非常掌握,但用户输入一直困扰着我。所以现在我有以下代码来接收用户的一位数字:
mov eax, 3
mov ebx, 0
mov ecx, inStrBuf
mov edx, StrLen
int 80h
然后定义如下
SECTION .bss
inStrBuf: times StrLen resb ' '
Section .data
StrLen: equ 8
将值放入ecx后,值为数字+ 2608.所以我一直在做的只是减去2608并得到数字。现在,当我输入多个数字时,比如数字46,当我转换为十进制时,我得到669236.没有简单的方法可以像以前一样减去2608。
首先,2608的内容是什么,有没有办法只接受像654这样的数字并将其放入寄存器(当然是十六进制值)。谢谢!
答案 0 :(得分:1)
我不知道2608来自哪里,甚至更少669236!一般的想法是:
;zero out someplace to put result
top:
;get a digit/character
;make sure it represents a decimal digit
;(if not - go to done)
;subtract '0' to convert character to number
;multiply "result so far" by 10
;add in the new number
;go to top
done:
这是我通常使用的......
section .bss
inStrBuf resb StrLen ; 12+ is good...
section .text
...
push inStrBuf ; pass parameter on stack
call atoi
add esp, 4 ; clean up stack
mov [someplace], eax
...
;--------------------
atoi:
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
;------------------------
这使用了"聪明的"两个lea
s乘以10的方法,减去' 0'并添加新数字。它的缺点是没有设置标志,所以我们无法检查溢出 - 它只是静静地翻转。任何"无效"字符停止 - 适用于xero,换行(sys_read将在那里)...或"垃圾"。当它返回时,"无效"字符将在ecx中(只是cl很有趣),edx指向下一个字符。方便解析" 192.168.1.1"或者。您可能更喜欢使用更直接的东西。 :) C库" atoi"或" scanf"工作...如果你想这样做......
真的好奇2608来自哪里!