微机原理习题4-汇编语言程序设计 下载本文

习题四 汇编语言程序设计

主要内容:汇编语言程序设计。主要介绍汇编语言程序的设计方法与编程原理,重点掌握算术运算程序、字符串处理程序、码制转换程序、子程序设计程序、常用DOS和BIOS功能调用

程序、汇编语言常用伪指令。

4.1 分析执行下列指令序列后的结果: 1) MOV AX,1234H

MOV BX,00FFH AND AX,BX 【答】(AX)=0034H 2) MOV AL,01010101B AND AL,00011111B ;(AL)=00010101B OR AL,11000000B ;(AL)=11010101B XOR AL,00001111B ;(AL)=11011010B NOT AL 【答】(AL)=00100101B 3) MOV DL,05H

MOV AX,0A00H MOV DS,AX MOV SI,0H MOV CX,0FH AGAIN: INC SI CMP [SI],DL LOOPNE AGAIN HLT

本程序实现了什么功能?

【答】在以0A001H开始的15个单元中查找05H。 4) MOV AX,DSEGADDR

MOV DS, AX MOV ES,AX MOV SI, OFFSET B1ADDR MOV DI,OFFSET B2ADDR MOV CX,N CLD REP MOVSB HLT

本程序实现了什么功能?

【答】 将B1ADDR中N个字节数据传送到B2ADDR开始的15个存储单元 。 5) MOV AX, 0H

MOV DS,AX MOV ES, AX

MOV AL,05H

MOV DI,0A000H MOV CX,0FH CLD AGAIN: SCASB LOOPNE AGAIN HLT

本程序实现了什么功能?

【答】从地址0A000H开始的15个单元中查找字节型数据05H,用条件循环LOOPNZ,控制数据05H的查找。 4.2 阅读程序: 1). CLD LEA DI,[0100H] MOV CX, 0080H XOR AX, AX

REP STOSW 本程序实现了什么功能?

【答】将DS中起始地址为0100H的128个字节单元清零。 2). MOV AL, 08H SAL AL,01H ;(AL)=00010000H MOV BL, AL MOV CL ,02H SAL AL,CL ;(AL)=01000000H ADD AL,BL ;(AL)=01010000H 本程序实现了什么功能? 【答】 将AL中的内容乘以10。

4.3 试分析下列程序完成什么功能? MOV DX,3F08H MOV AH,0A2H MOV CL,4 SHL DX,CL ;(DX)=F080H MOV BL,AH SHL BL,CL ;(BL)=20H SHR BL,CL ;(BL)=02H OR DL,BL ;(DL)=82H

【答】将DX中的低4位数据8H分离出来,将AH中的低4位数据2H分离出来,合并为82H存放在DL。

4.4 已知程序段如下: MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX 试问:(1)每条指令执行后,AX寄存器的内容是什么?(2)每条指令执行后,CF,SF及ZF的值分别是什么?(3)程序运行结束时,AX及DX寄存器的值为多少? 【答】 MOV AX,1234H ; (AX)=1234H, CF=SF=ZF=0 MOV CL,4 ROL AX,CL ; (AX)=2341H ,CF=1,SF=ZF=0 DEC AX ; (AX)=2340H, CF=1,SF=ZF=0 MOV CX,4 ; MUL CX ;(AX)= 8000H ,CF=ZF=0,SF=1,DX=0 4.5 试分析下列程序段: ADD AX,BX JNC L2 SUB AX,BX JNC L3 JMP SHORTL5 如果AX、BX的内容给定如下: AX BX (1)14C6H 80DCH (程序转向 L2) (2)B568H 54B7H (程序转向 SHORTL5 ) 问该程序在上述情况下执行后,程序转向何处? 【答】 (1) 程序转向 L2。

(2) 程序转向 SHORTL5。

