注册 登录
编程论坛 汇编论坛

[求助]新人举手求助

木星蜥蜴 发布于 2007-05-30 22:41, 998 次点击
两数相乘,输出结果,就这么简单,但是我就不会
15 回复
#2
爱以走远2007-05-30 22:59
乘法一定要用到AX
用他去乘一个数 数要放到一个寄存器里 (除1可以不用放到寄存器里)
商放到al里 余数放到ah里
当然 输出就是调用用dos 2 自己去看看
#3
木星蜥蜴2007-05-30 23:29
能给具体的程序吗

我只是要两个十进制数相乘,然后输出就可以了
#4
菜鸟上路2007-05-31 10:07

LZ能说出算法吗?
能说出算法,我就给这个程序

#5
CHEN53545202007-05-31 20:31
回复:(木星蜥蜴)[求助]新人举手求助


这是我以前写的,不是很好,但是可以运行的.

呵呵,我也是这个学期才学的
;说明该程序的功能的实现一位数(1~9)的+,-,*,/,的运算,只能输入1~9,+,-,*,/,等字符.
;按回车键可以继续输入

.MODEL SMALL
.STACK
.DATA
ff DB '`````` ',?,'$'
AA DB ?,?,?,'=',?,' ',?,'$'
BB DB 'input error!,please reinput!$'
CC DB 0dh,0ah,' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
DB 0dh,0ah,' ^ input q to exit ^'
db 0dh,0ah,' ^ input enter go on input ^'
db 0DH,0AH,'*************^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^********************************$'

.CODE
.STARTUP

MAIN PROC
push dx
mov ah,09h
mov dx,word ptr offset cc
int 21h
call new
pop dx

HAND: MOV AH,01H ;输入第一个数字
INT 21H

CMP AL,'q'
JZ EXIT2
CMP AL,'1' ;判断输入的数字是否是1~9,若不是输出错误信息
JL ERROR
CMP AL,'9'
JG ERROR


MOV DL,AL ;把数字放到[AA]处
MOV [AA],DL

MOV AH,01H ;输入运算符,并判断是否是+,-,*,/
INT 21H

CMP AL,'q'
JZ EXIT2
CMP AL,'-'
JZ OK

CMP AL,'+'
JZ OK

CMP AL,'*'
JZ OK

CMP AL,'/'
JZ OK

JMP ERROR ;如果输入的不是+,-,*,/,输出错误信息

OK: MOV CL,AL ;输入第二个数
MOV [AA+1],AL
MOV AH,01H
INT 21H

CMP AL,'q'
JZ EXIT2
CMP AL,'1'
JL ERROR
CMP AL,'9'
JG ERROR

MOV BL,AL
MOV [AA+2],BL
CALL NEW

CMP CL,'+' ;判断是执行哪一个运算
JZ NEXT1

CMP CL,'-'
JZ NEXT2

CMP CL,'*'
JZ NEXT3

CMP CL,'/'
JZ NEXT4

NEXT1: CALL ADD1 ;调用加法运算

push ax ;判断是否继续输入,如果是按ENTER键继续输入,不
MOV AH,08H ;是按其他键
INT 21H
call new
CMP AL,0DH
JZ HAND
cmp al,'q'
jz EXIT2
pop ax

JMP EXIT1

NEXT2: CALL SUB1

push ax ;判断是否继续输入,如果是按ENTER键继续输入,不
MOV AH,08H ;是按其他键
INT 21H
call new
CMP AL,0DH
JZ HAND
cmp al,'q'
jz EXIT2
pop ax
JMP EXIT1

NEXT3: CALL MUL1

push ax ;判断是否继续输入,如果是按ENTER键继续输入,不
MOV AH,08H ;是按其他键
INT 21H
call new
CMP AL,0DH
JZ HAND
cmp al,'q'
jz EXIT2
pop ax

JMP EXIT1

NEXT4: CALL DIV1

push ax ;判断是否继续输入,如果是按ENTER键继续输入,不
MOV AH,08H ;是按其他键
INT 21H
call new
CMP AL,0DH
JZ HAND
cmp al,'q'
jz EXIT2
pop ax

JMP EXIT1

ERROR: push ax ;输出错误的信息
push dx
MOV AH,09H
CALL NEW
MOV DX,WORD PTR OFFSET BB
INT 21H
pop dx
pop ax
call new
JMP HAND

EXIT1: MOV AH,08H
INT 21H
cmp al,'q'
JMP HAND
EXIT2: .EXIT 0

MAIN ENDP
;换行的子程序
new proc
PUSH AX
PUSH DX
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
POP DX
POP AX
ret
new endp

