assembly - libro - mnemotécnicos ensamblador
Convierte cadena a int. Ensamblador x86 32 bit usando Nasm (3)
Cada personaje es solo un byte único, pero es probable que desee agregarlo a un resultado más grande. Bien podría ir por 32 bits ... (puede dificultar tu rutina a 16 bits si realmente quieres)
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
Eso está fuera de mi cabeza y puede tener errores, pero "algo así". Se detendrá al final de una cadena terminada en cero, o una cadena terminada en línea ... o cualquier carácter no válido (que puede que no desee). Modificar para adaptarse.
Así que estoy tratando de convertir una cadena en un número para poder agregarle otro número más adelante. esto es lo que tengo que hacer en mi texto para la conversión. num2Entered es lo que el usuario ingresó. Num1plusNum2 es la etiqueta que eventualmente agregaré. Ambos están declarados en la sección .bss. ¡Cualquier ayuda sería apreciada!
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
"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
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
Espero que esto ayude