問題由彙編程序組成,該程序從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')?
RESD聲明未初始化的存儲空間,我的nasm是生鏽的,但我看不到你null終止你生成的字符串。 – 2012-02-04 23:58:46
@JoachimIsaksson,我原本以爲但是,因爲你存儲的是一個32位的寄存器,其值爲零到九(字符,所以48到57整數),它將被存儲爲val/0/0/0。自動空終止,雖然可能只是一個無用的副作用:-) – paxdiablo 2012-02-05 00:04:00
在c程序描述中,它聲明'str'字符數組大小爲20,那麼我將如何去初始化存儲空間到該規範? – user1074249 2012-02-05 00:06:26