[英]Convert from ascii to integer in AT&T Assembly
如何從ascii轉換為整數?
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”。 如何打印?
我不確定我是否完全理解您的要求,但是我認為您正在嘗試向終端打印整數?
如果是這種情況,這是一種處理方法(無符號)。
#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
通常最好先考慮高級語言版本。 如果數字有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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.