1、2.9 请将下列左边的项和右边的解释联系起来(把所选字母放在括号中):(1) CPU (M) A.保存当前栈顶地址的寄存器。(2) 存储器 (C) B.指示下一条要执行的指令的地址。(3) 堆栈 (D) C.存储程序、数据等信息的记忆装置,微机有 RAM 和 ROM(4) IP (B) D.以后进先出方式工作的存储空间。(5) SP (A) E.把汇编语言程序翻译成机器语言程序的系统程序。(6) 状态标志 (L) F.唯一代表存储空间中每个字节单元的地址。(7) 控制标志 (K) G.能被计算机直接识别的语言。(8) 段寄存器 (J) H.用指令的助记符、符号地址、标号等符号书写程序的语言。(
2、9) 物理地址 (F) I.把若干个模块连接起来成为可执行文件的系统程序。(10) 汇编语言 (H) J.保存各逻辑段的起始地址的寄存器,8086/8088 机有四个(11) 机器语言 (G) K.控制操作的标志,如 DF 位。(12) 汇编程序 (E) L.记录指令操作结果的标志,共 6 位:OF、SF、ZF、AF 、PFCF。(13) 连接程序 (I) M.分析、控制并执行指令的部件,由算术逻辑部件 AU 和寄。(14) 指令 (O) N.由汇编程序在汇编过程中执行的指令。(15) 伪指令 (N) O.告诉 CPU 要执行的操作( 一般还要指出操作数地址),在程3.8 假定(DS)=200
3、0H,(ES)=2100H ,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010 数据段中变量名VAL 的偏移地址为 0050H,试指出下列源操作数字段的寻址方式是什么物理地址值是多少?(1) MOV AX, 0ABH 立即方式; 操作数在本条指令中(2) MOV AX, BX 寄存器寻址方式; 操作数为 (BX)=0100H(3) MOV AX, 100H 直接寻址方式; PA=20100H(4) MOV AX, VAL 直接寻址方式; PA=20050H(5) MOV AX, BX BX 寄存器间接寻址方式; PA=20100H(6) MOV AX, ES
4、:BX 附加段 BX 寄存器间接寻址方式; PA=21100H(7) MOV AX, BP BP 寄存器间接寻址方式; PA=15010H(8) MOV AX, SI SI 寄存器间接寻址方式; PA=200A0H(9) MOV AX, BX+10 BX 寄存器相对寻址方式; PA=20110H(10) MOV AX, VALBX BX 寄存器相对寻址方式; PA=20150H(11) MOV AX, BXSI BX 和 SI 寄存器基址变址寻址方式; PA=201A0H(12) MOV AX, VALBXSI BX 和 SI 寄存器相对基址变址寻址方式; PA=201F0H3.10 如 TA
5、BLE 为数据段中 0032 单元的符号名,其中存放的内容为 1234H,试问以下两条指令有什么区别?指令执行完后 AX 寄存器的内容是什么?MOV AX, TABLELEA AX, TABLE答:MOV AX, TABLE 是将 TABLE 单元的内容送到 AX,(AX)=1234HLEA AX,TABLE 是将 TABLE 单元的有效地址送到 AX,(AX)=0032H3.11 执行下列指令后 AX 寄存器中的内容是什么?TABLE DW 10, 20, 30, 40, 50 ;000AH, 0014H, 001EH, 0028H, 0032HENTRY DW 3MOV BX, OFFSE
6、T TABLEADD BX, ENTRYMOV AX, BX答:(AX)=1E00H3.14 设(DS)=1B00H ,(ES)=2B00H,有关存储单元的内容如上右图所示。请写出两条指令把字变量 X 装入AX 寄存器。答: MOV BX, 2000HMOV AX, ES:BX3.27 假定(DX)=0B9H,(CL)=3,(CF)=1,确定下列各条指令单独执行后 DX 中的值。(1) SHR DX, 1 ;(DX)=05CH(2) SAR DX, CL ;(DX)=17H(3) SHL DX, CL ;(DX)=5C8H(4) SHL DL, 1 ; (DX)=72H(5) ROR DX,
7、CL ;(DX)=2017H(6) ROL DL, CL ;(DX)=0CDH(7) SAL DH, 1 ;(DX)=0B9H(8) RCL DX, CL ;(DX)=2CCH(4) RCR DL, 1 ;(DX)=0DCH3.36 假设 X 和 X+2 单元的内容为双精度数 p,Y 和 Y+2 单元的内容为双精度数 q,(X 和 Y 为低位字)试说明下列程序段做什么工作?MOV DX, X+2MOV AX, XADD AX, XADC DX, X+2CMP DX, Y+2JL L2JG L1CMP AX, YJBE L2L1: MOV AX, 1JMP SHORT EXITL2: MOV A
8、X, 2EXIT:INT 20H答:此程序段判断 p*2q,则使 (AX)=1 后退出;p*2 q,则使(AX)=2 后退出。3.38 在下列程序的括号中分别填入如下指令:(1) LOOP L20 (2) LOOPE L20 (3) LOOPNE L20试说明在三种情况下,当程序执行完后,AX、BX、CX、DX 四个寄存器的内容分别是什么?TITLE EXLOOP.COMCODESG SEGMENTASSUME CS:CODESG, DS: CODSEG, SS: CODSEGORG 100HBEGIN: MOV AX, 01MOV BX, 02MOV DX, 03MOV CX, 04L20:
9、 INC AXADD BX, AXSHR DX, 1( )RETCODESG ENDSEND BEGIN答:(1) (AX)=5H,(BX)=10H ,(CX)=0H ,(DX)=0H(2) (AX)=2H,(BX)=4H ,(CX)=3H,(DX)=1H(3) (AX)=3H,(BX)=7H ,(CX)=2H,(DX)=0H4.1 指出下列指令的错误: (1) MOV AH, BX ;寄存器类型不匹配(2) MOV BX, SI ;不能都是存储器操作数(3) MOV AX, SIDI ;SI 和DI不能一起使用(4) MOV MYDAT BXSI, ES:AX ;AX 寄存器不能使用段超越(
10、5) MOV BYTE PTR BX, 1000 ;1000 超过了一个字节的范围(6) MOV BX, OFFSET MYDAT SI ;MYDAT SI已经是偏移地址 ,不能再使用 OFFSET(7) MOV CS, AX ;CS 不能用作目的寄存器(8) MOV ECX, AX ;两个操作数的数据类型不同4.2 下面哪些指令是非法的?(假设 OP1,OP2 是已经用 DB 定义的变量)(1) CMP 15, BX ;错,立即数不能作为目的操作数(2) CMP OP1, 25(3) CMP OP1, OP2 ;错,不能都是存储器操作数(4) CMP AX, OP1 ;错,类型不匹配,应为
11、CMP ax, word ptr op14.10 假设程序中的数据定义如下:LNAME DB 30 DUP (?)ADDRESS DB 30 DUP (?)CITY DB 15 DUP (?)CODE_LIST DB 1, 7, 8, 3, 2(1) 用一条 MOV 指令将 LNAME 的偏移地址放入 AX。(2) 用一条指令将 CODE_LIST 的头两个字节的内容放入 SI。(3) 用一条伪操作使 CODE_LENGTH 的值等于 CODE_LIST 域的实际长度。答:(1) MOV AX, OFFSET LNAME(2) MOV SI, WORD PTR CODE_LIST(3) COD
12、E_LENGTH EQU $ - CODE_LIST ;此语句必须放在 CODE_LIST 语句之后4.13 对于下面的数据定义,三条 MOV 指令分别汇编成什么? (可用立即数方式表示)TABLEA DW 10 DUP (?)TABLEB DB 10 DUP (?)TABLEC DB 1234MOV AX, LENGTH TABLEA ;汇编成 MOV AX, 000AHMOV BL, LENGTH TABLEB ;汇编成 MOV BL, 000AHMOV CL, LENGTH TABLEC ;汇编成 MOV CL, 0001H4.14 对于下面的数据定义,各条 MOV 指令单独执行后,有关
13、寄存器的内容是什么?FLDB DB ?TABLEA DW 20 DUP (?)TABLEB DB ABCD(1) MOV AX, TYPE FLDB ;(AX)=0001H(2) MOV AX, TYPE TABLEA ;(AX)=0002H(3) MOV CX, LENGTH TABLEA ;(CX)=0014H(4) MOV DX, SIZE TABLEA ;(DX)=0028H(5) MOV CX, LENGTH TABLEB ;(CX)=0001H4.19 试说明下述指令中哪些需要加上 PTR 操作符:BVAL DB 10H,20HWVAL DW 1000H(1) MOV AL,BVA
14、L ;不需要(2) MOV DL,BX ;不需要(3) SUB BX,2 ;需要,如 SUB BYTE PTR BX,2(4) MOV CL,WVAL ;需要,如 MOV CL,BYTE PTR WVAL(5) ADD AL,BVAL+1 ;不需要5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。答:TEXT SEGMENTASSUME CS : TEXTSTART: MOV AH , 1INT 21HCMP AL, aJB STOPCMP AL, zJA STOPSUB AL, 20HMOV DL, ALMOV AH, 2INT 21HJMP STARTSTOP:
15、RETTEXT ENDS5.3 将 AX 寄存器中的 16 位数分成 4 组,每组 4 位,然后把这四组数分别放在 AL、BL 、CL 和 DL 中。答:程序段如下:DSEG SEGMENTSTORE DB 4 DUP (?)DSEG ENDSBEGIN: MOV CL, 4 ;右移四次MOV CH, 4 ;循环四次LEA BX, STOREA10: MOV DX, AXAND DX, 0FH ;取 AX 的低四位MOV BX, DL ;低四位存入 STORE 中INC BXSHR AX, CL ;右移四次DEC CHJNZ A10 ;循环四次完了码?B10: MOV DL, STORE ;四
16、组数分别放在 AL、BL、CL 和 DL 中MOV CL, STORE+1MOV BL, STORE+2MOV AL, STORE+3STOP: RET5.4 试编写一程序,要求比较两个字符串 STRING1 和 STRING2 所含字符是否完全相同,若相同则显示MATCH, 若不相同则显示NO MATCH。答:程序如下:DSEG SEGMENTSTRING1 DB I am a student.STRING2 DB I am a student!YES DB MATCH, 0DH, 0AH, $NO DB NO MATCH, 0DH, 0AH, $DSEG ENDS;-CSEG SEGMEN
17、TMAIN PROC FARASSUME CS: CSEG, DS: DSEG, ES: DSEGSTART: PUSH DS ;设置返回 DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给 DS 赋值MOV ES, AX ;给 ES 赋值BEGIN: LEA SI, STRING1 ;设置串比较指令的初值LEA DI, STRING2CLDMOV CX, STRING2 - STRING1REPE CMPSB ;串比较JNE DISPNOLEA DX, YES ;显示 MATCHJMP DISPLAYDISPNO: LEA DX, NO ;显示 NO
18、MATCHDISPLAY: MOV AH, 9 ;显示一个字符串的 DOS 调用INT 21HRETMAIN ENDPCSEG ENDS ;以上定义代码段;-END START5.11 从键盘输入一系列以 $为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。答:程序段如下:DSEG SEGMENTBUFF DB 50 DUP ()COUNT DW 0DSEG ENDSBEGIN: LEA BX, BUFFMOV COUNT, 0INPUT: MOV AH, 01,从键盘输入一个字符的功能调用INT 21HMOV BX, ALINC BXCMP AL, $,是 $结束符吗?JNZ
19、INPUT,不是,继续输入LEA BX, BUFF,对非数字字符进行计数NEXT: MOV CL, BXINC BXCMP CL, $,是$结束符,则转去显示JZ DISPCMP CL, 30H,小于 0 是非数字字符JB NEXTCMP CL, 39H,大于 9 是非数字字符JA NEXTINC COUNT,个数+1JMP NEXTDISP: ,16 进制数显示程序段(省略)分析下面的程序,画出堆栈最满时各单元的地址及内容。;*S_SEG SEGMENT AT 1000H ;定义堆栈段DW 200 DUP (?) ;200*2=190HTOS LABEL WORDS_SEG ENDS;*C_
20、SEG SEGMENT ;定义代码段ASSUME CS: C_SEG, SS: S_SEGSTART: MOV AX, S_SEGMOV SS, AXMOV SP, OFFSET TOSPUSH DSMOV AX, 0PUSH AXPUSH T_ADDRPUSH AXPUSHFPOPF(FLAGS)(AX)T_ADDR0000(DS)1000:0184:0186:0188:018A:018C:018ESP:01866.3 题堆栈最满时各单元的地址及内容POP AXPOP T_ADDRRET;-C_SEG ENDS ;代码段结束;*END START ;程序结束8.5 假定串行通讯口的输入数据寄
21、存器的端口地址为 50H,状态寄存器的端口地址为 51H,状态寄存器各位为 1 时含义如右图所示,请编写一程序:输入一串字符并存入缓冲区 BUFF,同时检验输入的正确性,如有错则转出错处理程序 ERROR_OUT。答:程序段如下:MOV DI, 0MOV CX, 80 ;最多输入 80 个字符BEGIN: IN AL, 51H ;查询输入是否准备好?TESTAL, 02HJZ BEGININ AL, 50H ;输入数据并存入缓冲区 BUFFMOV BUFFDI, ALINC DIIN AL, 51H ;判断是否有错?TESTAL, 00111000BJNZ ERROR_OUTLOOP BEGI
22、N8.6 试编写程序,它轮流测试两个设备的状态寄存器,只要一个状态寄存器的第 0 位为 1,则就与其相应的设备输入一个字符;如果其中任一状态寄存器的第 3 位为 1,则整个输入过程结束。两个状态寄存器的端口地址分别是 0024H 和 0036H,与其相应的数据输入寄存器的端口地址则为 0026H 和 0038H,输入字符分别存入首地址为 BUFF1 和 BUFF2 的存储区中。答:程序段如下:MOV DI, 0MOV SI, 0BEGIN: IN AL, 24HTESTAL, 08H ;查询第一个设备的输入是否结束?JNZ EXITTESTAL, 01H ;查询第一个设备的输入是否准备好?JZ BEGIN1IN AL, 26H ;输入数据并存入缓冲区 BUFF1MOV BUFF1DI, ALINC DIBEGIN1: IN AL, 36HTESTAL, 08H ;查询第二个设备的输入是否结束JNZ EXITTESTAL, 01H ;查询第二个设备的输入是否准备好?JZ BEGININ AL, 38H ;输入数据并存入缓冲区 BUFF2MOV BUFF2SI, AL输入数据准备好7 6 5 4 3 2 1 0输出寄存器空奇偶校验错溢出错格式错8.3 状态寄存器各位含义INC SIJMP BEGINEXIT: