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

How to rearange digits abcde to different digits order in TASM 8086? Constant too long

例如我有用户输入abcde(5位数字,每个字母代表不同的数字)。我想重新排列数字顺序,从 abcde 到 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

因为a*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