该问题包括一个汇编程序,它从C程序获取输入并将其除以一个数字,然后将余数返回给C程序以作为字符串打印。
以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
char *str;
str = malloc(1<<9);
printf("Enter a number: ");
scanf ("%d", &i);
printf("Number: %i\n", i);
str=int2string(i);
printf("Number as string is: %s\n", str);
return 0;
}
ASM =
%include "asm_io.inc"
segment .data
segment .bss
buffer resd 4
segment .text
global int2string
int2string:
enter 0,0 ; setup routine
pusha
mov edx, 0
mov eax, [ebp+8] ; eax contains input value of int2string
mov ebx, 10 ; sets ebx to value of 10
div ebx ; eax = eax / ebx
call print_int ; prints eax = quotient
call print_nl ; next line
mov eax, edx ; store edx (remainder) in eax
call print_int ; print remainder
call print_nl ; next line
add eax, 48 ; convert result into ASCII character
popa
mov dword[buffer], eax ; move ASCII character (if I replace eax with 48-57
; it prints 0-9 correctly)
mov eax, buffer ; move buffer value to eax
leave
ret
我的理解是数字0-9的ASCII码来自48-57的范围,但是如果我没有明确地将数字放在缓冲区中,那么输出就是垃圾或分段错误。
我在这里遗漏了什么(eax的值为2 + 48,应该是ASCII(50)='2')?
答案 0 :(得分:0)
print_int
或print_nl
可能无法保留eax
的值(特别是因为公共调用约定是返回该寄存器中函数的结果)。如果您对print_int
的第二次调用打印出正确的值,但该字符错误,则这是一种明显的可能性。
一个简单的测试/修复就是改变:
call print_int ; print remainder
call print_nl ; next line
成:
push eax
call print_int ; print remainder
call print_nl ; next line
pop eax
除此之外,看起来没关系。我可以建议的是单步执行代码以查看它出错的地方。