1、00000000000000145、运行结果 图3 乘法运算运行结果6、源代码及注释data segment info1 db Input the first number:,0dh,0ah,$ info2 db 0dh,0ah,Input the second number: info3 db 0dh,0ah,The result is: info4 db 0dh,0ah,Error, one db 11 dup(?) two db 11 dup(? x db 4 dup(? y db 4 dup(? p dw 4 dup(?data endssstack segment stack sta
2、ck db 100h dup(?sstack endscode segmentmain proc far assume cs:code,ds:datastart: mov ax,data mov ds,ax mov dx,offset info1 ; 显示提示信息info1 mov ah,09h int 21h mov dx,offset one ;输入被乘数 mov bx,dx mov bx,byte ptr 9 mov ah,0ah int 21h call check ;检查输入字符的长度mov dx,offset x mov si,dx ;定义指针si指向变量x,作为子程序change
3、的入口参数 mov dx,offset one call change ;将输入的被乘数转化为十六进制数,并赋值给变量x mov dx,offset info2 ; mov dx,offset two ;输入乘数 mov ah,0ah mov dx,offset y 定义指针si指向变量y,作为子程序change的入口参数将输入的被乘数转化为十六进制数,并赋值给变量y mov ah,x+2 mov al,x+3 ;x1 mov bh,y+2 mov bl,y+3 ;y1 mul bx ;x1*y1 mov p+2,dx mov p,ax mov ah,x mov al,x+1 ;x2x2*y1
4、 add p+2,ax adc p+4,dx mov bh,y mov bl,y+1 ;y2x1*y2 adc p+6,0x2*y2 add p+4,ax adc p+6,dx mov dx,offset info3 ; 显示提示信息info3 mov ah,09 int 21h mov bx,offset p call displ ;显示计算结果 mov ah,4chmain endpchange proc ;以2个字符一组,将其从ASCII码转化为相应的十六进制数 add bx,2 mov cx,0404hloop1: mov al,bx sub al,30h cmp al,0ah jb
5、L1 sub al,07h cmp al,10h sub al,20h mov dx,offset info4L1: shl al,cl push ax mov al,bx+1 jb L2L2: mov dl,al pop ax add al,dl mov ds:si,al inc si dec ch jnz loop1 retchange endpdispl proc ;以2位十六进制数一组,先显示高位数,后显示低位数 mov ch,8loop2: mov al,bx+7 and al,0f0h mov cl,4 shr al,cl add al,30h cmp al,3ah jb ds1
6、add al,7ds1: mov ah,2 and ax,0fh jb ds2ds2: dec bx jnz loop2displ endpcheck proc ;检查输入的字符个数是否为8个,不足时在前面补0 mov ch,bx+1 sub al,ch mov cl,al je ch4ch1: inc bx sub ch,1 jne ch1 mov ch,clch2: mov bx,byte ptr 30h jne ch2 add bx,9ch3: mov bx,al jne ch3ch4:check endpcode ends end start 题目二 递归调用子程序设计1、设计分析 有
7、n个人坐在一起,第n个人比第n-1个人大h岁。第n-1个人比第n-2个人大h岁。以此类推,第2个人比第1个人大h岁。第1个人m岁。请问第n个人多大。用递归调用的方法设计程序完成题目。(2)设计要求:1)从键盘输入人数、第一个人的年龄和年龄差距2)结果显示于屏幕上 (3)设计过程:1) 定义数据段用于存储输出提示字符。 2)从键盘输入人数n存进寄存器bl,第一个人的年龄m存进寄存器cl,年龄出差距h存进寄存器ch。 3)递归调用age,算出第n个人的年龄,并把结果存在寄存器bx里。4)将结果(第n个人的年龄)向屏幕输出。2、 算法:age(n)=age(n-1)+hage(n-1)=age(n-
8、2)+hage(n-2)=age(n-3)+h age(2)=age(1)+h age(1)=m通用公式:age(n)=age(n-1)+h 当n1时age(1)=m 当n=1时3、 程序流程图:图4 递归调用子程序的程序流程图4、 测试数据:人数第一个人的年龄年龄差距第n个人的年龄0510020180280505、运行结果:图5 递归调用子程序的运行结果info1 db Input the number of people(199):info2 db 0dh,0ah,The last people age is:info3 db 0dh,0ah,Input first people age:
9、info4 db 0dh,0ah,age change:info5 db 0dh,0ah,Input Errorcr db 0dh,0ah,keybuf db 4 dup(?sstack st1 db 100 dup(?data,ss:sstackInput1: mov dx,offset info1 ;显示提示信息info1,提示输入人数 mov dx,offset keybuf ; 输入人数 mov bx,byte ptr 3 push dx lea dx,cr ;回车换行 pop dx call change ;将输入的人数转化为对应的十进制数 sub ch,0ffh ;若输入的非十进制
10、数,则重新输入人数 je Input1Input2: mov dx,offset info3 ;显示提示信息info3,提示输入第一个人年龄输入第一个人年龄 mov bx,byte ptr 3 push dx mov ah,09h 将输入的第一个人的年龄转化为对应的十进制数 sub ch,0ffh ;若输入的非十进制数,则重新输入第一个人的年龄 je Input2Input3: mov dx,offset info4 ;显示提示信息info4,提示输入年龄差距输入年龄差距 lea dx,cr ; call change ;将输入的年龄差距转化为对应的十进制数 sub ch,0ffh ;若输入的
11、非十进制数,则重新输入年龄差距 je Input3 pop cx;age change pop bx;first peoples age pop ax;number of people mov dx,0 call age ;递归调用子程序age mov dx,offset info2 ;显示提示信息info2,提示输出结果 call dispchange proc ;将输入的字符转化为相应的十进制数 lea dx,info5 mov ch,0ffh jmp L3 mov al,cl mov bl,0ah mul blL3: ret age proc ;通过递归调用可计算出最后一个人的年龄 cmp al,1 jnz chn mov dl,blchn: dec al call age add dl,clage endpdisp proc ;将计算结果以十进制数显示 mov cl,08h xor ax,ax mov ax,bx mov dl,100 div dl add al,30h ;显示百位数 shr ax,cl mov dl,10 显示十位数显示个位数disp endp end start
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1