例如,我有用户输入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