Assembly 我如何用最简单的方法从10到1000010000100

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

我正在寻找解决问题的办法。 我需要生成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 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