第4章汇编语言程序设计4.1例题1.设有一数据段DSEG,其中连续定义下列5个变量或常量,用段定义语句和数据定义语句写出数据段:P48(1)DATAI为一字符串变量:“WELCOMETOMASM!。(2)DATA2为十进制字节变量:32,90,一20。(3)DATA3为连续10个00H的字节变量。(4)DATA4为双字变量,其初始值为12345678H(5)COUNT为一符号常量,其值为以上四变量所用字节数。解:定义数据段如下:DSEGSEGMENTDATA1DB“WELCOMETOMASM!'DATA2DB32,90,—20DATA3DB10 DUP (00H)DATA4DD12345678HCOUNTEQU $-DATA1DSEGENDS其中S-DATA1中S表示当前汇编地址计数器值,用其减去DATA1的偏移地址可得该数据段所用字节数。2.设有以下数据段定义:P102DSEGSEGMENTX1EQU30HX2EQU70HX3EQUOF7HDSEGENDS给出下列指令分别执行后,AL中的内容是多少?(1)MOVAL, X1+X2(2)MOVAL, X2MODX1EQ X3(3)MOVAL,X1(4)MOVAL, XI1ANDX3(5) MOVAL, XIORX3(6)MOVAL, X2GTX1解:(1)(AL)=30H+70H=0A0H(2)(AL)=70HMOD 30H=10H(3)X1EQX3=30HEQ70H为逻辑运算,其值为假,故(AL)=00H(4)(AL)= X1 AND X3 = 30HAND 0F7H =30HP98(5)(AL)=X1ORX3=30HOR0F7H=0F7H21
21 第 4 章 汇编语言程序设计 4.1 例 题 1.设有一数据段 DSEG,其中连续定义下列 5 个变量或常量,用段定义语句和数据定义语 句写出数据段:P48 (1)DATA1 为一字符串变量:‘WELCOME TO MASM!’。 (2)DATA2 为十进制字节变量:32,90,-20。 (3)DATA3 为连续 10 个 00H 的字节变量。 (4)DATA4 为双字变量,其初始值为 12345678H (5)COUNT 为一符号常量,其值为以上四变量所用字节数。 解:定义数据段如下: DSEG SEGMENT DATA1 DB ‘WELCOME TO MASM!’ DATA2 DB 32,90,-20 DATA3 DB 10 DUP (00H) DATA4 DD 12345678H COUNT EQU $-DATA1 DSEG ENDS 其中$–DATA1 中$表示当前汇编地址计数器值,用其减去 DATA1 的偏移地址可得该数据段 所用字节数。 2.设有以下数据段定义:P102 DSEG SEGMENT X1 EQU 30H X2 EQU 70H X3 EQU 0F7H DSEG ENDS 给出下列指令分别执行后,AL 中的内容是多少? (1) MOV AL,X1+X2 (2) MOV AL,X2 MOD X1 (3) MOV AL,X1 EQ X3 (4) MOV AL,X1 AND X3 (5) MOV AL,X1 OR X3 (6) MOV AL,X2 GT X1 解:(1) (AL)= 30H+70H = 0A0H (2) (AL)= 70H MOD 30H = 10H (3) X1 EQ X3 = 30H EQ 70H 为逻辑运算,其值为假,故(AL)=00H (4) (AL) = X1 AND X3 = 30H AND 0F7H = 30H P98 (5) (AL)= X1 OR X3 = 30H OR 0F7H = 0F7H
X2GTX1=70HGT30H为逻辑运算,其值为真,故(AL)=0FFH(6)3.分析下列程序段,回答所提问题。P98DA1DW1F28H?DA2DB++..XORBL, BLMOVAX, DA1LOP:ANDAX, AXJZEXITSHLAX, 1JNCLOPINCBLJMPLOPEXIT:MOVDA2,IBL试问:(1)程序段执行后,DA2字节单元内容是什么?(2)在程序段功能不变情况下,是否可用SHR指令代替SHL指令?解:XORBL, BL;(BL)=0MOVAX, DA1;(AX)=1F28HLOP:ANDAX,AX;使标志位根据AX中内容而变化JZEXIT:若(AX)=O,则转EXITSHLAX, 1;逻辑左移1位,移出位进入CFJNCLOPBLINC:如CF=1,则BL加1JMPLOPEXIT:MOVDA2,BL(1)如上分析,该程序段被用来统计DA1中内容含二进制1的个数。DA2字节单元内容为DA1中内容含二进制“1”的个数,也即(DA2)=7。(2)无论逻辑左移还是逻辑右移指令,均能将DA1中的内二进制数位一位一位地移到CF中,其程序段功能不变,故可用SHR指令代替SHL指令。4.分析下列程序段,回答所提问题。DB DA187H?DA2DB......XORAH, AHMOVAL,DA1MOVCL, 4SHRAL, CLMOVDL,10DLMUL22
22 (6) X2 GT X1 = 70H GT 30H 为逻辑运算,其值为真,故(AL)=0FFH 3.分析下列程序段,回答所提问题。 P98 DA1 DW 1F28H DA2 DB ? ...... XOR BL,BL MOV AX,DA1 LOP: AND AX,AX JZ EXIT SHL AX,1 JNC LOP INC BL JMP LOP EXIT:MOV DA2,BL 试问:(1)程序段执行后,DA2 字节单元内容是什么? (2)在程序段功能不变情况下,是否可用 SHR 指令代替 SHL 指令? 解: XOR BL,BL ;(BL)=0 MOV AX,DA1 ;(AX)= 1F28H LOP:AND AX,AX ;使标志位根据 AX 中内容而变化 JZ EXIT ;若(AX)=0,则转 EXIT SHL AX,1 ;逻辑左移1位,移出位进入 CF JNC LOP INC BL ;如 CF=1,则 BL 加1 JMP LOP EXIT:MOV DA2,BL (1)如上分析,该程序段被用来统计 DA1 中内容含二进制 1 的个数。DA2 字节单元内容 为 DA1 中内容含二进制“1”的个数,也即(DA2)=7。 (2)无论逻辑左移还是逻辑右移指令,均能将 DA1 中的二进制数位一位一位地移到 CF 中, 其程序段功能不变,故可用 SHR 指令代替 SHL 指令。 4.分析下列程序段,回答所提问题。 DA1 DB 87H DA2 DB ? ...... XOR AH,AH MOV AL,DA1 MOV CL,4 SHR AL,CL MOV DL,10 MUL DL
MOVBL,DA1ANDBL,OFHADDAL,BLMOVDA2,AL试问::(1)程序段执行后,DA2字节单元内容是什么?(2)在程序段功能不变情况下,是否可用SAR指令代替SHR指令?解:P73-74XORAH, AH;(AH)=0MOVAL, DA1:(AL)=87HMOVCL, 4;SHRAL,CL取AL的高四位,(AL)=07H:MOVDL,10MULDL:高四位的数字乘以10MOVBL,DA1ANDBL,OFH:取DA1的低四位ADDAL, BLMOVDA2,AL:相加得到(DA2)=57H分析:将DA1的高四位乘以10,再加上低四位,实际完成了将DA1中的BCD码转换为二进制的运算。由分析得:(DA2)=57H。在程序段功能不变情况下,不能用SAR指令代替SHR指令,因为SAR不能将AL的高四位从其中分离出来。5.......DA_B DB0CH,9,8,0FH,0EH,0AH,2,3,7,4.....AX,AXXORXORCL, CLXORBX, BXLOP:TESTDA_B[BX],01HJENEXTADDAL,DA_B[BX]INCAHBXNEXT:INCCLINCCMPCL,10JNELOP试问:(1)上述程序段执行后,AH、AL寄存器中的内容是什么?(2)若将“JENEXT”指令改为“JNENEXT”,那么AH、AL寄存器中的内容又是什么?解:23
23 MOV BL,DA1 AND BL,0FH ADD AL,BL MOV DA2,AL 试问:(1)程序段执行后,DA2 字节单元内容是什么? (2)在程序段功能不变情况下,是否可用 SAR 指令代替 SHR 指令? 解: P73-74 XOR AH,AH ;(AH)=0 MOV AL,DA1 ;(AL)= 87H MOV CL,4 ; SHR AL,CL ; 取 AL 的高四位,(AL)=07H MOV DL,10 MUL DL ;高四位的数字乘以 10 MOV BL,DA1 AND BL,0FH ;取 DA1 的低四位 ADD AL,BL MOV DA2,AL ;相加得到(DA2)=57H 分析:将 DA1 的高四位乘以 10,再加上低四位,实际完成了将 DA1 中的 BCD 码转换 为二进制的运算。 由分析得:(DA2)=57H。 在程序段功能不变情况下,不能用 SAR 指令代替 SHR 指令,因为 SAR 不能将 AL 的 高四位从其中分离出来。 5. ...... DA_B DB 0CH,9,8,0FH,0EH,0AH,2,3,7,4 ...... XOR AX, AX XOR CL,CL XOR BX,BX LOP: TEST DA_B[BX],01H JE NEXT ADD AL,DA_B[BX] INC AH NEXT:INC BX INC CL CMP CL,10 JNE LOP 试问:(1)上述程序段执行后,AH、AL 寄存器中的内容是什么? (2)若将“JE NEXT”指令改为“JNE NEXT”,那么 AH、AL 寄存器中的内 容又是什么? 解:
XORAX, AX;(AX)=0XORCL, CL: (CL)=0XORBX,BX:(BX)=0LOP:TESTDA B[BX],01HJENEXT;若DA_B[BX]中二进制数的最低位为0,转NEXTADDAL,DAB[BX];否则累加该数到ALINCAH:统计奇数个数到AHBXNEXT:INC:修改指针,指向下个二进制数INCCLCMPCL, 10LOPJNE:对10个数完成以上操作后,停止分析可知,该程序实际是对10个数中的奇数求和。所以,(AH)=4:(AL)=34。若将“JENEXT”指令改为“JNENEXT”,则程序功能变为统计偶数的个数,并累加它们的值,故(AH)=6:(AL)=50。6.编写完整的汇编源程序,统计下面定义的数据缓冲区BUF中,非数字字符的个数,放入COUNT单元。设该数据缓冲区最后一个字符为“S',数字字符指“O”“9'。DSEGSEGMENTP30BUFDB4334as432bbGGGn34kkkksCOUNTDWOENDSDSEG解:分析:(1)由于程序必须反复地从BUF中取出字符并判断,故采用循环程序结构。(2)BUF缓冲区的最后一个字符为“S,故采用条件判断法来控制循环结束。(3)非数字字符的个数是指ASCII码小于30H或大于39H的字符。程序设计如下:DSEGSEGMENTBUFDB“4334as432bbGGGn34kkkksSUMDW0DSEGENDSSSEGSEGMENTSTACKDB100STKDUP(2)SSEGENDSSEGMENTCSEGASSUMEDS:DSEG, SS:SSEG, CS:CSEGMOVSTART:AX, DSEGMOVDS,AXMOVSI,OFFSET BUFMOVDX,0LPO:MOVAL,[SI]CMPAL,“s"JEEXIT24
24 XOR AX,AX ;(AX)=0 XOR CL,CL ;(CL)=0 XOR BX,BX ;(BX)=0 LOP: TEST DA_B[BX],01H JE NEXT ;若 DA_B[BX]中二进制数的最低位为 0,转 NEXT ADD AL,DA_B[BX] ;否则累加该数到 AL INC AH ;统计奇数个数到 AH NEXT:INC BX ;修改指针,指向下个二进制数 INC CL CMP CL,10 JNE LOP ;对 10 个数完成以上操作后,停止 分析可知,该程序实际是对 10 个数中的奇数求和。所以,(AH)=4;(AL)=34。 若将“JE NEXT”指令改为“JNE NEXT”,则程序功能变为统计偶数的个数,并累 加它们的值,故(AH)=6;(AL)=50。 6.编写完整的汇编源程序,统计下面定义的数据缓冲区 BUF 中,非数字字符的个数,放入 COUNT 单元。设该数据缓冲区最后一个字符为‘$’, 数字字符指 ‘0’~‘9’。 DSEG SEGMENT P30 BUF DB ‘4334as432bbGGGn34kkkk$’ COUNT DW 0 DSEG ENDS 解:分析:(1)由于程序必须反复地从 BUF 中取出字符并判断,故采用循环程序结构。 (2)BUF 缓冲区的最后一个字符为‘$’,故采用条件判断法来控制循环结束。 (3)非数字字符的个数是指 ASCII 码小于 30H 或大于 39H 的字符。 程序设计如下: DSEG SEGMENT BUF DB ‘4334as432bbGGGn34kkkk$’ SUM DW 0 DSEG ENDS SSEG SEGMENT STACK STK DB 100 DUP (?) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG START: MOV AX,DSEG MOV DS,AX MOV SI,OFFSET BUF MOV DX,0 LP0: MOV AL,[SI] CMP AL,‘$’ JE EXIT
CMPAL,“0"JNCLP1INCDXLP2JMPLP1:CMPAL,3AHJCLP2DXINCSILP2:INCJMPLPOMOVEXIT:COUNT,DX.MOVAH,4CHINT21HCSEGENDSENDSTART题4.2习1.选择题(1)在计算机内部,计算机能够直接执行的程序语言是()。K4.1A.汇编语言B.高级语言C.机器语言D.C语言BX的内容是)。K4.2(2)执行下面的程序段后,(NUM=100MOVBX,NUMNE50B. 0A. 50C.OFFFFHD. 1(3)数据定义BUFDW1,2,3,4K4.2执行指令MOVCL,SIZEBUF后,CL寄存器的内容是()。A. 1B. 0D. 2C.OFFFFH(4)假设VAR为变量,则指令MOVSI,OFFSETVAR的源操作数的寻址方式是(K4.3)A.间接寻址B.存储器寻址C.寄存器寻址D.立即寻址(5)数据定义BUFDB“1234',执行指令MOVLENGTHBUF后,CL寄存器的内CL,容是() K4.21B. 2C. 3A.D. 4(6)设数据段定义如下:DATASEGMENTORG0100HX125,“‘25'DB?X2DWY1EQUX1Y2EQU$-Y1DATAENDS25
25 CMP AL,‘0’ JNC LP1 INC DX JMP LP2 LP1: CMP AL,3AH JC LP2 INC DX LP2: INC SI JMP LP0 EXIT: MOV COUNT,DX MOV AH,4CH INT 21H CSEG ENDS END START 4.2 习 题 1.选择题 (1)在计算机内部,计算机能够直接执行的程序语言是( )。K4.1 A.汇编语言 B.高级语言 C.机器语言 D.C 语言 (2)执行下面的程序段后, BX 的内容是( )。K4.2 NUM= 100 MOV BX, NUM NE 50 A.50 B.0 C.0FFFFH D.1 (3)数据定义 BUF DW 1,2,3,4 K4.2 执行指令MOV CL,SIZE BUF后,CL寄存器的内容是( )。 A.1 B.0 C.0FFFFH D.2 (4)假设VAR为变量,则指令MOV SI,OFFSET VAR的源操作数的寻址方式是(K4.3) A.间接寻址 B.存储器寻址 C.寄存器寻址 D.立即寻址 (5)数据定义BUF DB ‘1234’,执行指令MOV CL, LENGTH BUF后,CL寄存器的内 容是( )K4.2 A. 1 B.2 C.3 D.4 (6)设数据段定义如下: DATA SEGMENT ORG 0100H X1 DB 25,‘25’ X2 DW ? Y1 EQU X1 Y2 EQU $-Y1 DATA ENDS