2015-08-16 2 views
0

Как преобразовать из ascii в integer?Преобразование из ascii в integer в AT & T Assembly

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'); 
} 

Так скажем %esi является p выше %eax является val и %ecx является n. Перевести строки по строке

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