第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
21
(4) (AL) = X1 AND X3 = 30H AND 0F7H = 30H P98 (5) (AL)= X1 OR X3 = 30H OR 0F7H = 0F7H
(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
22
MOV DL,10
MUL DL
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寄存器中的内
23
容又是什么? 解:
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]
24
CMP AL,‘$’ JE EXIT 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
25
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库微机原理习题集以及答案第二版(5)在线全文阅读。
相关推荐: