Assembly 我如何用最简单的方法从10到1000010000100
我正在寻找解决问题的办法。 我需要生成1001000和10000(十进制数字)。 因为整个练习就是计算: 10000*X+1000*Y+100*Y+10*V+1*C 我知道我可以用mul命令来做,但是那样的话 我必须和stack一起工作 我想换一种,但不知道怎么做 用十进制数字 用二进制数Assembly 我如何用最简单的方法从10到1000010000100,assembly,masm,Assembly,Masm,我正在寻找解决问题的办法。 我需要生成1001000和10000(十进制数字)。 因为整个练习就是计算: 10000*X+1000*Y+100*Y+10*V+1*C 我知道我可以用mul命令来做,但是那样的话 我必须和stack一起工作 我想换一种,但不知道怎么做 用十进制数字 用二进制数 mov al,2h;mov al,10b; shl al,1 这里是masm环境,谢谢你的帮助 更新1: 我不想使用mul或imul(小于32位数字) 我有一个数字作为字符串(db),比如说24575,我有
mov al,2h;mov al,10b;
shl al,1
这里是masm环境,谢谢你的帮助
更新1:
我不想使用mul或imul(小于32位数字)
我有一个数字作为字符串(db),比如说24575,我有一个伪代码,还没有完成
mov cx,5
Calc:
mov di,offset first
add di,2;so we are on the adress of "2"
;ASCI number is 2 and i want to get 20000
mov al,10d
;than ASCI number is 4 and i want to get 4000
;than ASCI number is 5 and i want to get 500
;than ASCI number is 7 and i want to get 70
;than ASCI number is 5 and i want to get 5
inc di
loop Calc
first:db"A$"
number :db"24575$"
要计算
10000*X+1000*Y+100*Z+10*V+1*C
请使用变换10*(10*(10*(10*X+Y)+Z)+V)+C
。这样,每次迭代只需乘以10。正如我在评论中所写,您可以使用10=8+2
来避免出现mul
。因此,您的代码可能如下所示:
mov cx, 5 ; number of digits
mov di, offset number ; pointer to digits
xor ax, ax ; zero result
next:
mov dx, ax ; save a copy of current result
shl ax, 3 ; multiply by 8
add ax, dx ; 9
add ax, dx ; 10
movzx dx, byte ptr [di] ; fetch digit
sub dx, '0' ; convert from ascii
add ax, dx ; add to sum
inc di ; next digit
loop next
要计算
10000*X+1000*Y+100*Z+10*V+1*C
请使用变换10*(10*(10*(10*X+Y)+Z)+V)+C
。这样,每次迭代只需乘以10。正如我在评论中所写,您可以使用10=8+2
来避免出现mul
。因此,您的代码可能如下所示:
mov cx, 5 ; number of digits
mov di, offset number ; pointer to digits
xor ax, ax ; zero result
next:
mov dx, ax ; save a copy of current result
shl ax, 3 ; multiply by 8
add ax, dx ; 9
add ax, dx ; 10
movzx dx, byte ptr [di] ; fetch digit
sub dx, '0' ; convert from ascii
add ax, dx ; add to sum
inc di ; next digit
loop next
。。。但在这种情况下,我必须大量使用堆栈。
-您可能是指fmul
,mul
在寄存器上工作。X
、Y
、V
的值范围和数据类型是什么?需要更多信息。如果这是32位或64位模式下的32位数字,您可以使用常数10、100等将它们加起来。谢谢Harold,这是一个简单的程序,使用mul和寄存器就足够了。数字小于32位shl命令非常好,但我可以生成101001000作为二进制数,但是我需要得到十进制数。你可以使用10=8+2
,所以按3移位,按1移位,然后将它们相加。或者使用10=2*(4+1)
在32位模式下使用LEA
计算4+1
。好的,但这并不是简单地计算100、1000和10000。。。但在这种情况下,我必须大量使用堆栈。-您可能是指fmul
,mul
在寄存器上工作。X
、Y
、V
的值范围和数据类型是什么?需要更多信息。如果这是32位或64位模式下的32位数字,您可以使用常数10、100等将它们加起来。谢谢Harold,这是一个简单的程序,使用mul和寄存器就足够了。数字小于32位shl命令非常好,但我可以生成101001000作为二进制数,但是我需要得到十进制数。你可以使用10=8+2
,所以按3移位,按1移位,然后将它们相加。或者使用10=2*(4+1)
在32位模式下使用LEA
计算4+1
。好的,但这并不是简单地计算100、1000和10000