我在我的系统中使用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
答案 0 :(得分:2)
从http://en.wikibooks.org/wiki/X86_Assembly/Arithmetic开始,还可以看看英特尔IA-32 PRM:
mul
或imul
答案 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/