2012-02-04 52 views
0

問題由彙編程序組成,該程序從C程序獲取輸入並將其除以數字,然後將餘數返回給C程序作爲字符串打印。將整數轉換爲NASM中的字符串

這裏是我的兩個代碼:

#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

RESD聲明未初始化的存儲空間,我的nasm是生鏽的,但我看不到你null終止你生成的字符串。 – 2012-02-04 23:58:46

+0

@JoachimIsaksson,我原本以爲但是,因爲你存儲的是一個32位的寄存器,其值爲零到九(字符,所以48到57整數),它將被存儲爲val/0/0/0。自動空終止,雖然可能只是一個無用的副作用:-) – paxdiablo 2012-02-05 00:04:00

+0

在c程序描述中,它聲明'str'字符數組大小爲20,那麼我將如何去初始化存儲空間到該規範? – user1074249 2012-02-05 00:06:26

回答

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 

除此之外,它看起來。我所能建議的只是單步執行代碼,看看它出錯的地方。

+0

原來,eax沒有存儲該值(至少我認爲?),但我改變了存儲位置到ebx,然後移動到緩衝區然後到eax,似乎現在正在工作,感謝輸入 – user1074249 2012-02-05 00:13:37

+0

@ user1074249,'eax' _does_存儲'div'和'edx'的結果reaminder:(atomic'eax < - edx:eax/,edx < - edx:eax%')所以,如果它不是你所期望的,那很可能是函數調用破壞'eax'。 – paxdiablo 2012-02-05 00:19:16

+0

我有另一個問題,試圖進行除法計算兩次:(14 div 10 =商1,餘數4 => 1 div 10 =商0,餘1)但當我重新計算div ebx,我得到了一些完全關閉(以百萬計) – user1074249 2012-02-05 05:18:15