在NASM中将整数转换为字符串

时间:2012-02-04 23:48:23

标签: nasm

该问题包括一个汇编程序,它从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')?

1 个答案:

答案 0 :(得分:0)

print_intprint_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

除此之外,看起来没关系。我可以建议的是单步执行代码以查看它出错的地方。