ADD1 PROC ;实现加法子程序
PUSH AX
PUSH BX
PUSH DX
MOV AL,DL
AND AX,000FH
AND BX,000FH
ADD AL,BL
MOV BL,0AH
DIV BL
OR AH,30H
OR AL,30H
MOV WORD PTR [AA+4],AX
MOV DX,OFFSET AA
MOV AH,09H
INT 21H
POP DX
POP BX
POP AX
RET
ADD1 ENDP

SUB1 PROC ;实现减法子程序
PUSH AX
PUSH BX
PUSH DX
MOV AL,DL
AND AX,000FH
AND BX,000FH
cmp al,bl ;判断AL,BL的大小,若AL>BL,跳到CCC
jg CCC

mov al,bl
mov bl,dl
and bl,0fh
SUB AL,BL
MOV BL,0AH
DIV BL
MOV AL,2DH
OR AH,30H
JMP EEE

CCC: SUB AL,BL
MOV BL,0AH
DIV BL
OR AH,30H
OR AL,30H

EEE: MOV WORD PTR [AA+4],AX
MOV DX,OFFSET AA
MOV AH,09H
INT 21H
POP DX
POP BX
POP AX
RET

SUB1 ENDP

MUL1 PROC ;实现乘法子程序
PUSH AX
PUSH BX
PUSH DX
MOV AL,DL
AND AX,000FH
AND BX,000FH
MUL BL
MOV BL,0AH
DIV BL
OR AH,30H
OR AL,30H
MOV WORD PTR [AA+4],AX
MOV DX,OFFSET AA
MOV AH,09H
INT 21H
POP DX
POP BX
POP AX
RET
MUL1 ENDP

DIV1 PROC ;实现除法子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AL,DL
AND AX,000FH
AND BX,000FH
DIV BL

OR AH,30H
MOV CL,AH
XOR AH,AH
OR AL,30H
MOV WORD PTR [AA+4],AX
MOV DX,OFFSET AA
MOV AH,09H
INT 21H
cmp cl,'0'
jz ssss

push dx
MOV [ff+7],cl
mov dx,offset ff
INT 21H
pop dx

ssss: POP DX
POP CX
POP BX
POP AX
RET
DIV1 ENDP

END

#6
木星蜥蜴2007-06-01 12:39
以下是引用菜鸟上路在2007-5-31 10:07:48的发言:

LZ能说出算法吗?
能说出算法,我就给这个程序

输入十进制数值,转换成二进制数值相乘后再转成十进制输出

#7
菜鸟上路2007-06-01 13:10
为什么要转换成2进制数?
#8
木星蜥蜴2007-06-02 20:55
其实无所谓啦,只要输入两个数,能得出乘的结果就可以了,其他加减除就不用了

PS:我们老师说要转的
#9
sk9412007-06-02 21:19

今天我也尝试写了个乘法器,结果我自己都不忍心看了,汗~~~继续检查ING。。。。

#10
菜鸟上路2007-06-02 22:53

上学期弄过一个,希望LZ能明白原理

.model small
.386
data segment
buff1 db 10 dup(0) ;存放第一个数
buff2 db 10 dup(0) ;存放第二个数
len db 0ah ;操作数10
k word 0 ;结果数组中的下标
ones db 0 ;个位数
tens db 0 ;十位数
hint1 db 0ah,0dh,0ah,0dh,'Please input the first number(10 bits):','$'
hint2 db 0ah,0dh,0ah,0dh,'Please input the second number(10 bits):','$'
hint3 db 0ah,0dh,0ah,0dh,'The result is:','$'
data ends

extra segment
db 20 dup(0) ;存放结果
extra ends

code segment use16
assume cs:code,ds:data,es:extra
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax

mov dx,offset hint1 ;输出提示信息
mov ah,09h
int 21h

xor si,si
readnum1: ;读入十个数
xor al,al
mov ah,01h
int 21h
sub al,30h
mov buff1[si],al ;存放在buff1中
inc si
cmp si,09h
jbe readnum1 ;未满十个,继续读入

mov dx,offset hint2 ;输出提示信息
mov ah,09h
int 21h

xor si,si
readnum2: ;读入十个数
xor al,al
mov ah,01h
int 21h
sub al,30h
mov buff2[si],al ;存放在buff2中
inc si
cmp si,09h
jbe readnum2 ;未满十个,继续读入

xor cx,cx
xor bx,bx
xor ax,ax
xor dx,dx

mov si,0ah ;外循环
next1:
mov di,0ah ;内循环
next2:
mov al,buff1[si-1]
mov bl,buff2[di-1]
mul bl
div len
mov tens,al ;取商
mov ones,ah ;取余
mov k,0
add k,si
add k,di ;k=di+si
mov bp,k
mov ah,ones
add es:[bp],ah ;放入个位

