2015-08-16 102 views
0

如何將ascii轉換爲整數?從ascii轉換爲AT&T彙編中的整數

data 

asd: 
    .int 32 

.text 

.globl _start 

_start: 

    movl $4, %eax 
    movl $1, %ebx 
    movl $1,(asd) 
    add $48,(asd) 
    movl $asd, %ecx 
    movl $4, %edx 
    int $0x80 

    # Exit the program 
    movl $1, %eax 
    movl $0, %ebx 
    int $0x80 

該代碼正在寫一個ascii值,我認爲如果我可以添加48的值。我可以寫,但我無法打印,兩個階段的數字「例如53或156」。我如何打印?

+0

您必須一次完成一位數字。除以10以隔離下一個數字。 –

回答

0

通常最好先考慮高級語言版本。如果數字n數字並存儲在陣列a,那麼我們會想:

char *p = a; 
unsigned val = 0; 
while (n > 0) { 
    n--; 
    val = 10 * val + (*p++ - '0'); 
} 

所以我們說%esip以上%eaxval,和%ecxn。一行一行地翻譯

movl $n, %ecx 
    movl $a, %esi 
    xorl %eax, %eax ; val = 0 
eval_while_cond: 
    orl %ecx, %ecx  ; if (n <= 0) 
    jle done   ; goto done 
    subl $1, %ecx  ; n-- 
    movl %eax, %ebx ; tmp1 = val 
    mull $10, %ebx  ; tmp1 = 10 * tmp1 
    movzbl (%esi), %eal; tmp2 = *p 
    addl $1, %esi  ; p++ 
    subl $'0, %eax  ; tmp2 = tmp2 - '0' 
    addl %eax, %ebx ; val = tmp2 + tmp1 
    jmp eval_while_cond 
done: 
    ; result is now in %eax 
0

我不確定我完全明白你在問什麼,但我認爲你正在嘗試打印一個整數到終端?

如果是這樣的話,這是一種做法(無符號)。

#define SYS_EXIT $1 
#define SYS_WRITE $4 

#define STDOUT  $1 

#define LEN   $11 

.global _start 
.text 

_start: 
    movl $(printable+9), %edi // Pointer to end of digit string 
    movl number, %eax 

cycledigits: 
    xorl %edx, %edx 
    divl decimal 
    addl $48, %edx   // Add 48 to remainder, store digit 
    movb %dl, (%edi) 
    decl %edi    // Next digit 
    cmpl $0, %eax 
    jg  cycledigits   // No more digits 

print: 
    movl STDOUT, %ebx 
    movl $printable, %ecx 
    movl LEN, %edx 
    movl SYS_WRITE, %eax 
    int  $0x80 

exit: 
    movl SYS_EXIT, %eax 
    xorl %ebx, %ebx    // The exit code. 
    int  $0x80 

.data 
    decimal: 
    .long 10 
    number:  // The number to print: 
    .long 43 
    printable: // Digit string goes here: 
    .zero 10 
    .byte '\n