assembly - Número de impresión Después de usar div y mod-no funciona MASM
sum division (2)
Para eliminar el bloqueo:
1) Presumible que desea imprimir un número y no una cadena. Entonces cambia
fmt db ''%s'',0
a
fmt db ''%d'',0
2) Cambie el orden incorrecto y el desplazamiento incorrecto en
invoke crt_printf,offset Sum2,offset fmt ; this would be in C: printf (&Sum2,&fmt);
a
invoke crt_printf, offset fmt, Sum2
3) Agregue una salida al final:
invoke crt_exit, 0
Por cierto: supongo que SomeFunc
no hará lo que quieras. Pero hay demasiados errores para una respuesta corta. Use un depurador para ver qué está pasando. Recomiendo OllyDbg .
Intento escribir un programa que obtenga un String que contenga un número, y poner en la variable Sum2 la suma de los dígitos del número que obtuvo la función. esto es lo que escribí pero no funciona y no sé por qué:
.386
.MODEL Flat, STDCALL
option casemap:none
SomeFunc proto :DWORD
include /masm32/include/windows.inc
include /masm32/include/msvcrt.inc
includelib /masm32/lib/msvcrt.lib
.data
Sum2 dd ?
stop db 0
fmt db ''%s'',0
.code
SomeFunc proc Number:DWORD
Lop:
mov eax,Number
mov ebx,''10''
xor edx,edx
div ebx
add Sum2,edx
mov Number,eax
cmp Number,0
jna Lop
ret
SomeFunc endp
start:
invoke SomeFunc,''123''
invoke crt_printf,offset Sum2,offset fmt
end start
Realmente no entiendo por qué no funciona y cómo lo hago funcionar. ¿alguien puede explicarme? Perdón por mi mal ingles. gracias por la ayuda.
Concentrándose en SomeFunc
- Debe borrar Sum2 antes de usar esta función. Sin hacerlo, solo puedes esperar tener suerte una vez.
- Quieres dividir por 10 y no por una cadena ''10''
- Debe continuar el ciclo siempre que EAX no sea cero.
Aplicando todo esto da:
SomeFunc proc Number:DWORD
mov Sum2, 0
mov eax, Number
mov ebx, 10
Lop:
xor edx, edx
div ebx
add Sum2, edx
mov Number, eax
cmp eax, 0
jne Lop
ret
SomeFunc endp
Tenga en cuenta que SomeFunc espera un número mientras que invoke SomeFunc,''123''
pasa un puntero a una cadena de 3 caracteres.