1、第4章 汇编语言程序设计 习题解答 请打开书P176,习题4.1,画出下列语句的数据在存储器中的存储情况: ARRAYB DB 63,63H,ABCD,3 DUP(?),2 DUP(1,3) ARRAYW DW 1234H,5,AB,CD,?,2 DUP(1,3),3FH 63H 41H 42H 43H 44H XX XX XX 01H 03H 01H 03H,34H 12H 05H 00H 42H 41H 44H 43H XX XX 01H 00H 03H 00H 01H 00H 03H 00H,习题4.2,程序中数据定义如下:DATA1 DW ?DATA2 DB 32 DUP(?)DATA
2、3 DD ?DLENGTH EQU $-DATA1 此时DLENGTH的值是多少? 解答: DLENGTH=2(字)+32+4(双字)=38,习题4.3,程序中数据定义如下:ARRAY DB ABCDEFRESULT DB ?TABLE DW 20 DUP(?) 则执行指令MOV AX,TYPE RESULT后,AX=1MOV BX, TYPE TABLE后,BX= 2MOV CX, LENGTH TABLE后,CX=20MOV DX, LENGTH ARRAY后,DX=1MOV SI ,SIZE TABLE后,SI=220=40MOV DI ,SIZE ARRAY后,DI=1,习题4.4,指
3、令AND AX,7315H AND 0FFH中,两个AND有什么差别?这两个AND操作分别在什么时候执行? 解答: (1)指令AND AX,7315H AND 0FFH中的第一个AND是指令系统中的逻辑“与”指令,而第二个AND是表达式中的表示逻辑“与”关系的。 (2)指令AND AX,7315H AND 0FFH中的第一个AND是在CPU执行指令操作时才会执行。而第二个AND是在汇编时就会将7315H和 0FFH 作逻辑“与”运算,得到结果0015H。然后执行第一个AND指令,完成AX的内容与0015H的逻辑“与”运算。,习题4.5,设BX=1034H,则执行下列指令:MOV AX,BX A
4、ND 0FFHMOV CX,BX EQ 1234H后,AX和CX各多少?若BX=1234H,则结果如何? 解答(1) BX AND 0FFH=0034H(2) 0034H AX=0034H(3) BX EQ 1234H= 0000H(4) 0000H CX=0000H 结果: AX=0034H; CX=0000H若BX=1234H,则结果:AX=0034H; CX=FFFFH,习题4.6,设已知语句为:ORG 0024HDATA1 DW 4,12H,$+4(0028H +04H=002CH) 则执行指令MOV AX,DATA1+4后AX的值是多少? 解答: (1)DATA1+4=0024H+0
5、4H=0028H (2)0028H=002CH AX= 002CH,0024H 04H 0025H 00H 0026H 12H 0027H 00H 0028H 2CH 0029H 00H,习题4.7,已知数据定义语句为:BUFFER DB 16 DUP(0,2 DUP(1) 则其中字数据单元内容为0100H的单元数是多少? 解答:字数据单元内容 为0100H的单元数是16个,00H 01H 01H 00H 01H 01H 00H 01H 01H 00H 01H 01H,16 DUP 16组,16组,习题4.8,要在以DA1为首地址的数据区中依次存放下列数据; A,B,0,0,C,D, 0,0
6、请分别用DB,DW和DD语句实现。 解答: (1) DA1 DB A,B,0,0,C,D, 0,0 (2) DA1 DW BA,0, DC, 0 (3)DA1 DD BA, DC,习题4.9,试按下列要求在数据段中依次书写各数据定义语句: (1)以DA1为首字节的连续存储单元中存放20H个重复的数据序列:2,3,10个4,一个7。 (2)DA2为字符串变量,用字变量(DW)设置一字符串;STUDENTS(按次顺序存放在各单元中)。 (3)用等值语句给符号COUNT赋值以DA1为首地址的数据区共占有的字节数,此等值语句必须放在最后一语句。 解答: (1)DA1 DB 20H DUP(2,3,10
7、 DUP(4),7) (2)DA2 DW TS, DU,NE,ST, (3) COUNT EQU DA2- DA1,习题4.10,下面程序段是实现从键盘输入十个一位10进制数后累加,最后累加和以非压缩BCD码形式存放在AH(高位)和AL (低位)中。试把程序段中所空缺的指令填上。XOR BX ,BX ;BX清零MOV CX,10 ; 传送数据长度 LOP:MOV AH,01H;中断INT 21H的01H号调用INT 21H ;中断调用P172, 键入值送入AL中MOV AH,BH ;将BH的内容传AHADD AL,BL ;BL与AL的值相加,结果在AL中AAA ;非压缩BCD码加法调整MOV
8、BX,AX ;累加结果送BXLOOP LOP ;CX-1CX,判断CX0,则转,习题4.11,下面程序段的功能是把DA1数据区的0-9转换为对应的ASC码.DA1 DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H ASCI DB 10 DUP(?)CUNT = ASCI-DA1LEA SI,DA1 ;送数组DA1的首地址偏移量到SILEA DI, ASCI ;送数组ASCI的首地址偏移量到DI MOV CX, CUNT;送数组DA1的长度 LOP1: MOV AL,SI ;取数ADD AL,30H;或者OR AL,30H;加30H变成ASC码MOV DI,A
9、L ;转换后存入数组ASCIINC SI ;源数据地址加1INC DI ;目的数据地址加1LOOP LOP1 ;CX-1CX,判断CX0,则转,习题4.12,BUFF DB ABD$QC%$A.XYZ ;定义数组BUFFCONT DB EQU $-BUFF ;定义长度CLD ;方向标志DF=0串操作增量LEA DI,BUFF ;送数组BUFF的首地址偏移量到DIMOV CX,CONT ; 送数组BUFF的长度到CXMOV AL,$ ; 送$的ASC码到ALXOR DX,DX ;DX清零 NEXT:REPNZ SCASB ;P102,串扫描AL-ES:DI,若CX0且ZF=0则重复执行;若CX=
10、0或ZF=1,退出重复,停止串操作CMP CX,0 ;CX-0,CX内容与0比较JZ K1 ;P111,等于/为零,则转移到K1INC DX ;DX加1JMP NEXT ;转NEXT K1: 上述程序运行后,DX中的值表示的意义是什么? 答:上述程序运行后, DX中的值表示的是字符串中符号$ 的个数,习题4.13,设A,B是长度为10的字节数组,用串操作指令编写程序实现AB两数组内容的相互交换.试完善程序. DATA SEGMENTA DB 1,2,3,4,5,6,7,8,9,0AHORG 0010HB DB 0AH,9,8,7,6,5,4,3,2,1 DATA ENDSLEA SI,ALEA
11、 DI,BMOV CX,10,LOP: LODSBXCHG AL,DIXCHG SI,DIDEC DISTOSBXCHG SI,DIINC DILOOP LOP,习题4.14,现有一子程序: SUB1: PROCTEST AL,80H(1000 0000B);AL的值与80H相“与”,判断正负JE PLUS ;如果AL的首位为0(即为正),则转移到PLUS;如果AL为负,则顺序执行TEST BL,80H ; 判断BL的值的正负JNE EXITO ;如果BL的首位为1(为负),则转移到EXITO;如果BL为正,则顺序执行JMP XCHANGE;转移到XCHANGE PLUS: TEST BL,8
12、0H ;判断BL的值的正负JE EXITO ;如果BL的首位为0(即为正),则转移到EXITO;如果BL为负,时顺序执行 XCHANGE: XCHG AL,BL ;AL与BL交换 EXITO: RET ;返回主程序 SUB1 ENDP 试回答(1)子程序的功能是什么?(2)如调用前AL=9AH,BL=77H,那么返回主程序时AL=?;BL=? 解答:(1)子程序的功能是判别AL和BL中的数是否为异号数,当为异号时交换,否则不变。 (2) AL中的数据的最高位为1,BL中的数据的最高位为0,即两个数为异号,所以要交换AL和BL中的内容,即AL=77H,BL=9AH。,习题4.15,编写一程序段,
13、将AL中的第7和第0位,第6和第1位,第5和第2位,第4和第3位互换.MOV CX,8; MOV AH,0; K1: SHR AL,1; P99 RCL AH,1; P100 DEC CX; JNZ K1; MOV AL,AH,习题4.16,试编写一程序段,在CHAR为首的26个单元中依次存放字母A- Z.CHAR DB 26 DUP (?) START: LEA BX, CHAR; MOV AL, A MOV CX, 26 LOP1: MOV BX , AL INC AL INC BX LOOP LOP1 HLT,习题4.17,设在数据段中有X,Y两个变量(字节单元),试编写程序段计算(只写
14、有关功能的指令).X 当X0时 Y=X 当X 0时X DB X Y DB Y MOV AL,X CMP AL,0 JGE DONE NEG AL DONE: MOV Y,AL,习题4.18,编写程序段计算SUM=a1+ a2 + .+ a20,已知a1- a20依次存放在以BUF为首址的数据区,每个数据占两个字节,和数SUM也为两个字节.(要求用循环结构编写,循环控制采用计数控制).此题勿需书写源程序格式,只需要把题中要求的有关指令序列书写出来.MOV AX,0; MOV BX,OFFSET BUF; MOV CX,20; LOP:ADD AX,BX; INC BX; INC BX; LOOP
15、 LOP; MOV SUM,AX;,习题4.19,编写一个完整的源程序,将BUF字节单元存放的两位BCD码,转换成2个字节的ASC码,并分别存放在ASC和ASC+1字节单元中. 例如(BUF字节单元)=58H,那么(ASC字节单元)=35H, (ASC+1字节单元)=38H,DATA SEGMENT BCD DB XXH ASC DB ?,? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,4 MOV AL,BCD ;取BCD码数 SHR AL,CL ;转换高位 ADD AL,3
16、0H MOV ASC,AL MOV AL,BCD AND AL,0FH ;转换低位 ADD AL,30H MOV ASC+1,AL MOV AH,4CHINT 21H CODE ENDS END START,习题4.20,在A1单元开始定义了一个长度为N的字符串,找出其中所有的小写字母并存放在以A2开始的存储区中.统计出小写字母的个数,存放到SL单元中.请编写一完整的源程序.程序段如下:DATA SEGMENTA1 DB N DB EQU $-A1A2 DB N DUP(?)SL DB ?DATA ENDS,CODE SEGMENTASSUME CS:CODE,DS:DATA START:MO
17、V AX,DATAMOV DS,AX ;给数据段段段地址赋值MOV CX,N ;设置循环次数LEA SI,A1 ;SI指向源字符串 LEA DI,A2 ;DI指向目的字符串MOV DL,0 ;小写字母计数器清零 L1: MOV AL,SI ;当前字符 同小写字母a比较CMP AL,61HJL L2CMP AL,7AH ;当前字符 同小写字母z比较JG L2MOV DI,AL ;当前字符为小写字母则将其移动到A2 INC DIINC DL 并将计数器DL加1,L2: INC SI ;SI指向源串中的下一个字符LOOP L1MOV SL,DL; 将DL的值写入到SL中MOV AH,4CH; 返回系
18、统INT 21H CODE ENDSEND START 注意:在8086汇编中,寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址中只能使用BX、BP、SI和DI这4个寄存器,不能使用AX、DX等其它寄存器。这一点在编写汇编程序的时候需要注意。,习题4.21,设在DAT单元存放一个-9+9的字节数据,在SQRTAB数据区中存放09的平方值,请用直接查表法编写一子程序,在SQRTAB中查找出DAT单元中数据对应的平方值送SQR单元.并写出主程序的调用方式.数据段如下:DATA SEGMENTDAT DB XXHSQRTAB DB 0, 1, 4, 9, 81SQR DB ?DATA
19、ENDS,DATA SEGMENT DAT DB XXH SQRTAB DB 0,1,4,9,81 SQR DB ? DATA ENDS STACK SEGMENT PARA STACK DW 20H DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX CALL DTOS MOV AH,4CH INT 21H,DTOS PROC PUSH AX PUSH BX LEA BX,SQRTAB MOV AL,DAT TEST AL,80H ;判断AL的正负JE NEXT
20、 NEG AL NEXT: XLAT SQRTAB ;AL(BX+AL)MOV SQR,AL POP BX POP AX RET DTOS ENDP CODE ENDS END SRART,习题4.22,编写能完成下列要求的程序:测试字节数据STATUS,若其中位1、3、5有一位是“1”,程序就转至ROUT2;若三位都是“1”,就转向ROUT3;若这三位没有一位是“1”,就转向ROUT4.,MOV BL, 0MOV CX 3 LOP: MOV AL,STATUSAND AL, 01HADD BL, ALMOV AL,STATUSSHR AL, 2LOOP LOPMOV AL, BLCMP AL
21、, 01HJE ROUT2CMP AL, 03HJE ROUT3CMP BL, 0HJE ROUT4,习题4.23,STRING字符串的最大长度为80个字符,字符串的结束用字符$表示.编写程序在该字符串中查找是否有空格字符(ASCII码为20H),若有就将第一个空格在字符串中的位置(00H4FH)存入POST单元;若无空格则将-1存入POST.,LEA BX , STRINGMOV CX , 80 LOP : MOV AL , BXCMP AL, $JE DONECMP AL, 20HJE POSITIONINC BXLOOP LOP DONE: MOV POST, 0FFHHLT POSITION: SUB BX, OFFSET STRINGMOV POST, BLHLT,