CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,A MOV BL,B XOR AL,BL TEST AL,01H JZ SAME
TEST BL,01H JZ DONE XCHG BL,A MOV B,BL JMP DONE SAME:TEST BL,01H JZ DONE INC A INC B
DONE:MOV AH,4CH INT 21H CODE ENDS
END START
7.试编制一个程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存入AX中。
答: MYDATA SEGMENT
DATA DW 100 DUP(?) NUM DB 100 MYDATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:MYDATA START:MOV AX,DATA MOV DS,AX MOV CX,NUM MOV SI,0 MOV AX,32766
AGAIN:TEST DATA[SI],1 JNZ NEXT
COMPARE:CMP AX,DATA[SI] JLE NEXT
MOV AX,DATA[SI] NEXT:ADD SI,2 LOOP AGAIN EXIT:MOV AH,4CH INT 21H
CODE ENDS
END START
8.已知从符号地址M开始的内存单元中存放有15个16位带符号数,试编制一个程序,将正数依次存放在以符号地址P开始的内存单元中,再将负数依次存放到以符号地址N开始的内存单元中,并将整数和负数的个数显示出来。 答: DATA SEGMENT
M DW 15 DUP(?) P DW 15 DUP(?) N DW 15 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,15 MOV SI,0 MOV BX,0 MOV DI,0 AGAIN:MOV AX,M[SI] CMP AX,0 JL STEP1 MOV P[BX],AX INC BX JMP NEXT STEP1:MOV N[DI],AX INC DI NEXT:INC SI
LOOP AGAIN
;输出正负数据个数子程序 MOV AH,4CH INT 21H CODE ENDS
END START
9.已知数组A1中包含有15个互不相等的整数,数组A2中含有20个互不相等的整数,试编制一个程序,把既在A1又在A2中出现的整数存放在以符号地址为E开始的内存单元中。 答: DATA SEGMENT
A1 DW 15 DUP(?) A2 DW 20 DUP(?) E DW 15 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA
MOV DS,AX MOV CX,15 MOV SI,0 MOV DI,0 MOV BX,0 AGAIN:MOV DX,CX MOV AX,A1[SI] MOV DI,0 MOV CX,20 COMPARE:CMP AX,A2[DI] JE MATCH ADD DI,2 LOOP COMPARE JMP COMMON
MATCH:MOV E[BX],AX ADD BX,2 COMMON:ADD SI,2 MOV CX,DX LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS
END START
10.已知有N个整数a1,a2,…,an已存放在从A开始的内存单元中,试编制一个程序将其中的负数删去,而把留下的正数依次重新存放在从A开始的内存单元中。 分析:如果当前位置元素小于0,则将当前位置后面第一个大于0的元素放到当前位置,同时将这一位置值置为-1;当该位置后面再没有大于0的元素时,依次将后面各位置元素清0即可(假设初始时所有元素都不等于0) 答: DATA SEGMENT
A DW a1,a2,?,an N DB ($-A)/2 DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,0 MOV DI,2 MOV CX,N AGAIN:MOV DX,CX
MOV AX,A[SI] CMP AX,0 JL LOOP1
JMP COMMON LOOP1:DEC CX
NEXT:MOV AX,A[DI] COM AX,0 JG NEXT2 ADD DI,2 LOOP NEXT
JMP EXIT ;后面已经没有正数,重新排序完毕 NEXT2:MOV A[SI],AX MOV A[DI],-1 COMMON:ADD SI,2 MOV DI,SI ADD DI,2 MOV CX,DX LOOP AGAIN EXIT:MOV CX,N SHR SI SUB CX,SI SHL SI
NEXT3:MOV A[SI],0 ADD SI,2 LOOP NEXT3 MOV AH,4CH INT 21H CODE ENDS
END START
第5章 子程序及宏指令设计
1.调用子程序指令的功能是什么?其操作过程包含哪几个步骤? 答:功能:保存返回地址和调用子程序 步骤:(1) 返回地址入栈(2) 用子程序名所代表的子程序入口地址修改IP指令指针寄存器,如果子程序属性是FAR型的,属于跨段调用,还要修改CS寄存器的值(3) 根据IP(和CS)值转到子程序执行
2.试编制一个多精度数求补的子程序,为提高程序的通用性,要求调用子程序时把多精度数的首地址放在SI中(低字节放低位、高字节放高位),多精度数字节数放在CL中。
答: MULNEG PROC NEAR
MOV DI,SI ;保留首地址
MOV CH,00H ;字节数放CL中,将CH清零 PUSH CX
L1:NOT [SI] ;多精度数各字节取反 INC SI LOOP L1
POP CX MOV SI,DI
STC ;将CF置为1,结合ADC语句,实现加1操作
L2:ADC BYTE PTR[SI],0 INC SI LOOP L2 RET MULNEG ENDP
3.试编制两个长度不同的多精度整数求和子程序,为提高程序的通用性,要求调用子程序时把两个多精度数的首地址分别放在SI、DI中(低字节放低位、高字节放高位),多精度数字节数分别放在CL、CH中。 答:求得的和放在较长的多精度整数的存储区
ADDITION PROC NEAR
CLC ;ZF清零 CMP CL,CH
JGE CA ;第一个多精度数较长 CR: MOV AL,[SI] ADC [DI],AL INC DI INC SI DEC CL JNZ CR JMP EXIT CA: MOV AL,[DI] ADC [SI],AL INC DI INC SI DEC CH JNZ CA EXIT: RET
ADDITION ENDP
4.试编写一个子程序用以统计字数组中零元素的个数,参数采用堆栈传递,入口参数为:数组存储区首地址,数组长度N。出口参数为零元素的个数,并写出CALL指令执行前后,以及RET指令执行前后,堆栈情况。 答: SSTACK SEGMENT DW 16 DUP(?) TOS LABEL WORD SSTACK ENDS
DATA SEGMENT
ARRAY DW 2,63,5,0,-4,-16,0,9 N DW ($-ARRAY)/2 COUNT DW 0 DATA ENDS
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库汇编语言程序设计课后习题解答宋人杰版(4)在线全文阅读。
相关推荐: