汇编语言中的乘法

时间:2014-04-19 17:13:39

标签: assembly x86

我在我的系统中使用x86位窗口7,在我的系统中使用gui turbo汇编程序。 我想从用户那里得到两个数字并将其相乘。程序是什么?

.model small
.stack 100h
.data
num db 2 dup(0)

.code

main proc

mov ax, @data
mov dx, ax

mov ah, 1
int 21h   ;get a number from user
mov num, dl ;store number in num[0]

int 21h ;get number from user

mov ah, 2
int 21h

mov ah, 4ch
int 21h

main endp
end main

2 个答案:

答案 0 :(得分:2)

http://en.wikibooks.org/wiki/X86_Assembly/Arithmetic开始,还可以看看英特尔IA-32 PRM:

mulimul

答案 1 :(得分:0)

在这种情况下(两个一位数字)我更喜欢BCD算法:

.MODEL small

.STACK 1000h

.DATA
    num db '3', '4'
    result db '$$$'

.CODE
main PROC
    mov ax, @data
    mov ds, ax          ; DS! DS! NOT DX!

    mov ah, 01h         ; Wait for one character
    int 21h
    mov num, al         ; AL! AL! NOT DL!

    mov ah, 01h         ; Wait for one character
    int 21h
    mov num+1, al

    mov dl, 0Ah         ; Linefeed
    mov ah, 02h         ; Cooked output
    int 21h

    mov ax, word ptr [num]
    and ax, 0F0Fh       ; Convert ASCII numbers to integers
    mul ah              ; AX = AL * AH
    aam                 ; Convert integer in AL to unpacked BCD in AX
    or  ax, 3030h       ; Convert integers to ASCII
    xchg al, ah         ; Convert big endian to little endian
    mov word ptr [result], ax

    mov dx, OFFSET result
    mov ah, 09h         ; Output until '$'
    int 21h

    mov ax, 4C00h       ; Exit (0)
    int 21h
main ENDP

end main

现在您可以考虑如何禁用前导零。

编辑:尝试解释:

1)这两个数字以[num][num+1]为单位。两个字节是一个字,所以我可以使用字寄存器AX来加载它们。 AX字寄存器由两个字节寄存器AH和AL组成,因此AL为[num],AH为[num + 1]。

2)这两个数字是ASCII编码的,因为它们来自输入的这种形式。数字0d到9d的ASCII码是30h到39h。你可以看到我们可以通过将第一个半字节设置为0来获得整数。这可以通过AND命令来完成,例如: 34和0F是04.为了简单和优雅,我通过AND AX(AH和AL一步完成)完成了这一步骤。示例:3234 AND 0F0F为0204。

3)此处MUL命令将AL与另一个寄存器相乘。 MUL AH将AL与AH相乘。结果进入AX。使用AAM,我从AL中的二进制整数中得到两个十进制数,并通过OR转换为ASCII字符。当我将AX存储到[result]时,首先存储AL,然后存储AH,例如, AX中的12将存储为2,1。为避免这种情况,我使用XCHG反转AX中的数字顺序。现在可以为INT 21h Fn 09h正确存储结果。

你需要一本从头开始用更好的英语解释处理器的书。 Paul Carter博士的教程是一个不错的选择:http://www.drpaulcarter.com/pcasm/