4.6 以下为某个数据段,试问各个变量分别占多少字节,该数据段共占多少字节? DATA SEGMENT VAR1 DW 9 ;2字节 VAR2 DD 10 DUP(?),2 ;44字节 VAR3 DB 2 DUP(?,10 DUP(?)) ;22字节 VAR4 DB ‘HOW ARE YOU' ;11字节 DATA ENDS 【答】该数据段共占79字节。

4.7 下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。 VAR1 DB 10,2 ;2字节 VAR2 DW 5DUP(?),0 ;12字节 VAR3 DB ‘HOW ARE YOU?',‘$' ;13字节 VAR4 DD -1,1,0 ;2字节

Var1 Var2 Var3 Var4 10 ? ? FFH 2 ? U 00H ? O 00H ? Y 00H ? 01H ? E 00H ? R 00H ? A 00H ? 00H ? W 00H 0 O 00H 0 H 00H $

4.8 编写一段程序,比较两个5字节的字符串OLDS和NEWS,若相同,在RESULT置0,否则置0FFH。

【答】 参考程序:

DATA SEGMENT OLDS DB 1,2,3,4,5 NEWS DB 1,2,3,4,'A' N = $-NEWS RESULT DB 0 DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA

MOV DS,AX ;初始化 MOV SI,OFFSET OLDS MOV DI,OFFSET NEWS MOV CX,N DON: MOV AL, [SI] CMP AL, [DI]

JNZ NOEQU ;串不相等转 INC SI INC DI LOOP DON MOV AL,0 JMP OUTPUT

NOEQU: MOV AL,0FFH OUTPUT: MOV RESULT,AL STOP: JMP STOP ;程序陷阱 CODE ENDS

END START

4.9 编程求和Y=A1 + A2 + ?. + A100 。其中Ai为字节变量。 【答】 参考程序: DATA SEGMENT

TABLE DW 1111H,2222H,3333H,2222H COUNT EQU $-TABLE YAL DW ? YAH DW ? DATA ENDS

CODE SEGMENT MIAN PROC FAR

PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV DX,0 XOR AX, AX ;清AX MOV BX, OFFSET TABLE MOV CX, 4

LP: ADD AX, [BX] ;求和

ADC DX,0

INC BX

INC BX ;指向下一个数 LOOP LP ;未加完,继续 MOV YAL,AX ;存和 MOV YAH,DX

MAIN ENDP CODE ENDS

END START

4.10 内存中以FIRST和SECOND开始的单元中分别存放着两个16位组合的十进制(BCD码)数,低位在前。编程序求这两个数的组合的十进制和,并存到以THIRD开始的单元。 【答】 参考程序:1325+9839=? DATA SEGMENT

FIRST DB 05H,02H,03H,01H ; SECOND DB 09H,03H, 08H,09H; THIRD DB 20 DUP (?)

DATA ENDS

STACK SEGMENT

ST1 DB 100 DUP (‘SA’) TOP1 EQU $ - ST1

STACK ENDS

CODE SEGMENT

ASUMME CS:CODE,DS:DATA,SS:STACK

MAIN PROC FAR

START: MOV AX, DAT ;初始化数据段

MOV DS, AX MOV AX, STACK ;初始化堆栈段 MOV SS, AX MOV AX, TOP1 MOV SP, AX MOV CX, 4 ;计算4次 MOV BX, OFFSET DAT1 ;取数据地址 MOV SI , OFFSET DAT2 ;取数据地址 MOV DI , OFFSET SUM ;取结果地址 MOV AH, 00H ;将暂存标志的AH清0

DON1: MOV AL, [BX] ;取第一个数

SAHF ;将AH中的标志送标志寄存器 ADC AL, [DI] ;与第二个数带进位加 AAA ;十进制校正 LAHF ;将标志寄存器内容送AH OR AL, 30H ;计算值拼成ASCII码 MOV [DI], AL ;存结果的ASCII码 INC BX ;指向第一个数的下一位 INC SI ;指向第二个数的下一位 INC DI ;指向结果单元的下一位 LOOP DON1 ;未计算完,继续