mnemotécnicos libro lenguaje instrucciones formato ensamblador assembler arquitectura assembly x86 integer nasm

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