五、设计题
1.编程实现求S=(X2
+Y2
)/Z的值,并将结果放人RESULT单元。 ;XT4_5_1.ASM
DATA SEGMENT ;定义数据段 X DW 15 Y DW -32 Z DW 280
RESULT DW 2 DUP(?) ;定义结果保存单元 DATA ENDS ;数据段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA ;初始化DS MOV DS,AX
MOV AX,X ;取出被乘数X存入AX中 IMUL X ;执行X2操作
MOV CX,AX ;乘积的低位字转存至CX MOV BX,DX ;乘积的高位字转存至BX MOV AX,Y ;取出被乘数X存入AX中 IMUL Y ;执行Y2操作
ADD AX, CX ;X2+Y2的低位字与Z的低位字相加 ADC DX, BX ;X2+Y2的高位字相加 IDIV Z ;(X2+Y2)/Z
MOV RESULT,AX ;商存入RESULT单元 MOV RESULT+2,DX ;余数存入RESULT+2单元 MOV AH,4CH
INT 21H ;返回DOS CODE ENDS ;代码段结束 END START ;汇编结束 2.编程序完成计算S=(A+B)/2-2(A AND B)。 ;XT4_5_2.ASM
DATA SEGMENT ;定义数据段 A DW 15 B DW -32 S DW ?
RESULT DW 2 DUP(?) ;定义结果保存单元 DATA ENDS ;数据段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA ;初始化DS MOV DS,AX
MOV AX,A ;取出被乘数A存入AX中 ADD AX, B ;A+B SAR AX,1 ;(A+B)/2 MOV BX,AX ;存入BX中
9
MOV AX,A ;取出被乘数A存入AX中 AND AX, B ;A AND B SAL AX,1 ;(A AND B)*2 SUB BX,AX ; (A+B)/2-2(A AND B) MOV S,BX ;存入S单元 MOV AH,4CH
INT 21H ;返回DOS CODE ENDS ;代码段结束 END START ;汇编结束
3.试编程实现将内存中的若干个无符号字数据中的最大值和最小值找出来,并开辟独立的存储区域保存结果。
;XT4_5_3.ASM DATA SEGMENT
ARR DW 123,456,67,0,34,90,89,67,0,256 CN EQU ($-ARR)/2
ZD DW 0 ;最大(数组中任何数均大于AX内容) ZX DW 0FFFFH ;最小(数组中任何数均小于BX内容) DATA ENDS CODE SEGMENT
ASSUME DS:DATA,CS:CODE START: MOV AX,DATA
MOV DS,AX ;初始化DS MOV SI,OFFSET ARR ;数组首地址送SI MOV CX,CN ;数组元素个数送CX
CALL QZDZXS ;调用近过程QZDZXS(求最大最小数) MOV AH,4CH
INT 21H ;返回DOS ;求最大最小数子程序名:QZDZXS
;子程序功能:求一组字数据中的最大最小数 ;入口参数:数组首地址在SI中,数组个数在CX中 ;出口参数:最大数在ZD中,最小数在ZX中 ;使用寄存器:CX、DX、SI及PSW QZDZXS PROC NEAR PUSH SI PUSH DX
PUSH CX ;保护现场
ZDZX0: MOV DX,[SI] ;取一个数组元素送DX CMP ZD,DX ;AX中内容和DX中内容比较 JNB ZDZX1 ;(ZD)>(DX),转ZDZX1 MOV ZD,DX ;较大数存入ZD
ZDZX1: CMP ZX,DX ;AX中内容和DX中内容比较 JNA ZDZX2 ;(ZX)<(DX),转ZDZX1 MOV ZX,DX ;较小数存入ZX ZDZX2: ADD SI,2 ;数组指针加2调整
10
LOOP ZDZX0 ;循环控制 POP CX POP DX
POP SI ;恢复现场 RET ;返回主程序 QZDZXS ENDP ;子程序定义结束 CODE ENDS ;代码段结束 END START ;汇编结束 4.编写程序,计算如下函数的值:
;XT4_5_4.ASM
DATA SEGMENT X DB 15 S DB ? DATA ENDS
CODE SEGMENT
ASSUME DS:DATA, CS:CODE START: MOV AX,DATA MOV DS,AX MOV AL,X TEST AL,80H JZ LL0
SAL AL,1 ;2X JMP LL10 LL0: CMP AL,10 JG LL1 MOV BL,AL
SAL AL,1 ;3X ADD AL,BL JMP LL10
LL1: SAL AL,1 ;4X SAL AL,1 LL10: MOV S,AL MOV AH,4CH
INT 21H ;返回DOS CODE ENDS
END START ;汇编结束
5.从键盘输入一系列字符,以回车符结束,编写程序统计其中非数字字符的个数?;XT4_5_5.ASM
DATA SEGMENT
NUM DB 0 ;统计变量 DATA ENDS
STACK SEGMENT STACK ;定义堆栈段
DB 100 DUP(?) ;开辟100个存储单元 STACK ENDS ;堆栈段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,SS:STACK,DS:DATA START: MOV AX,DATA
11
MOV DS,AX
LLL: MOV AH,01H ;1号调用,从键盘输入一字符存入AL INT 21H
CMP AL,13 ;与“回车符”的ASCII码比较 JZ L2 ;是“回车符”,转L2(退出) CMP AL,30H ;与“0”的ASCII码比较
JB L1 ;低于“0”的非数字字符ASCII码,转L1(统计)。 CMP AL,39H ;与“9”的ASCII码比较
JA L1 ;高于“9”的非数字字符ASCII码,转L1(统计)。 JMP LLL
L1: INC NUM ;非数字字符,统计;计数增1。
JMP LLL ;转LLL(继续) L2: MOV DL,0AH ;设置换行符 MOV AH,02H ;设置显示功能号 INT 21H ;换行
MOV DL,NUM ;设置显示统计数字(8位二进制数) MOV CL,4
SHR DL,CL ;保留高4位二进制数
OR DL,30H ;转换成ASCII码(高1位十六制数的ASCII) MOV AH,02H ;设置显示功能号
INT 21H ;显示高1位十六制数的ASCII MOV DL,NUM ;设置显示统计数字(8位二进制数) AND DL,0FH ; 保留低4位二进制数
OR DL,30H ;转换成ASCII码(低1位十六制数得ASCII) MOV AH,02H ; 设置显示功能号
INT 21H ; 显示低1位十六制数的ASCII MOV DL,’H’ ; 设置显示’H’ MOV AH,02H ; 设置显示功能号 INT 21H ; 显示’H’
MOV AH,4CH ;设置返回DOS功能码。 INT 21H ;返回DOS CODE ENDS ;代码段结束 END START ;程序汇编结束
6.编程实现将键盘连续输入的小写字母用大写字母显示出来,小写字母与大写字母之间采用 “-”号分隔,当输入非小写字母时程序停止处理。 ;XT4_5_6.ASM
STACK SEGMENT STACK ;定义堆栈段 DB 100 DUP(?) ;开辟100个存储单元 STACK ENDS ;堆栈段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,SS:STACK
START: MOV AH,01H ;1号调用,从键盘输入一字符存入AL INT 21H ;输入并回显
MOV BL,AL ;保存从键盘输入字符 CMP AL,?a? ;与“a”的ASCII码比较
JB L3 ;低于“a”的ASCII码,转L3(退出)。 CMP AL,?z? ;与“z”的ASCII码比较
JA L3 ;高于“a”的ASCII码,转L3(退出)。
SUB AL,20H ;将AL中字符的ASCII码减去20H变成大写字母。
12