0

si:bx にダブルワード番号があります。文字列として配列に書き込むにはどうすればよいですか?

4

1 に答える 1

2

最も簡単な方法は、数値を 16 進数に変換することです。4 ビットの各グループが 16 進数になります。

; this is pseudocode
mov di, [addr_of_buffer]  ; use the string instructions
cld                       ; always remember to clear the direction flag

; convert bx
mov cx, 4    ; 4 hexits per 16 bit register
hexLoopTop:
mov al, bl   ; load the low 8 bits of bx
and al, 0x0F ; clear the upper 4 bits of al
cmp al, 10
jl decimal
add al, 65   ; ASCII A character
jmp doneHexit:
decimal:
add al, 48   ; ASCII 0 character
doneHexit:
stosb        ; write al to [di] then increment di (since d flag is clear)
ror bx       ; rotate bits of bx down, happens 4 times so bx is restored
loop hexLoopTop

; repeat for si, note that there is no need to reinit di

10 進出力が必要な場合は、かなり複雑なアルゴリズムが必要になります。これを行う明白な方法は、除算を繰り返すことです。32 ビット CPU (386 以降) を使用している場合は、16 ビット モードから 32 ビット レジスタを使用できるため、これがより簡単になります。

si:bx を eax に移動して開始します。次の桁を取得するには、cdq 命令を実行して eax を edx:eax に拡張し、div を 10 で割ると、edx の残りが次の桁になります。eax の商は、完了した場合は 0 か、ループの次のラウンドの入力です。これにより、最上位桁が最初に表示されるため、完了したら桁を逆にする必要があります。バッファは少なくとも 2^32 を切り上げた 10 を底とする対数である必要があります。このアルゴリズムを符号付き整数で動作するように調整することはそれほど難しくありません。

于 2010-03-14T00:57:38.347 に答える