4

所以我试图将一个字符串转换为一个数字,以便以后可以添加另一个数字。这是我必须在我的 .text 中进行转换的内容。num2Entered 是用户输入的内容。Num1plusNum2 是我最终要添加的标签。它们都在 .bss 部分中声明。任何帮助,将不胜感激!

    mov ax, [num2Entered + 0]
    sub ax, '0'
    mov bx, WORD 1000
    mul bx
    mov [Num1plusNum2], ax

    mov ax, [num2Entered + 1]
    sub ax, '0'
    mov bx, WORD 100
    mul bx
    add [Num1plusNum2], ax

    mov ax, [num2Entered + 2]
    sub ax, '0'
    mov bx, WORD 10
    mul bx
    add [Num1plusNum2], ax

    mov ax, [num2Entered + 3]
    sub ax, '0'
    add [Num1plusNum2], ax
4

3 回答 3

7

每个字符只有一个字节,但您可能希望将其添加到更大的结果中。还不如去 32 位...(如果你真的想的话,可以把你的例程拖到 16 位)

mov edx, num3entered ; our string
atoi:
xor eax, eax ; zero a "result so far"
.top:
movzx ecx, byte [edx] ; get a character
inc edx ; ready for next one
cmp ecx, '0' ; valid?
jb .done
cmp ecx, '9'
ja .done
sub ecx, '0' ; "convert" character to number
imul eax, 10 ; multiply "result so far" by ten
add eax, ecx ; add in current digit
jmp .top ; until done
.done:
ret

这不是我的想法,可能有错误,但“类似”。它会在以零结尾的字符串或以换行符结尾的字符串...或任何无效字符(您可能不想要)的末尾停止。修改以适应。

于 2013-10-19T05:00:54.580 回答
2
"123"
 |||     val = 0
 |||______ val = val + ('3' - 48) * 10power0       [val now is 3]
 ||_______ val = 3   + ('2' - 48) * 10power1       [val now is 23] 
 |________ val = 23  + ('1' - 48) * 10power2       [val now is 123]

note: ascii of '1' means 49, '2' means 50 and so on
于 2015-01-28T20:16:47.887 回答
2
or we can say:
"123"  -> starting from 1

1 + 0 * 10  = 1
2 + 1 * 10  = 12
3 + 12 * 10 = 123

This will match to atoi function as below:

atoi:

push    %ebx        # preserve working registers
push    %edx
push    %esi

mov $0, %eax        # initialize the accumulator
nxchr:
    mov $0, %ebx        # clear all the bits in EBX
    mov (%esi), %bl     # load next character in BL
    inc %esi            # and advance source index

    cmp $'0', %bl       # does character preceed '0'?
    jb  inval           # yes, it's not a numeral jb:jump below
    cmp $'9', %bl       # does character follow '9'?
    ja  inval           # yes, it's not a numeral ja:jump above

    sub $'0', %bl       # else convert numeral to int
    mull ten            # multiply accumulator by ten. %eax * 10
    add %ebx, %eax      # and then add the new integer
    jmp nxchr           # go back for another numeral

inval:
   pop  %esi            # recover saved registers
   pop  %edx
   pop  %ebx
   ret

希望这会有所帮助。

于 2015-01-28T21:01:17.190 回答