0

我在 si:bx 中有双字号。我如何将它作为字符串写入数组?

4

1 回答 1

2

最简单的方法是将数字转换为十六进制。每组 4 位成为一个十六进制数字。

; 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

现在如果你想要十进制输出,你需要一个更复杂的算法。显而易见的方法是重复划分。请注意,如果您有 32 位 CPU(386 或更高版本),您可以在 16 位模式下使用 32 位寄存器,这样会更容易。

将 si:bx 移入 eax 以开始。要获得下一位,您执行 cdq 指令将 eax 扩展为 edx:eax,除以 10,edx 中的余数是下一位。eax 中的商要么是 0,在这种情况下你就完成了,要么是下一轮循环的输入。这将首先为您提供最重要的数字,因此您需要在完成后反转数字。您的缓冲区需要至少是 2^32 的以 10 为底的对数,四舍五入为 10。调整此算法以使用有符号整数并不难。

于 2010-03-14T00:57:38.347 回答