簡體   English   中英

在 AT&T 程序集中從 ascii 轉換為整數

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

因此,假設%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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM