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

时间:2015-10-07 22:45:00

标签: assembly tasm

例如,我有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

给出了太大的错误。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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