将R16进制转换器成10进制 63Q等于

当前位置: >>
>> 汇编语言各章习题答案
各章习题答案第一章练习题 1.将下列十进制数转换为二进制、八进制和十六进制数: 37,51,73,92,511 答:37D=Q=25H 51D=Q=33H 73D=1Q=49H 92D=4Q=5CH 511D=B=777Q=1FFH 2.将下列二进制数转换
为十进制、八进制和十六进制数: 110100 答:1Q=81H=129D 1Q=99H=153D 7Q=FFH=255D 4Q=F4H=244D 3.将下列十六进制数转换为二进制和十进制数: 325,FF,1AB,2EC 答:325H=B=805D FFH=5D 1ABH=B=427D 2ECH=B=748D 4.将下列十进制数转换为 BCD 码表示: 121,46,732,1281 答:121D=(01)BCD 46D=()BCD 732D=(10)BCD 1281=(00,0001)BCD 5.将下列二进制补码转换为十进制数: 000000 答:[]补=-()B=-6AH=-106D [] 补=+0101010B=+2AH=+42D1 [] 补=-()B=-12H=-18D [] 补=-()B=-40H=-64D 6.已知[X]补=1100000B,[Y]补=0100100B,[Z]补=0011001B。求[-X]补,[-Y]补, [-Z]补;并计算[X-Y]补=?[X-Z]补=?若有溢出请给以说明。 解:[-X]补=-[X]补=-00000B,[-Y]补=-[Y]补=-11100B, [-Z]补=-[Z]补=-00111B [X-Y] 补 =[X] 补 +[-Y] 补 =1100000B + , 011,1100B 有溢出,因为 CP ⊕ CF=1; [X-Z]补=[X]补+[-Z]补=1100000B +, 100,0111B 无溢出, 因为 CP⊕CF=0第二章练习题 1.8086CPU 由 EU 和 BIU 两部分组成。 2.8086CPU 的基本总线周期由 4 个时钟周期组成,分别用 T1、T2 、T3、 T4 表示。 3.存储单元的物理地址的计算用公式表示为:物理地址 = 段地址 ×16 + 偏移地址 。 4.标志寄存器中共有 9 个有效位用来存放 条件 标志和 控制 标 志,其中 CF 表示 进位 标志。 5.在 8086 中,奇地址存储体与系统的高 八 位 数据 线相连。访问存 储器时,当读/写奇地址存储体时,数据从 D8~D15 上传送。 6.堆栈操作是 字 操作。 7.当 CPU 访问存储器时,需利用 M / IO 信号的 高 电平;而访问 外设接口时,需利用该信号的 低 电平。第三章练习题 1、试分别说明下列各指令中源操作数和目的操作数的寻址方式: ① AND AX,0FFH ② AND BL,[0FFH] ③ MOV DS,AX ④ CMP [SI],CX ⑤ MOV DS:[0FFH],CL ⑥ SUB [BP][SI],AH2 ⑦ ADC ⑨ PUSH 答: 指令 ① AND ② AND ③ MOV ④ CMP ⑤ MOV ⑥ SUB ⑦ ADC ⑧ OR ⑨ PUSH ⑩ CMCAX,0ABH[BX] DS⑧ OR ⑩ CMC 源操作数寻址方式DX,-35[BX][DI]目的操作数寻址方式 寄存器 寄存器 寄存器 寄存器间接寻址 直接寻址 基址变址寻址 寄存器 寄存器 寄存器间接寻址 隐含寻址AX,0FFH BL,[0FFH] DS,AX [SI],CX DS:[0FFH],CL [BP][SI],AH AX,0ABH[BX] DX,-35[BX][DI] DS立即数 直接寻址 寄存器 寄存器 寄存器 寄存器 变址寻址 基址变址相对寻址 寄存器 隐含寻址2、试分别指出下列各指令语句的语法是否有错,若有错,指明是什么错误。 ① MOV [BX][BP],AX ② TEST [BP],BL ③ ADD [SI],DA_BYTE ④ AND DH,DL ⑤ CMP CL,1234H ⑥ SHR [BX][DI],3 ⑦ NOT CX,AX ⑧ LEA DS,35[SI] ⑨ INC CX,1 ⑩ INC [DI] 答: 指令 ① MOV ② TEST ③ ADD ④ AND ⑤ CMP ⑥ SHR ⑦ NOT ⑧ LEA ⑨ INC ⑩ INC [BX][BP],AX [BP],BL [SI],DA_BYTE DH,DL CL,1234H [BX][DI],3 CX,AX DS,35[SI] CX,1 [DI] 正确 正确 正确 不匹配,一个是字节,一个是字 右移 3 位不能用立即数 NOT 是单操作数指令 LEA 不能给段寄存器赋值 INC 指令本身就是加 1,是单操作数指令 寄存器间址没说明是字操作还是字节操作 错误原因 不能使用两个基址寄存器寻址3、下面二条指令执行后,标志寄存器中 CF、AF、ZF、SF 和 OF 分别是什么 状态?3 =MOV AL,86 ADD AL,0AAH 答:CF=1;AF=1;ZF=0;SF=0;OF=1 4、设(SS)=1200H, (SP)=2100H, (AX)=1234H, (BX)=6789H ①执行指令 PUSH AX 后, (SP)= 20FEH ②再执行指令 PUSH BX,及 POP AX 后, (SP)= 20FEH , (AX) 6789H 。 5、已知程序段如下: MOV AL,56H MOV CL,4 ROL AL,CL 说明:AL 的内容是 65H ,程序段完成的功能是 高低 4 位互换 。 6、已知 (AX)=0A5C6H,(CX)=0503H,CF=1 ①执行以下三条指令后: (AX)= 8086H ,CF= 1 。 RCL AX,CL AND AH,CH RCR AX,CL ②执行以下三条指令后: (AX)= A5C0 ,CF= 1 。 SAR AX,CL XCHG CH,CH SHL AX,CL 7、分别说明下列每组指令中的两条指令的区别。 ① MOV AX,TABLE LEA AX,TABLE ② AND BL,0FH OR BL,0FH ③ MOV AX,[BX] MOV AX,BX ④ SUB DX,CX CMP DX,CX ⑤ MOV [BP][SI],CL MOV DS:[BP][SI],CL 答:① MOV AX,TABLE LEA AX,TABLE MOV 取变量的值,而 LEA 取变量的偏移地址 ② AND BL,0FH OR BL,0FH AND 是将高 4 位清 0,OR 是将低 4 位置 1 ③ MOV AX,[BX] MOV AX,BX [BX]是将 BX 的内容作为偏移地址取数赋给 AX, BX 是将寄存器内容赋给 AX ④ SUB DX,CX CMP DX,CX SUB 保存结果到 DX 中,CMP 不保存 ⑤ MOV [BP][SI],CL MOV DS:[BP][SI],CL4 第一条使用段缺省是 SS 段,第二条使用段超越用 DS 段 8、根据所学指令,写出使 AL 置 0 的多种方法。 答:包括 MOV AL,0 SUB AL,AL AND AL,0 XOR AL,AL 等 9、将 DX、AX 中存储的 32 位带符号数(DX 中存放高 16 位)求补。 解:利用[X]求补=0-X 实现。 MOV BX,AX MOV BX,0 SUB BX,AX MOV AX,0 SBB AX,DX MOV DX,AX MOV AX,BX 10、编写程序将 AX 中的 16 位无符号数与 BL 中的 8 位无符号数相加。 解:可以利用字节相加,实现字相加,注意高字节相加,要加上进位。 ADD AL,BL ADC AH,0 11、将 AX 中有 0 的各位对应的 BX 位取反,BX 的其它位不变。 解:可利用异或指令实现。 NOT AX XOR BX,AX 12、编写一段程序,实现 16 位无符号数的计算:W=(X-2)/2+Y,设 X、Y、 Z、W 是已定义的存储器操作数。 解:程序如下所示。 MOV AX,X SUB AX,2 SHR AX,1 ADD AX,Y MOV W,AX XOR DX,DX ADC DX,05 第四章习题 1、某数据段中有如下定义: CNT1 EQU 20H CNT2 DW 20H 比较指令 MOV AX,CNT1 与 MOV AX,CNT2 的区别。 答:指令 MOV AX,CNT1 是立即数据寻址。 指令 MOV AX,CNT2 是直接寻址。 2、下列各题中有语法错误,请说明原因,并分别用两种方法修改。 ① M1 DW 5060H ┇ MOV BL,M1 ② M2 EQU 10H ┇ MOV M2,AL ③ M3 DB 1234 ④ M4 DW ‘ABCD’ 答:①类型不匹配。可将 M1 定义为字节(DB)或将 BL 换为字(BX) 。 ②符号常量不能作为目的操作数。M2 可用 DB 定义或将 M2 改为源操作数。 ③DB 是定义字节变量。可将立即数改为字节或用 DW 定义字变量。 ④字符占一个字节。可用 DB 定义或用 DW 定义二个字符。 3、下面的数据定义中,包含数据’0102H’的字存储单元有多少个。 DB 10H DUP(1,2 DUP(2)) 答:只有 15 个。因为空间里有 16 个 01H、02H、02H,而字取值是高位地址 存高字节,因此只有 15 个 0102H 字数据。 4、 画出下面定义的数据段的存储结构图, 分析有数据 3000H 的字存储单元有 几个,它们的偏移量分别是多少? DATA SEGMENT ORG 30H DA1 DB 0,’0’,30H,0,30H DW DA1 DATA ENDS 答:存储结构图如下图所示。3000H 的字存储单元有 2 个,它们的偏移量分 别是 30H 和 33H。6 30H 31H 32H 33H 34H 35H 36H00H 30H 30H 00H 30H 30H 00H5、设某数据段定义如下: DATA SEGMENT NUM1=8 NUM2=NUM1+10H DA1 DB ‘IBM PC’ DB 0AH,0DH CNT EQU $-DA1 DA2 DW ‘IB’, ‘M ’,’PC’,0A0DH DATA ENDS 说明:DA1 和 DA2 的偏移量是多少?,NUM2 和 CNT 的值是多少?DA+5 字节单元的内容是什么?DA1 和 DA2 的内容相同吗?为什么? 答:DA1 和 DA2 的偏移量分别是 0H 和 6H。 NUM2=18H=24D,CNT=8。 DA1+5 字节单元的内容是’C’ DA1 和 DA2 的内容不相同。因为对于字存储,高位地址存高字节,因此 DA2 的字节存储顺序是:’B’、’I’、’ ‘、’M’、’C’、’P’、0DH、0AH,与 DA1 不同。 6、画出下面数据段定义的内存分配情况。(设 DATA 段地址为:0B70H) DATA SEGMENT V1 DB 43,43H,’C’,’GOOD!’ V2 DW 1200H,43H,V1,’Hi’,2 DUP(1) V3 DD H,V2 DATA ENDS 答:内存分配情况如下所示。 00 01 02 03 04 2BH 43H ‘C’ ‘G’ ‘O’7变量 V1 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25‘O’ ‘D’ ‘!’ 00H 12H 43H 00H 00H 00H ‘i’ ‘H’ 01H 01H 78H 56H 34H 12H 08H 00H 70H 0BH V2 的段地址 V2 的偏移地址 V1 的偏移地址 V2 的起始地址7、有如下数据段定义: DATA SEGMENT D1 DB 61H,53H D2 DW 1234H,45H D3 DW 20 DUP(0) DATA ENDS 若 DATA 段地址为 0B68H,执行下列程序后,各寄存器的值各是多少? MOV AX,SEG D1 AX= 0B68H MOV BX,OFFSET D3 BX= 0006H MOV CL,TYPE D2 CL= 2 MOV CH,SIZE D2 CH= 2 MOV DL,LENGTH D2 DL= 1 MOV DH,SIZE D3 DH= 40 8、写出下列程序段汇编后的等效指令,程序执行后,寄存器 AX、BX 和 CX8 的内容分别是多少? NUM1 EQU 340 NUM2=30*25 ┇ MOV AX,NUM2 LE NUM1;AX 的值是: 0000H ,等效指令: MOV AX,0000H MOV BX,NUM2 GT NUM1;BX 的值是: FFFFH ,等效指令: MOV BX,0FFFFH MOV CX,NUM2-NUM1 ;CX 的值是: 019AH ,等效指令: MOV CX,019AH 9、汇编语言源程序中有哪 4 个段寄存器?如何定义各段,若段定义中没有用 ORG 指令指定起始偏移地址,则缺省起始偏移地址是多少? 答:4 个段寄器分别是 CS、DS、ES 和 SS。 段定义的格式是: 段名 SEGMENT ┇ ;段体 段名 ENDS 若段定义中没有用 ORG 指令指定起始偏移地址,则缺省起始偏移地址是 0000H。 10、说明将用户编写的汇编语言源程序编译成可执行文件的过程。 答: (1)用文字编辑软件编写源程序,可以使用如 EDIT、记事本、写字板或 WORD 等字处理软件编写,以文本格式输出,文件的扩展名必须为.ASM。 (2)用汇编程序 MASM.EXE 或 TASM.EXE 对源文件进行汇编,形成目 标文件.OBJ。 (3)用连接程序 LINK.EXE 对生成的目标文件进行连接定位,形成可执行 文件.EXE。第五章习题 1. 根据给定指令填空: (1) MOV AL,05H ADD AL,09H AAA (AL)= 04H (2) MOV AL,75H ADD AL,26H9 DAA (AL)= 01H (3)MOV AL,05H SUB AL,08H AAS (AL)= 07H (4) MOV AL ,08H MOV BL,07H MUL BL AAM (AX)= 0506H (5) MOV AX,0605H MOV BL,08H AAD DIV BL (AL)= 08H 2.把变量 X 中的一位十六进制数显示在屏幕上。 答:程序如下: DATA SEGMENT x DB 0DH TAB DB 'ABCDEF' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,x MOV BX,OFFSET TAB XLAT MOV DL,AL MOV AH,02H INT 21H MOV AH,4CH INT 21H CODE ENDS END START10 3.求任一给定自然数(1≤N≤40)的立方值,并将立方值送 DAT 单元。 答:程序如下 DATA SEGMENT N DB 40 D AT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,N MOV CL,AL MUL CL MOV CL,N XOR CH,CH MUL CX MOV DAT,AX MOV AH,4CH INT 21H CODE ENDS END START 4.将 A 单元的内容求补,并与原内容相“与” ,结果存入 B 单元中。 答:程序如下 DATA SEGMENT A DB 37H B DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,A NEG AL AND AL,A MOV B,AL MOV AH,4CH11 INT 21H CODE ENDS END START 5.编制程序将 AX 的中间 8 位,BX 的低 4 位,DX 的高 4 位拼成一个新字数 据送 DI 为偏移地址的存储单元。 答:程序如下 DATA SEGMENT RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,523AH MOV BX,0C194H MOV DX,1B87H AND AX,0FF0H AND BX,000FH AND DX,0F000H OR AX,BX OR AX,DX MOV DI,OFFSET RESULT MOV [DI],AX MOV AH,4CH INT 21H CODE ENDS END START 6.数据段中以 DI 为偏移地址的单元连续存放着 4 个字节无符号数,编制程 序求他们的和与差。 答:加法程序如下 DATA SEGMENT A DD H DD H RESULT DD ? DATA ENDS CODE SEGMENT12 ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DI,OFFSET A MOV SI,OFFSET RESULT MOV AX,WORD PTR [DI] ADD AX,WORD PTR [DI+4] MOV [SI],AX MOV AX,WORD PTR [DI+2] ADC AX,WORD PTR [DI+6] MOV [SI+2],AX MOV AH,4CH INT 21H CODE ENDS END START 减法程序只要将加法程序中的 ADD 用 SUB 代替,ADC 用 SBB 代替即可实 现。 7. 将 A 单元中的二位 16 进制数拆成二个 16 位数。 并分别转换为相应的 ASCII 码存于 B 单元及 C 单元。 答:程序如下 DATA SEGMENT A DB 0B7H B DB ? C DB ? TAB DB 'ABCDEF' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,A AND AL,0F0H MOV CL,4 ROL AL,CL MOV BX,OFFSET TAB XLAT13 MOV MOV AND XLAT MOV MOV INT CODE ENDS END STARTB,AL AL,A AL,0FH C,AL AH,4CH 21H第六章习题1. 指出下列程序段执行 AL 的内容是什么? a) MOV AL,60H CMP AL,0BBH JB L2 L1:MOV AL,0BBH L2:NOP b) MOV AL,60H CMP AL,0BBH JL L2 L1:MOV AL,0BBH L2:NOP14 XOR AL,AL MOV BL,98H ADD BL,88H JNC L2 L1:INC AL L2:NOP d) XOR AL,AL MOV BL,98H ADD BL,88H JNO L2 L1:INC AL L2:NOP e) MOV BL,46H TEST BL,01H JZ L2 L1: XOR AL,AL JMP OK L2: MOV AL,1 OK: NOP f) MOV BL,46H TEST BL,0FFH JNP L2 L1:XOR AL,AL JMP OK L2:MOV AL,1 OK:NOP 答:a)AL=60H;b)AL=0BBH;c)AL=01H;d)AL=01H;e)AL=01H;f)AL=01H 2. 判断 PAK 单元数据的奇偶性。当为奇数时置 MEAK 单元为 1,当为偶数时置 MEAK 单元为 0。 答:程序如下 DATA SEGMENT PAK DB 0B6H MEAK DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA15c) START: MOV AX,DATA MOV DS,AX MOV AL,PAK TEST AL,0FFH JNP L2 L1: XOR AL,AL JMP OK L2: MOV AL,1 OK: MOV MEAK,AL MOV AH,4CH INT 21H CODE ENDS END START 3. 将 BUF 单元起的 20 个数移到 DAT 单元起的存储区中。使用三种方法实现。 答:方法一用 JNZ 从首地址开始传送实现,程序如下 DATA SEGMENT BUF DB 'ABCDEFGHIG' DAT DB 20 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV DI,OFFSET DAT MOV BL,20 L1: MOV AL,[SI] MOV [DI],AL INC SI INC DI DEC BL JNZ L1 MOV AH,4CH INT 21H CODE ENDS END START16 方法二用 JNZ 从尾地址开始传送实现,程序如下 DATA SEGMENT BUF DB 'ABCDEFGHIG' DAT DB 20 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV DI,OFFSET DAT ADD SI,19 ADD DI,19 MOV BL,20 L1: MOV AL,[SI] MOV [DI],AL DEC SI DEC DI DEC BL JNZ L1 MOV AH,4CH INT 21H CODE ENDS END START 方法三用结束字符(假设’$’为结束字符)作为标志实现,程序如下 DATA SEGMENT BUF DB 'ABCDEFGHIG','$' DAT DB 20 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV DI,OFFSET DAT L1: MOV AL,[SI]17 CMP AL,'$' JZ NEXT MOV [DI],AL INC SI INC DI JMP L1 NEXT: MOV AH,4CH INT 21H CODE ENDS END START 4.从键盘输入一个字符。根据其内容对 X 单元按下式赋值。试编程。0 X= 1 Y=非字母数字 Y=数字符答: 程 -1 Y=字母符 序 如 下 DATA SEGMENT x DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,01H INT 21H CMP AL,'0' JB OTHER CMP AL,'9' JA CHAR MOV AH,1 ;&'0'且&'9'是数字键 JMP EXIT CHAR: CMP AL,'A' JB OTHER CMP AL,'Z' JA CHAR1 MOV AH,-1 ;&'A'且&'Z'是大写字母键18 JMP EXIT CHAR1: CMP AL,'a' JB OTHER CMP AL,'z' JA OTHER MOV AH,-1 ;&'a'且&'z'是小写字母键 JMP EXIT OTHER: MOV AH,0 ;是其他键 EXIT: MOV X,AH MOV AH,4CH INT 21H CODE ENDS END START 5. 统计一班 50 名学生成绩的等级(A:90~100;B:80~89;C:70~79;D: 60~69;E:60 以下) 。 答:程序如下 DATA SEGMENT CJ DB 67,76,53,96,84,76,45,91,84,62 DB 67,76,53,96,84,76,45,91,84,62 DB 67,76,53,96,84,76,45,91,84,62 DB 67,76,53,96,84,76,45,91,84,62 DB 67,76,53,96,84,76,45,91,84,62 DJ DB 50 DUP('0'),'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,50 MOV SI,OFFSET CJ MOV DI,OFFSET DJ LP: MOV AL,[SI] CMP AL,90 JB NEXT1 MOV DL,'A' JMP NEXT519 NEXT1:CMP AL,80 JB NEXT2 MOV DL,'B' JMP NEXT5 NEXT2:CMP AL,70 JB NEXT3 MOV DL,'C' JMP NEXT5 NEXT3:CMP AL,60 JB NEXT4 MOV DL,'D' JMP NEXT5 NEXT4:MOV DL,'E' NEXT5:MOV [DI],DL INC DI INC SI DEC CL JNZ LP MOV DX,OFFSET DJ MOV AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS END START 6. 有三个变量 A1、A2、A3,试将三个变量重新排序,使 A1 放最大者,A3 放最 小者。 答:程序如下 DATA SEGMENT A1 DB 21 A2 DB 54 A3 DB 87 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA20 MOV DS,AX MOV AL,A1 CMP AL,A2 JGE NEXT1 MOV AH,A2 MOV A2,AL MOV A1,AH NEXT1:MOV AL,A1 CMP AL,A3 JGE NEXT2 MOV AH,A3 MOV A3,AL MOV A1,AH NEXT2:MOV AL,A2 CMP AL,A3 JGE NEXT3 MOV AH,A3 MOV A3,AL MOV A2,AH NEXT3:MOV AH,4CH INT 21H CODE ENDS END START 7.查找 STR 数组中值为最大的字符。 答:程序如下 DATA SEGMENT STRING DB 'ABCDEFGHI' CNT EQU $-STRING DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,CNT MOV SI,OFFSET STRING MOV AH,[SI]21 INC NEXT1:MOV CMP JBE MOV NEXT2:INC DEC JNZ MOV MOV INT MOV INT CODE ENDS END STARTSI AL,[SI] AL,AH NEXT2 AH,AL SI CL NEXT1 DL,AH AH,02H 21H AH,4CH 21H第七章习题 1、 画出两种循环结构的流程示意图,如何用分支结构改写该示意图。 答:两种循环结构的流程示意图如下:开始 初始化 工作部分(循环体) 修改部分 控制部分 结束 “直到”型循环结构 22 开始 初始化 控制部分 修改部分 工作部分(循环体) 结束 “当”型循环结构使用分支结构改写,只需将“控制部分”用“条件判断”代替即可。 2、 循环指令 LOOP、LOOPZ、LOOPNZ 和重复前缀指令 REP、 REPZ、 REPNZ 实现相同的功能,请说明各自的适应范围。 答:LOOP、LOOPZ、LOOPNZ 和重复前缀指令 REP、REPZ、REPNZ 实现相 同的功能完全相同,不同之处是 REP、REPZ、REPNZ 指令其循环体内只允许 有一条指令, 而 LOOP、 LOOPZ、 LOOPNZ 指令其循环体内可以是一条或多条。 3、串操作指令前面一般需加重复前缀指令,两者结合后,形成新的指令,常 见的结合方法如下,分析指令功能。 REP MOVSB ;指令功能: 传送源串到目的串 REPZ CMPSB ;指令功能: 比较源串和目的串是否相等 REPNZ SCASB ;指令功能: 查找串中是否有某数值 4、分析下面程序段的执行结果。 ① BUFF DB 03H,06H,08H,00H,01H ┇ XOR AX,AX XOR BX,BX MOV CX,5 LP1: ADD AL,BUFF[BX] AAA INC BX LOOP LP1 ┇ 循环结束时, (AX)= 18H ,程序功能是: 5 个 非压缩 BCD 求和 ② BUFF DB 0,0,0,0,34H,0,12H,0 ┇ XOR AL,AL LEA SI,BUFF-1 MOV CX,8 LP1: INC SI CMP AL,[SI] LOOPZ LP1 MOV AL,[SI] ┇ 程序结束时, (AL)= 34H ,程序功能是: 找到第一个非 0 数据 ③ BUFF DW 0,H,45H,075FH,-1,100 ANS DW ? ┇23 MOV AX,0045H LES DI, BUFF CLD MOV CX,7 REPNZ SCASW MOV ANS,ES:[DI] ┇ 程序结束时, (ANS)= 075FH ,程序功能是: 找出 45H 后的字 5、根据程序功能,在空白处填加正确指令。 ① 下面的程序能够根据 DAY 单元的内容(1~7)从 WEEK 中查出对应的星期 一~星期日的英文缩写,并显示出来。 WEEK DB ‘MON’,’TUE’,’WED’,’THU’,’FRI’,’SAT’,’SUN’ DAY DB ? ┇ XOR BX,BX MOV BL,DAY MOV AL,BL SAL BL,1 ADD BL,AL MOV CX,3 LP1: MOV DL,WEEK[BX] MOV AH,02H INT 21H INC BX LOOP LP1 ┇ ② 将 BUFF 数据区中的零、正数及负数的个数分别送 ZERO、POSI 和 NEGA 存储单元。 DSEG SEGMENT BUF DB 0,0FFH,82H,44H,91H,0,10H,0 N EQU $-BUF ZERO DB 0 POSI DB 0 NEGA DB 0 DSEG ENDS CSEG SEGMENT24 ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX MOV SI,OFFSET-1 MOV CX,N NEXT: MOV AL,[SI] CMP AL,0 JZ ZE JL NE INC POSI JMP LLL ZE: INC ZERO JMP LLL NE: INC NEGA LLL: LOOP NEXT MOV AH,4CH INT 21H CSEG ENDS END START 6、编写一段程序,将 100 个字节的缓冲区 BUFF 清 0 答:程序如下 DATA SEGMENT BUFF DB 100 DUP('A') DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV CX,100 MOV DI,OFFSET BUFF XOR AL,AL REP STOSB MOV AH,4CH INT 21H25 CODE ENDS END START 7、编写程序,将一个 2 位十进制数的数组(压缩 BCD 码表示)中个位为 5 的 数取出来,建立一个新的数组。 答:程序如下 DATA SEGMENT BUFF1 DB 12H,45H,25H,72H,78H,85H,89H N EQU $-BUFF1 BUFF2 DB N DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFF1 MOV CX,N MOV DI,OFFSET BUFF2 LP1: MOV AL,[SI] MOV AH,AL AND AL,0FH CMP AL,05H JNZ LP2 MOV [DI],AH INC DI LP2: INC SI LOOP LP1 MOV AH,4CH INT 21H CODE ENDS END START 8、编制一段程序,测试(BX)中’0’的个数。 答:程序如下 DATA SEGMENT A DW 55AAH N DB ? DATA ENDS26 CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,A MOV CX,16 XOR AL,AL LP1: RCL BX,1 JC LP2 INC AL LP2: LOOP LP1 MOV N,AL MOV AH,4CH INT 21H CODE ENDS END START 9、编写一段程序,从一个 16 位带符号数的数组中找出最大和最小值。 答:程序如下 DATA SEGMENT BUFF DW -,-,,0 N EQU $-BUFF MAX DW ? MIN DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET BUFF MOV CX,N MOV AX,[BX] ;用 AX 存最大值 MOV DX,AX ;用 DX 存最小值 LP1: INC BX INC BX CMP AX,[BX] JGE LP227 MOV AX,[BX] JMP LP3 LP2: CMP DX,[BX] JLE LP3 MOV DX,[BX] LP3: LOOP LP1 MOV MAX,AX MOV MIN,DX MOV AH,4CH INT 21H CODE ENDS END START 10、从键盘输入一系列字符,以回车键结束,分别统计字母和数字键的个数。 答:程序如下 DATA SEGMENT BUFF DB 10 DB ? DB 10 DUP(0) CHAR DB 0 NUM DB 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUFF MOV AH,0AH INT 21H MOV BX,OFFSET BUFF INC BX MOV CL,[BX] ;取出键入的字符个数 XOR CH,CH INC BX LP1: MOV AL,[BX] CMP AL,'0' JB NEXT28 CMP AL,'9' JA LP2 INC NUM ;是数字键 JMP NEXT LP2: CMP AL,'A' JB NEXT CMP AL,'Z' JA LP3 INC CHAR ;是大写字符 JMP NEXT LP3: CMP AL,'a' JB NEXT CMP AL,'z' JA NEXT INC CHAR ;是小写字符 NEXT: INC BX LOOP LP1 MOV AH,4CH INT 21H CODE ENDS END START 11、试编写一段程序,在字符串中删除一个字符,删除字符由用户从键盘输入, 删除后,后续字符相应前移。 答:程序如下 DATA SEGMENT BUFF DB 'abcdefgh','$' N EQU $-BUFF BUFF1 DB 'No match Char!$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AH,01H INT 21H29 MOV DI,OFFSET BUFF MOV CX,N REPNZ SCASB JNZ NEXT LP1: MOV AH,[DI] MOV [DI-1],AH INC DI LOOP LP1 MOV DX,OFFSET BUFF JMP EXIT NEXT: MOV DX,OFFSET BUFF1 EXIT: MOV AH,09H INT 21H MOV AH,4CH INT 21H CODE ENDS END START 12、 已知数组 A 包含 15 个互不相等的整数, 数据 B 包含 20 个互不相等的整数。 把既在 A 中又在 B 中出现的整数试编制成一程序。 答:程序如下 DATA SEGMENT A DB 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 NA EQU $-A B DB 1,2,3,4,5,6,7,8,9,10,21,22,23,24,25,26,27,28,29,30 NB EQU $-B C DB 15 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET A MOV BX,OFFSET C MOV DX,NA LP1: MOV AL,[SI] MOV DI,OFFSET B30 MOV CMP JNZ MOV INC LP3: INC LOOP INC DEC JNZ MOV INT CODE ENDS END START LP2:CX,NB AL,[DI] LP3 [BX],AL BX DI LP2 SI DX LP1 AH,4CH 21H第八章习题1、画出子程序调用与返回的结构示意图。 答:结构示意图如下所示 主程序: ┇ 准备入口参数 调用子程序处理 取出子程序的结果 ┇ 子程序: 取出主程序的入口参数 ┇处理数据 保存结果到出口参数 返回2、 分析子程序调用指令 CALL 和返回指令 RET 与转移指令 JMP 的异同, 说明 堆栈在子程序调用与返回中所起的作用。 答:CALL 指令除完成 JMP 转移指令功能,还要将当前的断点地址入栈保护, 以便于返回,RET 指令也是完成转移指令功能,但其转入地址由堆栈提供。堆栈 的特点是先进的后出,这样可以保证子程序的调用与返回能够实现嵌套。 3、说明带立即数返回指令的操作特点,其主要应用于何种情况下。 答:带立即数返回指令主要应于当用堆栈作为参数传递的缓冲区时,返回时恢31 复堆栈的原来栈顶。 4、下面的子程序定义有错误吗?若有,请指出来,说明错误原因? SUB1 PROC PUSH AX ADD AX,BX RET ENDP SUB1 答:错误有两处。一处定义错误,应为 SUB1 ENDP ;第二处入栈保护现 场,没有恢复现场的出栈指令 POP AX。 5、分析下面的程序,画出堆栈最满时的堆栈存储情况,并注明堆栈的内容。 ┇ MOV AX,0506H CALL DISP ┇ DISP PROC NEAR PUSH DX PUSH AX OR AH,30H MOV DL,AH MOV AH,02H INT 21H POP AX OR AL,30H MOV DL,AL MOV AH,02H INT 21H POP DX RET DISP ENDP 答:堆栈情况如下: AH AL DH DL IP 高八位 IP 低八位32PUSH PUSH CALLAX DX SP 指示的栈底 6、分析下面的程序,指出程序执行结果,并说明子程序的功能及入口参数、 出口参数。 DSEG SEGMENT STR1 DB ‘S03TR56I4NG$’ CNT EQU $-STR1 STR2 DB CNT DUP(?) DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX MOV ES,AX MOV SI,OFFSET STR1 MOV DI,OFFSET STR2 NEXT: LODSB CMP AL,’$’ JZ EXIT CALL SUB1 JNC NEXT STOSB JMP NEXT EXIT: MOV AH,4CH INT 21H SUB1 PROC NEAR CMP AL,’0’ JB CHAR CMP AL,’9’ JA CHAR CLC RET CHAR: STC RET SUB1 ENDP CSEG ENDS33 END START 程序执行结果: 从字符串中取出所有字符,存入 STR2 中 ,子程序功能: 判断 AL 中的字符是数字 CF=0 还是字母 CF=1 入口参数: AL ,出口参数: CF 7、编写一段子程序 SKIP,实现在屏幕上输出空行的功能,空行数由 AL 决定。 答:程序如下 DATA SEGMENT A DB 4 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,A CALL SKIP MOV AH,4CH INT 21H SKIP PROC NEAR PUSH CX PUSH DX MOV CL,AL XOR CH,CH LP1: MOV DL,0AH MOV AH,02H INT 21H LOOP LP1 POP DX POP CX RET SKIP ENDP CODE ENDS END START 8、编写一个子程序,可将存储器中的 32 位无符号数左移 4 位。 答:程序如下 DATA SEGMENT A DD H34 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,WORD PTR A MOV DX,WORD PTR A+2 CALL ZY4B MOV WORD PTR A,AX MOV WORD PTR A+2,DX MOV AH,4CH INT 21H ZY4B PROC NEAR PUSH CX MOV CX,4 LP1: RCL AX,1 RCL DX,1 LOOP LP1 POP CX RET ZY4B ENDP CODE ENDS END START 9、编写一个实现字节块移动的子程序,要求考虑源地址与目的地址在不同情 况下的移动。入口地址:SI、DI 存储源、目的地址,CX 传送的字节数。 答:程序如下 DATA SEGMENT ORG 0000H BUFF DB 'ABCDEFGHIJK' N EQU $-BUFF ORG 0005H BUFF1 DB N DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA35 MOV DS,AX MOV ES,AX MOV SI,OFFSET BUFF MOV DI,OFFSET BUFF1 MOV CX,N CALL MOVB MOV AH,4CH INT 21H MOVB PROC NEAR PUSHF CMP SI,DI ;STRING1 首址大于 STRING2 首址转 RES JA RES STD ;重叠,减量方式 ADD SI,CX DEC SI ;STRING1 尾址 ADD DI,CX DEC DI ;STRING2 尾址 JMP MV RES: CLD MV: REP MOVSB ;自动重复字符串传送 POPF RET MOVB ENDP CODE ENDS END START 10、编写一段程序,能够根据键盘输入的’1’~’9’之间的数值,显示如下所示图 形,若输入为偶数,则加 1,形成奇数。要求主程序完成键盘输入,判别奇偶数, 转换成奇数,而子程序根据该奇数形成显示图形。 * * * * * * * * * * * * * * * * 答:程序如下 CODE SEGMENT ASSUME CS:CODE START: MOV AH,01H36 INT AND TEST JNZ INC NEXT: CALL CALL MOV INT DISP PROC PUSH PUSH PUSH MOV INC SAR MOV XOR MOV LP1: MOV LP2: CMP JZ MOV MOV INT DEC JMP LP3: MOV LP4: MOV MOV INT LOOP CALL INC DEC DEC21H AL,0FH AL,01H NEXT ;是奇数,转 AL LRCR ;回车换行 DISP AH,4CH 21H NEAR BX CX DX BH,AL BH BH,1 ;计算显示的行数=(个数+1)/2 DH,0 ;记录当前的行数,从 0 行开始 AH,AH SI,AX ;SI 记录每行显示的'*'数 BL,DH BL,0 LP3 AH,02H DL,' ' 21H BL LP2 ;根据行数显示空格数 CX,SI AH,02H DL,'*' 21H LP4 ;显示每行'*'的个数 LRCR ;回车换行 DH ;行数+1 SI SI ;显示的'*'个数-237 DEC BH ;是否是最后一行 JNZ LP1 POP DX POP CX POP BX RET DISP ENDP LRCR PROC NEAR ;回车换行子程序 PUSH AX PUSH DX MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H POP DX POP AX RET LRCR ENDP CODE ENDS END START第九章习题 1、编写程序将键盘输入的四位 ASCII 码的数值转换为压缩 BCD 码。 答:程序如下 DATA SEGMENT BUFF DB 4 DUP(0) BCD DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX38 MOV SI,OFFSET BUFF MOV CX,4 LP1: MOV AH,01H INT 21H AND AL,0FH MOV [SI],AL INC SI LOOP LP1 MOV SI,OFFSET BUFF MOV DI,OFFSET BCD INC DI MOV CX,2 LP2: MOV AL,[SI] PUSH CX MOV CL,4 SAL AL,CL INC SI OR AL,[SI] MOV BYTE PTR [DI],AL INC SI DEC DI POP CX LOOP LP2 MOV AH,4CH INT 21H CODE ENDS END START 2、编写一段程序,将两位十六进制数以二进制数的形式显示出来。 答:程序如下 DATA SEGMENT BUFF DB 5AH DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX39 MOV BL,BUFF MOV CX,8 LP1: RCL BL,1 JC LP2 MOV DL,'0' JMP LP3 LP2: MOV DL,'1' LP3: MOV AH,02H INT 21H LOOP LP1 MOV AH,4CH INT 21H CODE ENDS END START 3、 编写一段主程序,调用本章中的例 9-3 子程序,实现两个 6 位十进制数的 加法运算程序。 答:程序如下 DATA SEGMENT BUFF DB 10H,32H,54H BUFF1 DB 54H,76H,98H,0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUFF MOV DI,OFFSET BUFF1 MOV CX,3 CALL BCDADD MOV AH,4CH INT 21H ;程序功能:将两个十进制数(压缩 BCD 码表示)相加。 ;入口参数:CX 存放十进制数的位数,SI 指向被加数的地址指针,DI 指向加数 的地址指针。 ;出口参数:结果在 DI 指向的连续 CX+1 个地址单元中。 BCDADD PROC NEAR40 PUSH AX PUSH CX PUSH DI CLC BCDADD1:MOV AL,[SI] ADC AL,[DI] DAA MOV [DI],AL INC SI INC DI LOOP BCDADD1 MOV AL,0 ADC AL,0 MOV [DI],AL POP DI POP CX POP AX RET BCDADD ENDP CODE ENDS END START 4、 利用 BIOS 的键盘中断功能调用 INT 16H, 实现在屏幕上不断连续显示’*’, 直到用户按下回车键(0DH) ,则退出程序。 答:程序如下 CODE SEGMENT ASSUME CS:CODE START: MOV AH,02H MOV DL,'*' INT 21H MOV AH,1 INT 16H JZ START MOV AH,0 INT 16H CMP AL,0DH JNZ START41 MOV AH,4CH INT 21H CODE ENDS END START 5、 编写一段程序,在屏幕上显示一个直角三角形。 答:程序如下 MY_DATA SEGMENT ROW DW 40 ;直角三角形起始坐标 COL DW 80 LEN DW 50 ;直角三角形的底边长 WID DW 100 ;直角三角形的高 DOT DB 1 ;点距 MY_DATA ENDS MY_CODE SEGMENT ASSUME CS:MY_CODE,DS:MY_DATA START: MOV AX,MY_DATA MOV DS,AX MOV INT PUSH MOV MOV INT MOV ADD MOV CALL MOV MOV ADD CALL AH,0FH 10H AX AH,0 AL,06H 10H DX,ROW DX,LEN CX,COL DRAW_X DX,ROW CX,COL CX,WID DRAW_Y;保存原有的显示模式;设置显示模式为 2 色图形 640*200 ;画下面一条横线 ;计算起始行位置;画右面一条竖线 ;计算起始列位置42 MOV MOV ADD CALL MOV INT POP MOV INT MOV INTDX,ROW CX,COL CX,WID DRAW_Z AH,01H 21H AX AH,0 10H AH,4CH 21H;画一条斜线;等待用户按键结束图形显示;恢复原来显示模式;程序功能:画一条水平直线。 ;入口参数:CX 存放线的起始列位置,DX 存放线的起始行位置,变量 WID 存 放线的长度。 ;出口参数:无。显示直线 DRAW_X PROC NEAR MOV BP,WID X1: MOV BH,0 INC CX ;列地址加 1 个像素点 MOV AL,DOT MOV AH,0CH INT 10H DEC BP JNZ X1 ;循环显示 LEN 个点 RET DRAW_X ENDP ;同上,只是画一条垂直直线 DRAW_Y PROC NEAR MOV BP,LEN Y1: MOV BH,043 INC DX ;行地址加 1 个像素点 MOV AL,DOT MOV AH,0CH INT 10H DEC BP ;循环显示 WID 个点 JNZ Y1 RET DRAW_Y ENDP ;程序功能:画一条斜线。 ;入口参数: CX 存放斜线的起始列位置, DX 存放斜线的起始行位置, 变量 LEN 存放斜线的列长度。 ;出口参数:无。显示直线 DRAW_Z PROC NEAR MOV BP,LEN Z1: MOV BH,0 INC DX ;行地址加 1 个像素点 DEC CX ;计算斜线的列地址(斜向上划斜线) DEC CX ;因三角形的高与底的比为 100/50=2,因此底增加 1 个 像素,高需减小 2 个像素 MOV AL,DOT MOV AH,0CH INT 10H DEC BP JNZ Z1 ;循环显示 LEN 个点 RET DRAW_Z ENDP MY_CODE ENDS END START 6、改写本章中的例题 9-8,利用 C 语言输入延时时间的长短,并调用改写后的 例 9-8 实现声音的输出。 答:利用 TC2.0 创建三个文件。 XT9_6.C,程序如下: void SPK(int); main()44 { printf(&Input Daley Time:&); scanf(&%d&,&i); SPK(i); return 0; } XT9_6S.C,程序如下: SPK() { } XT9_6.PRJ,程序如下: XT9_6.C XT9_6S.OBJ 将 XT9_6S.C 利用 TCC –S XT9_6S.C 命令,编译成 XT9_6S.ASM 在 XT9_6S.ASM 中加入汇编指令,如下的黑体部分。 ifndef ??version ?debug macro endm endif ?debug S &xt9_6s.c& _TEXT segment byte public 'CODE' DGROUP group _DATA,_BSS assume cs:_TEXT,ds:DGROUP,ss:DGROUP _TEXT ends _DATA segment word public 'DATA' d@ label byte d@w label word _DATA ends _BSS segment word public 'BSS' b@ label byte b@w label word ?debug C E32E6345 _BSS ends _TEXT segment byte public 'CODE' ; ?debug L 1 _SPK proc near @1: ; ?debug L 3 PUSH BP MOV BP,SP PUSH AX PUSH BX PUSH CX PUSH DX IN AL,61H MOV DL,AL ;保存原 8255B 口的状态 OR AL,01H ;PB0=1 打开 8253 定时计数器 SOUND: AND OUT MOV CALL OR OUT MOV CALL PUSH MOV INT POP JZ MOV OUT POP AL,H,AL ;PB1=0,关闭扬声器 BX,[BP+4] DELAY;调延时子程序 ;PB1=1,打开扬声器AL,H,AL BX,[BP+4] DELAY AX AH,01H 16H AX SOUND AL,DL 61H,AL DX;调延时子程序;检测有无键按下 ;无键按下循环 ;恢复 8255B 口的原始状态46EXIT: POP POP POP POP ret _SPK endp DELAY DELAY1: DELAY2:CX BX AX BPDELAYPROC MOV LOOP DEC JNZ RET ENDPNEAR CX,0FFFFH DELAY2 BX DELAY1 ;循环 BX*CX 次延时_TEXT ends ?debug C E9 _DATA segment word public 'DATA' s@ label byte _DATA ends _TEXT segment byte public 'CODE' _TEXT ends public _SPK end 使用 MASM 将修改后的 XT9_6S.ASM 汇编成 XT9_6S.OBJ 使用 TC2.0 打开 XT9_6.PRJ,按 F9 编译,形成 XT9_6.EXE。第十章习题 1、写出宏定义的一般格式和宏调用的方法。 答:宏定义的一般格式是: 宏指令名 MACRO [形参表] 宏体47 ENDM 宏调用的方法是:宏指令名 [实参表] 2、宏定义与子程序各具有什么特点,并说明使用宏的场合。 答:程序设计中,常常需要多次高速执行同一个小程序段,可以使用子程序结 构和宏定义结构解决。但子程序执行时,需要执行子程序调用与子程序返回指令、 保护和恢复现场、提供入口参数和出口参数等环节,将使程序的执行时间加长,尤 其是子程序较小而需保护和恢复的寄存器、存储单元较多,涉及的参数较多时,这 种开销就更为突出。 宏汇编技术利用将程序插入的方法, 可以较好地解决这一问题, 既提高了速度,又提高编程效率。因此,子程序用于减少程序代码,而宏汇编用于 提高运行速度。 3、说明重复汇编与循环指令的异同 答:循环指令是在程序运行时根据变量的不同取值,实现指令的重复进行,而 重复汇编是在程序编译时,完成指令的重复执行,因此循环指令应用于程序运行时 的循环操作,而重复汇编应用于程序设计时的循环操作。 4、设有以下宏定义: FUNC MACRO N1,N2 LOCAL NEGA,ZERO,OK PUSH AX MOV AL,N1 CMP AL,0 JS NEGA JZ ZERO MOV AL,1 JMP OK NEGA: MOV AL,0FFH JMP OK ZERO: MOV AL,0 OK: MOV N2,AL POP AX ENDM 分析宏定义实现的函数功能,若 BL=85H,则宏调用 FUNC BL,CL 执行后,CL 的值是多少? 答:宏定义实现的函数功能是根据形参 N1 的值是正数、0 和负数,给形参 N2 分别赋 1,0 和 0FFH(-1) 。 若 BL=85H,则宏调用 FUNC BL,CL 执行后,CL 的值是 0FFH(-1) 。 5、已知宏定义:48 MACRO P1 MOV AH,P1 INT 21H ENDM DISPLAY MACRO ADDRESS MOV DX,ADDRESS DOS21 9 ENDM 试展开宏调用 DISPLAY X(X 是一个已定义的字符串) 答:调用 DISPLAY X 的宏展开式如下: MOV DX,X MOV AH,9 INT 21H 6、编写一条宏指令 CLRB,完成将一个字符区用空格填充,字符区首地址及长 度采用参数传递到宏中。 答:宏指令如下: CLRB MACRO ADDR,LEN PUSH AX PUSH CX MOV AX,DS MOV ES,AX MOV AL,‘ ’ MOV CX,LEN MOV DI,OFFSET ADDR CLD REP STOSB POP CX POP AX ENDM 7、编写一个宏定义 CHESS,使其能显示字符串 Good: Class X, Name,其中 X、NAME 在宏调用时给出。 答:宏定义如下: DSEG SEGMENT MESS1 DB ‘Good: Class $’ ┇ DSEG ENDS49DOS21 DISPMACRO MOV MOV INT DISP ENDM DISP1 MACRO MOV MOV INT DISP1 ENDM CHESS MACRO DISP DISP1 DISP1 DISP CHESS ENDMADDR1 ;显示一个字符串 DX,OFFSET ADDR1 AH,09H 21H CH DL,CH AH,02H 21H X,NAME MESS1 X ‘,’ NAME ;显示一个字符8、试用重复汇编指令编写一个能够产生如下 20 个序列的宏定义 DB 1,’A’,2,’B’,3,’C’,4,’D’┉┉ 答: DSEG SEGMENT CHAR=’A’ NUM=1 REPT 20 DB NUM DB CHAR NUM=NUM+1 CHAR=CHAR+1 ENDM ┇ DSEG ENDS 9、现有一宏定义: INPUT MACRO NUM,ADDR MOV AH,01H INT 21H50 SUB IFAL,30H NUM MOV MOV INT SUB MOV SHL ORBL,AL AH,01H 21H AL,30H CL,04H BL,CL AL,BLENDIF MOV ADDR,AL ENDM 分别说明下述两个宏调用的功能: (DA_BY1 和 DA_BY2 是已经定义的变量名) INPUT 10,DA_BY1 INPUT 0,DA_BY2 答:宏调用 INPUT 10,DA_BY1 的功能:从键盘输入两个数字,将其转换为压 缩 BCD 码,存入变量 DA_BY1。 宏调用 INPUT 0,DA_BY2 的功能:从键盘输入单个数字,将其转换为非压缩 BCD 码,存入变量 DA_BY2。第十一章习题 1、说明段的完整定义格式中,定位方式、组合方式和’类别名’的作用。 答:段的完整定义格式是: 段名 SEGMENT [定位方式] [组合方式] [‘类别’] 段体 段名 ENDS 定位方式的作用是:定位方式指在程序连接时,该段起始地址的要求。 组合方式的作用是:组合方式指各模块中的段与段之间是怎样连接和定位的。 ’类别名’的作用是: ‘类别’是一个字符串,单引号中的字符可由编程者自定。 连接多个模块时,同‘类别’的所有段(不管段名是否相同)被放在连续的存储区 中,先出现者在前,后出现者在后。 2、简述掌握模块化程序设计的方法,在实际的程序设计中的意义。 答:使用汇编语言程序完成一个较大任务时,也需要采用结构化程序设计的方 法: “自顶向下,逐步细化” 。即将任务分成若干个功能模块,必要时还要将这些功51 能模块划分成更小的功能模块,可以由多人分别独立完成。每个模块完成其中的一 项功能且以独立的文件名保存, 称为程序模块; 每个程序模块 (文件) 可单独调试, 完成后汇编生成目标模块; 多个目标模块通过连接程序生成完成整个任务的一个可 执行模块。 3、假设有两个程序模块 P1.ASM 和 P2.ASM,每个程序模块都有一个数据段。 若要求连接时,将两个数据段中的数据存放在内存中的连续区域,请写出两个数据 段的完整定义。 答:程序模块 P1.ASM 的段定义如下是: D1 SEGMENT PUBLIC ‘DSEG’ ┇ D1 ENDS 程序模块 P2.ASM 的段定义如下是: D2 SEGMENT PUBLIC ‘DSEG’ ┇ D2 ENDS 4、假设一个名为 MAINPRO 的主程序要调用另一个模块中的子程序 SUBPRO, 请写出在两个模块中如何声明,才能实现正确调用。 答:MAINPRO 主程序模块中应加入声明。 EXTRN SUBPRO:NEAR 子程序模块中应加入声明。 PUBLIC SUBPRO 5、假设: 在模块 1 中定义了字节变量 VAR1,字节数组首地址 VAR2 和 NEAR 类型的子 程序 SUB1,能够被模块 2 所使用。 在模块 2 中定义了字变量 VAR3 和 FAR 类型的子程序 SUB2,能够被模块 1 所 使用。 请给出每个模块中必须的 EXTRN 和 PUBLIC 声明。 答:模块 1 中的声明: PUBLIC VAR1 PUBLIC VAR2 PUBLIC SUB1 EXTRN VAR3:BYTE EXTRN SUB2:FAR 模块 2 中的声明: PUBLIC VAR352 PUBLIC EXTRN EXTRN EXTRNSUB2 VAR1:BYTE VAR2:NEAR SUB1:NEAR6、试编写两个程序模块,第一个模块实现键盘输入,以回车键结束,然后, 调用另一个模块中的子程序将大写字母转换成小写字母,并显示出来。 答:主程序模块 XT11_6-1.ASM 程序如下: PUBLIC BUFF1 PUBLIC N EXTRN CHANG:NEAR DATA SEGMENT PUBLIC 'DSEG' BUFF DB 20 N DB ? BUFF1 DB 20 DUP(0) DATA ENDS CODE SEGMENT PUBLIC 'CSEG' ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUFF MOV AH,0AH INT 21H CALL CHANG MOV AH,4CH INT 21H CODE ENDS END START 子程序模块 XT11_6-2.ASM 程序如下: PUBLIC CHANG EXTRN N:BYTE,BUFF1:NEAR DATA SEGMENT PUBLIC 'DSEG' BUFF DB 20 DUP(0) DATA ENDS CODE SEGMENT PUBLIC 'CSEG' ASSUME CS:CODE53 CHANG PROC MOV MOV MOV MOV XOR LP1: MOV CMP JB CMP JA ADD MOV NEXT: MOV MOV INT INC LOOP RET CHANG ENDP CODE ENDS ENDNEAR AX,DATA DS,AX BX,OFFSET BUFF1 CL,N CH,CH ;取出键入的字符个数 AL,[BX] AL,'A' NEXT AL,'Z' NEXT AL,32 ;是大写字符转小写 [BX],AL DL,AL AH,02H 21H ;显示字符 BX LP154
相关文档:
更多相关文章:
汇编语言程序设计(第四版)第2章【课后答案】_理学_高等教育_教育专区。汇编语言程序设计(第四版)第2章【课后答案】 钱晓捷 主编汇编...汇编语言程序设计(第四版)第3章【课后答案】_理学_高等教育_教育专区。汇编语言程序设计(第四版)第3章【课后答案】 钱晓捷 主编汇编...汇编语言第三五章课后题答案_理学_高等教育_教育专区。3.1 给定(BX)=637DH,(...3.27 假定(DX)=0B9H,(CL)=3,(CF)=1,确定下列各条指令单独执行后 DX ...汇编语言程序设计(第四版)第1~5章【课后答案】_电脑基础知识_IT/计算机_专业资料。第 1 章 汇编语言基础知识 〔习题 1.1〕简述计算机系统的硬件组成及各部分...《IBM-PC汇编语言程序设计》(第2版)第3章习题解答及答案_IT/计算机_专业资料...3.23 假设(BX)=0E3H,变量 VALUE 中存放的内容为 79H,确定下列各条指令...IBM-PC汇编语言程序设计课后习题答案(第二版 沈美明)_工学_高等教育_教育专区。第一章 1.1 用降幂法和除法将下列十进制数转换为二进制数和十六进制数: (1) ...汇编语言程序设计 第四版 --囮裑為檤 【课后习题答案】第 1 章 汇编语言基础知识 〔习题 1.1〕简述计算机系统的硬件组成及各部分作用。 〔解答〕 CPU:包括...ibmpc汇编语言(第二版)第四章课后详细习题答案 ibm pc 汇编语言程序设计 第二...4.14 对于下面的数据定义,各条 MOV 指令单独执行后,有关寄存器的内容是什么?...汇编语言程序设计 第四版 【课后习题答案】第 1 章 汇编语言基础知识〔习题 1.1〕简述计算机系统的硬件组成及各部分作用。 〔解答〕 CPU: 包括运算器、 控制器...汇编语言习题答案_理学_高等教育_教育专区。汇编语言程序设计 习 题 解 答 目 录 第 1 章 汇编语言基础知识 ...汇编语言程序设计 习 题 解 答 目 录 第 ... 更多相关标签:
All rights reserved Powered by
copyright &copyright 。甜梦文库内容来自网络,如有侵犯请联系客服。|

我要回帖

更多关于 16进制转换器 的文章

 

随机推荐