如何在TASM 8086中重新排列数字abde到不同的数字顺序?常数太长



例如,我有用户输入abcde(5个数字,每个字母代表不同的数字)。我想重新排列数字的顺序,从abde到acda(12345变成1341)我提取每一位数字,然后乘以它的位置。下面的代码给出了我提取的cda:

 ; XXXO
 mov al, 1 ; al becomes 1
 mov bl, byte ptr[input + 2] ; a
 sub bl, '0' ; converts from ASCII to number
 mul bl ; al = 1 and multiplied by digit a, so answer is a*1
 mov byte ptr firstNumber, al
 ;XXOX
 mov al, 10
 mov bl, byte ptr[input+ 5] ; d
 sub bl, '0'
 mul bl ; d * 10
 mov byte ptr secondNumber, al
 ; XOXX
 mov al, 100
 mov bl, byte ptr[input+ 4] ; c
 sub bl, '0'
 mul bl ; c * 100
 mov word ptr thirdNumber, ax

因为* 1 + d * 10 + c * 100。总结如下:

 mov cl, 00
 add cl, byte ptr numberOne
 add cl, byte ptr numberTwo
 add cx, word ptr numberThree

现在的问题是提取a*1000位,因为

 ; OXXX
 mov al, 1000 ; Error here. Constant too large
 mov bl, byte ptr[input+ 2] ; a
 sub bl, '0'
 mul bl
 mov word ptr fourthNumber, ax

给出常数太大的误差。怎么解呢?

al是一个8位寄存器,它最多只能保存256个值。您将需要使用16位寄存器,例如。ax和扩展其他操作数,如:

mov ax, 1000
movzx bx, byte ptr [input+2]
sub bx, '0'
mul bx
mov word ptr thirdNumber, ax

如果你想避免movzx,你可以手动调零bh:

mov ax, 1000
mov bl, byte ptr [input+2]
sub bl, '0'
mov bh, 0
mul bx
mov word ptr thirdNumber, ax

最新更新