我如何从10最简单的方式制作10000,1000,100

时间:2014-10-13 10:11:44

标签: assembly masm

我正在为abowe这个问题寻找解决方案。 我需要生成100,1000和10000(十进制数)。 因为整个练习都是为了学习:

  

10000 * X + 1000 * Y + 100 * Y + 10 * V + 1 * C

我知道我可以通过mul命令来完成它,但在那种情况下 我必须在堆栈上工作很多。

我在考虑某种转移,但不知道如何去做 带十进制数字。

使用二进制数

mov al,2h;mov al,10b;
shl al,1

Preferebla是masm环境。谢谢你的帮助

UPDATE1: 我不想使用mul或imul(少于32位数) 我有一个数字作为字符串(db)让我说24575,我有hier的伪代码,没有完成

    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$"

1 个答案:

答案 0 :(得分:4)

要计算10000*X+1000*Y+100*Z+10*V+1*C,请使用转化10*(10*(10*(10*X+Y)+Z)+V)+C。这样,您只需要在每次迭代中乘以10。正如我在评论中所写,您可以使用mul来避免10=8+2。因此,您的代码可能如下所示:

    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