编一个给小学生出两位数乘法运算题程序;用汇编语言编写,急需……

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-31
用汇编语言做的小学生算术练习软件

;小学生算术练习软件
;
Output macro mess
mov dx,offset mess
mov ah,9
int 21h
endm

CODE SEGMENT
ASSUME CS:CODE,DS:CODE
START:
push cs
pop ds
Begin: Output string
getkey: mov ah,0
int 16h
cmp al,0dh
jz exit
cmp al,'1'
jb getkey
cmp al,'4'
ja getkey
mov ah,0eh
int 10h
and ax,0fh
mov bx,ax
dec bx
shl bx,1
call word ptr Table[bx]
mov Z,al
call Change
jmp jsq
@warn: Output error
jsq: Output buffer
call shuru
cmp al,Z
jnz @warn
Output yes
jmp Begin
exit: mov ah,4ch
int 21h

csh: call @Rnd
mov X,al
call @Rnd
mov Y,al
ret

@Rnd: push dx
xor dx,dx
in ax,40h
div cx
mov al,dl
test al,al
jz @Rnd
pop dx
ret

jiafa: ;"+"
mov fh,'+'
mov cx,100
call csh
mov al,X
add al,Y
ret

jianfa: ;"-"
mov fh,'-'
mov cx,100
call csh
mov al,X
cmp al,Y
jnb jf1
xchg al,Y
mov X,al
jf1:
sub al,Y
ret

chenfa: ;"*"
mov fh,'*'
mov cx,10
call csh
mov al,X
mul Y
ret

Chufa: ;"/"
mov fh,'/'
mov cx,10
call csh
mov al,X
cbw
mov cl,Y
mov ch,0
cmp ax,cx
jnb cf1
xchg ax,cx
mov X,al
mov Y,cl
cf1:xor dx,dx
div cx
ret

Asc:mov al,al
aam
or ax,3030h
xchg al,ah
ret

Change:
mov al,X
call Asc
mov X1,ax
mov al,Y
call Asc
mov Y1,ax
mov al,Z
call Asc
mov Z1,ax
ret

shuru proc
push bp
push cx
push bx
xor bp,bp
mov bx,10
mov cx,3
input:
mov ah,0 ;键盘输入数据
int 16h
cmp al,0dh ;以回车结束输入
jz ok
cmp al,'0' ;只允许输入0~9
jb input
cmp al,'9'
ja input
mov ah,0eh ;显示有效输入
int 10h
and ax,000fH ;化ASCII为HEX
xchg ax,bp
mul bx ;扩大10倍
add bp,ax ;加一位
loop input
ok:mov ax,bp ;数值结果放入ax
;恢复用到的寄存器
pop bx
pop cx
pop bp
ret
shuru endp

X db ?
Y db ?
Z db ?
N db ?
buffer db 0dh,0ah,9
X1 dw ?
fh db ?
Y1 dw ?
db '= $'
Z1 dw ?

Yes db 9,'Correct!$'
error db 9,'Error!$'
string db 0dh,0ah,9,'Menu: '
db 9,'1.Jia fa 2.Jian fa Chen fa 4.Chu fa',0dh,0ah
db 9,'Choice(1-4),enter to quit: $'
Table dw jiafa,jianfa,chenfa,Chufa

CODE ENDS
END START

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段); 用法: Output Str_Addr
; 用法举例:Output PromptStrOutput MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -----------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:输出回车换行
enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
enter_CTLF endp
; -----------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
enter_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
enter_Chr endp
; -----------------------------------------
; 功能:键盘输入一个N位的十进制数字,
; 用逻辑和移位指令将其转换成二进制数并保存在指定的内存单元。
; 入口:N=数字位数;di=保存输入的数字首地址
; 出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cx,N
push cx
@@Input: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,CR ;若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec ;转去处理已经键入的数字
cmp al,KBBack
jz @@KB_Back ;若是回空键,重新输入

cmp al,'0'
jb @@KBBack ;若低于数字'0',重新输入
cmp al,'9'
ja @@KBBack ;若低于数字'9',重新输入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置光标位置
jmp @@Input
@@Save_Dig: and al,0fh ;转换成二进制数

mov al,01h

stosb ;保存
loop @@Input ;接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;实际输入的数字位数
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理
dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit:lodsb
cbw
add ax,bp
@@Save_Ret: pop di
stosw
pop bx
pop cx
pop dx
ret
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
; -----------------------------------------
; 功能:把AX中的二进制有、无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
.IF Signed == 'y'
mov @@Carry_Yes,'+'
test ax,8000h
jz $+9
mov @@Carry_Yes,'-'
neg ax
.Endif
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
.IF Signed == 'y'
cmp @@Carry_Yes,'-'
jnz $+6
mov byte ptr [di],'-'
dec di
.Endif
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 dup(?)
@@Carry_Yes db '+'
Dec_ASCII EndP
; -----------------------------------------
N equ 3 ;输入的十进制整数位数
Signed db 'y' ;是否有符号数。'y'=有符号数,'n'=无符号数
Number1 dw ?
Number2 dw ?
Number3 dw ?
Period_Aft db 3 ;保留小数位数
prompt_title db 's=(a*b+c)/a',0ah,0dh,'$'
prompt_A db 'Please Input A: $'
prompt_B db 'Please Input B: $'
prompt_C db 'Please Input C: $'Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
; -----------------------------------------
; 输入两个十进制数
Output prompt_title;提示题目
Output prompt_A ;提示输入第一个数
lea di,Number1 ;变量Number1的地址
call Input_Digit ;从键盘接受一个N位数字
call enter_CTLF ;输出一个回车、换行
Output prompt_B ;提示输入第二个数
lea di,Number2 ;变量Number2的地址
call Input_Digit ;从键盘接受一个N位数字
call enter_CTLF ;输出一个回车、换行
Output prompt_C ;提示输入第三个数
lea di,Number3 ;变量Number3的地址
call Input_Digit ;从键盘接受一个N位数字
call enter_CTLF ;输出一个回车、换行
call enter_CTLF ;输出一个回车、换行
; -----------------------------------------
; 运算

mov dl,'s'
call enter_Chr ;显示一个s

mov dl,'='
call enter_Chr ;显示一个等号

mov ax,Number1
imul Number2 ;Number1*Number2→AX
add ax,Number3 ;(Number1*Number2+Number3)→AX
idiv Number1 ;(Number1*Number2+Number3)/Number1→AX

call Dec_ASCII ;显示和
call enter_CTLF ;输出一个回车、换行
; -----------------------------------------Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

stack segment para stack 'stack'
st1 db 64 dup(?)
stack ends
data segment
num equ 6 ;数字位数(最好为偶数),若为奇数需稍微改动程序
msg1 db 'Enter the first number(ESC to exit) : ','$'
msg2 db 'Enter the second number(ESC to exit) : ','$'
msg3 db 0dh,0ah,'ERROR! Enter again(ESC to exit) : ','$'
num1 db num dup(0) ;存第一个数
num2 db num dup(0) ;存第二个数
res db 0dh,0ah,'The resust is : ','$'
data ends
output macro abyt
push ax
mov dl, abyt
mov ah, 02h
int 21h
pop ax
endm
code segment
assume ss:stack,ds:data,cs:code
main proc far
mov ax, data
mov ds, ax
again:
lea dx, msg1
mov ah, 09h
int 21h ;提示输出第一个数
lea bx, num1
call input ;调用输入
output 0dh ;回车,换行
output 0ah
lea dx, msg2
mov ah, 09h
int 21h ;提示输入第二个数
lea bx, num2
call input
output 0dh ;回车,换行
output 0ah
mov si, 0 ;SI清零
mov ax, 0
L2: lea bx, num1 ;读取第一个数列
mov al, [bx][si]
add al, ah
mov ah, 0
lea bx, num2
add al, [bx][si] ;读取第二个数列
aaa ;BCD矫正
add al, 30h ;变成ASCII码
mov cl, al
inc si
lea bx, num1
mov al, [bx][si] ;第二个数列
add al, ah
mov ah, 0
lea bx, num2
add al, [bx][si]
aaa
add al, 30h
mov ch, al
push cx ;结果放入堆栈,等待输出
inc si
cmp si, num-1 ;循环,读完所有数
jb l2
mov ch, ah
lea dx, res
mov ah, 09h
int 21h
add ch, 30h
output ch

mov al, 0
outl: ;输出结果循环
pop cx
output ch
output cl
inc al
cmp al, num/2
jb outl
quit: ;退出
mov ah, 4ch
int 21h
main endp

input proc near ;输入之程序
start:
mov di, num
l1:
mov ah, 01H ;输入
int 21h
cmp al, 1bh ;ESC退出
jz quit
cmp al, 30h ;(数字)?继续:退出
jb error
cmp al, 40h
ja error
sub al, 30h
dec di
mov [bx][di],al ;存入数据
cmp di, 0
ja l1 ;循环
ret
error: ;输入错误支路
lea dx, msg3
mov ah, 09h
int 21h
mov di, num
jmp start
input endp

code ends
end main
哈哈!本人正在学汇编,这是刚写完的作业!8086汇编,应是楼主要的

这个用汇编?我没看错吧,非常麻烦的,用汇编调用音乐文件,还有界面修饰这些都是非常非常繁琐的。

  • 两位数乘两位数的竖式计算
    答:2位数乘2位数用竖式计算的方法是:相同数位对齐,从个位算起,用第二个因数的每一位去乘第一个因数的每一位,再把所得的结果相加,注意相同数位要对齐。例如:12x13,步骤一:3x12=36步骤二:10x12=120,根据以上计算结果相加为120+36=156。还可以用乘法的意义来计算。
  • 给我出一道两位数乘两位数的题
    答:题目:23×34。解释:这是一个两位数乘两位数的乘法运算。在我们的生活中,这样的计算非常常见,比如购物计算总价、计算房屋面积等。我们可以将这两个数分解为它们的个位和十位数。对于23,它的个位数是3,十位数是2。对于34,它的个位数是4,十位数是3。然后,我们进行两次乘法运算:3×4=12,这...
  • C语言:编写一个简单的两位数加法、减法、乘法、除法计算程序,要求输入...
    答:include<stdio.h> int main(){ int a,b,c;char op;scanf("%d%c%d",&a,&op,&b);switch(op){ case '+':c=a+b;break;case '-':c=a-b;break;case '*':c=a*b;break;case '/':c=a/b;break;default:printf("Error!\n");return 0;} printf("%d%c%d=%d\n",a,op,b,c...
  • 写出15题两位数乘两位数的竖式计算,要有答案
    答:两位数乘两位数 竖式给你举几个例子 剩下的自己思考列下 77 × 76 = 5852 23 × 32 = 736 11 × 22 = 242 56 × 45 = 2520 竖式见图:
  • 用数卡3.8.5.1.6编“两位数乘两位数”或“两位数乘三位数”的题...
    答:1、两位数乘两位数:38 × 51 = 1938 35 × 61 = 2135 2、两位数乘三位数:38 × 516 = 19608 63 × 185 = 11655
  • 用两位数乘两位数的乘法算式
    答:1、乘法交换律:a*b=b*a2、乘法结合律:a*b*c=(a*b)*c=a*(b*c)3、乘法分配律:(a+b)*c=a*c+b*c;(a-b)*c=a*c-b*c二、乘法竖式计算要注意四个问题:1、两个数的最后一位要对齐。2、尽量把数字多的数写在上面,数字少的数写在下面,以减少乘的次数。3、如果两个数的末尾有“0”,写...
  • 两位数乘法练习题
    答:口诀:一个头加1后,头乘头,尾乘尾。例:23×27=?解:2+1=3 2×3=6 3×7=21 23×27=621 注:个位相乘,不够两位数要用0占位。3.第一个乘数互补,另一个乘数数字相同:口诀:一个头加1后,头乘头,尾乘尾。例:37×44=?解:3+1=4 4×4=16 7×4=28 37×44=1628 注:个位...
  • 两位数乘一位数的乘法算式有哪些?
    答:两位数乘一位数的算式有23×4、56×7、98×9、17×5、34×6、93×2、42×3等。计算方法 1、口算法 就是用心算或者说出口来的方法,需要掌握一些乘法口诀和规律,例如:两位数乘以整十数,可以先用两位数乘以十位数,然后在结果后面加一个0。例如:23×40=(23×4)×10=920。两位数乘以个...
  • 两位数乘法的计算方法哪些
    答:简便简便,当然易行,这种方法可归结为十三个字:“头乘头,尾乘尾,尾乘头加头乘尾”.整个运算过程都围绕着这十三个字进行.下面请看我的演算:例1:23x47=?,我们把2和4分别看为第一个数字和第二个数字的头,把3和7分别看为第一个数字和第二个数字的尾.这样,2x4=8, 3x7=21, 2x7+3x4=14+12...
  • 求小学两位数乘法技巧 要适合初学两位数乘法技巧的那种
    答:链接: https://pan.baidu.com/s/1Kqpnn2jvFeSfUe7kFLWvTg 提取码: g6va 《巧虎数学大闯关&九九乘法组》目录:九九乘法歌 数学小高手1-倍数的秘密 数学小高手2-99乘法大发现 数学小高手3-生活中的乘法