Преобразование целого числа в строку в NASM - PullRequest
0 голосов
/ 05 февраля 2012

Вопрос состоит из программы сборки, которая принимает входные данные из программы на 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

Насколько я понимаю, коды ASCII для чисел 0-9 находятся в диапазоне 48-57, но если я не поставлючисло явно в буфере перемещается, затем выводом является либо мусор, либо ошибка сегментации.

Я что-то здесь упускаю (eax со значением 2 + 48, должен быть ASCII (50) = '2')

1 Ответ

0 голосов
/ 05 февраля 2012

Вероятно, что либо 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

Кроме этого, он выглядит хорошо. Все, что я могу предложить, - это пошагово пройти по коду, чтобы увидеть, где он идет не так.

...