cmp byte ptr es:[bp],0ah
jnge here1 ;小于10则跳到here1

xor ax,ax
mov al,es:[bp]
div len
mov es:[bp],ah
add byte ptr es:[bp-1],01h

here1:
mov al,tens
add es:[bp-1],al

;这段可以不要,因为进位最多不超过1位(9*9=81)
;cmp byte ptr es:[bp-1],0ah
;jnge here2 ;小于10则跳到here2

;xor ax,ax
;mov al,es:[bp-1]
;div len
;mov byte ptr es:[bp-1],00h
;mov es:[bp-1],ah
;add byte ptr es:[bp-2],01h

here2:
dec di
cmp di,0
ja next2 ;内循环
dec si
cmp si,0
ja next1 ;外循环

mov dx,offset hint3 ;输出提示信息
mov ah,09h
int 21h

xor si,si
mov si,01h ;0单元没用
print: ;输出结果
xor dl,dl
mov dl,es:[si]
add dl,30h
mov ah,02h
int 21h
inc si
cmp si,20
jbe print
exit:
mov ax,4c00h
int 21h
code ends
end start

#11
g198710012007-06-04 00:14
.......真有趣``人家只是问个小问题你就发这么大段出来吓唬我们新手啊~~~这个就得楼主看书了 别偷懒 问个问题还不如看书快 几分钟帮你学会
#12
木星蜥蜴2007-06-04 01:29
我就要个乘法,你们太热心了....我自己写个算了
#13
菜鸟上路2007-06-04 12:23
你不是说要10位数相乘吗?如果直接用寄存器进行10位数相乘会益处
#14
木星蜥蜴2007-06-04 21:13

我是说要1~9几个数相乘而已
我写了个,不过有4个错,帮我看看,谢谢斑竹
DATA SEGMENT
ff DB '`````` ',?,'$'
AA DB ?,?,?,'=',?,' ',?,'$'
BB DB 'input error!,please reinput!$'
CC DB 0dh,0ah,' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
DB 0dh,0ah,' ^ input q to exit ^'
db 0dh,0ah,' ^ input enter go on input ^'
db 0DH,0AH,'*************^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^********************************$'

CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START:
MAIN proc
push dx
mov ah,09h
mov dx,word ptr offset cc
int 21h
call new
pop dx

HAND: MOV AH,01H ;输入第一个数字
INT 21H

CMP AL,'q'
JZ EXIT2
CMP AL,'1' ;判断输入的数字是否是1~9,若不是输出错误信息
JL ERROR
CMP AL,'9'
JG ERROR


MOV DL,AL ;把数字放到[AA]处
MOV [AA],DL

MOV AH,01H ;输入运算符,并判断是否是*
INT 21H

CMP AL,'q'
JZ EXIT2

CMP AL,'*'
JZ OK

JMP ERROR ;如果输入的不是*输出错误信息

OK: MOV CL,AL ;输入第二个数
MOV [AA+1],AL
MOV AH,01H
INT 21H

CMP AL,'q'
JZ EXIT2
CMP AL,'1'
JL ERROR
CMP AL,'9'
JG ERROR

MOV BL,AL
MOV [AA+2],BL
CALL NEW

CMP CL,'*'
JZ NEXT3

NEXT3: CALL MUL

push ax ;判断是否继续输入,如果是按ENTER键继续输入,不
MOV AH,08H ;是按其他键
INT 21H
call new
CMP AL,0DH
JZ HAND
cmp al,'q'
jz EXIT2
pop ax

JMP EXIT1

ERROR: push ax ;输出错误的信息
push dx
MOV AH,09H
CALL NEW
MOV DX,WORD PTR OFFSET BB
INT 21H
pop dx
pop ax
call new
JMP HAND

EXIT1: MOV AH,08H
INT 21H
cmp al,'q'
JMP HAND
EXIT2: .EXIT 0

MAIN ENDP
;换行的子程序
new proc
PUSH AX
PUSH DX
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
POP DX
POP AX
ret
new endp
MUL1 PROC ;实现乘法子程序
PUSH AX
PUSH BX
PUSH DX
MOV AL,DL
AND AX,000FH
AND BX,000FH
MUL BL
MOV BL,0AH
DIV BL
OR AH,30H
OR AL,30H
MOV WORD PTR [AA+4],AX
MOV DX,OFFSET AA
MOV AH,09H
INT 21H
POP DX
POP BX
POP AX
RET
MUL1 ENDP
END START

#15
g198710012007-06-04 21:59
好长哦```如果是我的老师我写2/3长度他都有意见了- -#
#16
jinchaoren2007-06-05 18:02
呵呵,这么简单的你们怎么都写这么长啊?
1