例如,我有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
给出了太大的错误。我该如何解决这个问题?
答案 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