0

現在、私のコードは 1846 を逆にしています。配列を逆にして6481ではなく1846を出力する方法がわかりません。逆にするループが必要だと思いますが、それを実装する方法がわかりません。どんな助けでも大歓迎です。ありがとうございました。

.data 

enter_message:
    .ascii "Enter a binary value:\n"

enter_message_length:
    .int 22

name:
    .space 50
buffersize:
    .int 0

someLength:
    .int 50
array:
    .space 50

.text
.global _start

_start:




mov  $1846, %eax

mov $10, %ebx
    mov $0, %edi 
While_Loop:
    cmp $0, %eax                        
    je Convert_to_ASCII                 

    mov $0, %edx                        
    div %ebx                            

    add $48, %edx               
    movb %dl, buffersize(%edi)      
    add $1, %edi
    jmp While_Loop      


Convert_to_ASCII: 
    mov $4, %eax
    mov $1, %ebx
    mov $buffersize, %ecx
    mov %edi, %edx
    int $0x80

mov $1, %eax
int $0x80
4

1 に答える 1

1

少なくとも 2 つの実用的で簡単なオプションがあります

1) ターゲット文字列専用のメモリ領域の末尾から開始し、ポインタをデクリメントします (文字列が ASCII ゼロで終わっていることを確認してください)。

  mov ah,[bx];
  dec bx

2) スタックを使用します -- 操作を 2 つのループに分割し、各 N 回の反復を実行する必要があります。

  • 最初のループ: N 回押す
  • 次のループ: N 回 pop し、*bx++ に書き込みます

2.1) 一時文字列への書き込み (スタックと同じメカニズムですが、使用するスペースが少なく、命令がより複雑です)。

2.5) 再帰を使う

3) この問題は基本的に 10 進数から ASCII への変換に関するものであるため、最初に最大数から機能するアルゴリズムを使用します (これは通常、試行減算で達成されます:)

int biggest = 10000;
while (biggest) {
  digit='0';
  while (number >= biggest) { number -=biggest; digit++; }
  output(digit);   // tune this to skip leading zeros
  biggest/=10;  // or read next from a table
}
于 2013-04-23T05:54:44.487 に答える