标程序.OBJ连接生成执行程序.EXE)、运行(在DOS状态下,直接运行执行程序)、调试(运用调试程序DEBUG.EXE将执行程序跳入调试界面状态,并进行断点设置调试运行或单步调试运行操作)汇编语言源程序的过程和步骤。P94
3.什么是伪指令(发送给汇编程序的命令)?程序中经常使用的伪指令有哪些(数据定义、符号定义、段定义、过程定义、结构定义、模块定义与连接、程序计数器$和起点定义ORG)?简述其主要功能(数据定义为变量及其类型分配存储单元,并赋予初值;符合定义给一个符号重新命名;段定义指定逻辑段的名称、范围、断的定位类型、组合类型和类别;过程定义为程序段定义成过程,并赋予过程名字,以便用CALL指令调用;结构定义用于相互关联的数据定义;模块定义与连接用NAME为源程序汇编后的目标程序指定模块名,以便连接该目标模块,并生成执行程序文件;$在汇编过程中,用于存储单元分配计数器,该计数器可在指令操作数表达式中引用;ORG为数据变量和程序段指定起始位置。)?P87~P93
4.什么是宏指令(代表某功能的一段源程序)?宏指令在程序中如何被调用(在源程序中,通过宏名字(即宏指令名)进行调用)?P107
5.子程序与宏指令在程序的使用中有何共性(宏和子程序都可用来简化程序,并可使程序多次对它们调用。)及不同特点(宏操作可直接传递和接收参数,不通过堆栈或其他媒介;子程序不能直接带参数,需有传递参数时,必须通过堆栈寄存器和存储器进行。宏调用只能简化源程序的书写,并没有缩短目标代码长度;子程序调用能缩短目标程序长度。应用好操作并不会在执行目标代码时增加额外的时间开销;子程序调用由于需要保护和恢复现场和断点,因而延长目标程序的执行时间)?P109 五、设计题
22
1.编程实现求S=(X+Y)/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中
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调整 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 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功能码。
相关推荐: