第四章 汇编语言程序设计

文章目录

前言:最近在学习汇编语言,使用教材为《汇编语言》(第2版),郑晓薇著。下文的内容为对应章节的练习题、测试题答题记录。只做了部分。

第四章 汇编语言程序设计

4.1 汇编语言程序有什么特点?什么是源程序?

汇编语言程序和高级语言程序一样,有顺序、分支、循环、子程序4种结构形式。与高级语言不同之处是要用伪指令来通知汇编(翻译)程序哪部分是代码段、哪部分是数据段,数据段中都定义了哪些单元,这些单元存放什么数据;堆栈区的设置、主程序和子程序定义、宏的使用等。

用户编写的汇编语言程序称为源程序。

4.2 简要说明从源程序到可执行程序的操作过程。

文本编辑源程序—>源程序.ASM—>汇编程序MASM—>目标程序.OBJ—>连接程序LINK—>可执行文件.EXE

4.3 什么是伪指令?汇编指令与伪指令有何区别?写出4种常用的伪指令。

伪指令又称为伪操作。所谓伪指令,是指它们不能像汇编指令一样生成可执行的二进制机器代码,而是在汇编程序对汇编语言源程序进行汇编(翻译)期间,又汇编程序执行。伪指令与C语言等高级语言中的说明性语句的含义类似,起到说明的作用。

例如:

1、段定义伪指令

段名 SEGMENT [类型参数]

​ ……

段名 ENDS

2、数据定义伪指令

[存储单元名] DB (或DW、DD等伪指令) 操作数

3、赋值伪指令

CONT EQU 125 * 3.14

4、模块定义伪指令

[NAME 模块名]

​ ……

END 起始标号

4.4 8086指令系统分为哪几类?举例说明算术运算类指令的用法。

传送类指令、算术运算指令、DOS中断调用等

算术运算类指令:

加法指令 ADD AX,BX

减法指令 SUB AX,BX

4.5 在8086汇编语言中,哪些段寄存器可以用MOV指令赋值,哪些段寄存器不允许?

允许赋值:数据段寄存器DS;堆栈段寄存器SS;附加段寄存器ES;

不允许赋值:段地址寄存器CS

4.6 堆栈段寄存器SS和栈指针SP可以修改吗?如何修改?

可以修改

4.7 入栈指令PUSH和出栈指令POP可以保存字节数据吗?要保存的话,如何实现?

入栈可以保存字节数据。格式:PUSH SRC,将堆栈指针SP减2,再将操作说SRC入栈。

4.8 有哪些方法可以获得操作数的有效地址?

LEA有效地址传送指令、LDS数据段地址传送指令、LES附加段地址传送指令

4.9 解释下列伪指令的作用:

​ (1) ASSUME CS:CODE,DS:DATA (2) END START
​ (3) VALUE DW 12,35,-6 (4) STRING DB ‘INPUT:’
​ (5) MESS DB 5 DUP(?) (6) XX DD 12345678H
​ (7) ORG 0320H (8) CONT EQU 2*3.14

4.10 根据题目,写出相关伪指令:

(1) 定义数据段DATA,并在数据段中定义两个字单元X、Y,初始值都是0
(2) 定义一个字符串SRING,保存’Computer’
(3) 定义有100个字节单元的COUNT数组,初始值均为空
(4) 用赋值伪指令定义PI为3.14
(5) 用类型操作符LABEL将VALUE单元定义为字节型

4.11 下列伪指令有错吗?如果有错,请指出错误原因:

​ (1) X1 DB 35H,0,-80 (2) X2 DB 35,260,-1 (3) X3 DB 1234H
​ (4) X4 DW 100 (5) X5 DW 100(?) (6) X6 DD ‘AB’

4.12 写出下列指令的执行结果:

​ TABLE DB 3,33,33 H
(1) MOV AL,TABLE
(2) MOV AX,WORD PTR TABLE
(3) MOV DX,OFFSET TABLE
(4) MOV CL,TABLE+2
(5) MOV BX,SEG TABLE
(6) MOV BX,TYPE TABLE
(7) LEA DX,TABLE

4.13 写出指令序列,分别求两个双精度数20125D68H和100349A6H的相加和相减运算。

4.14 写出将DX、AX中的32位无符号数减CX中的16位无符号数,结果存放在DX、AX中的指令序列。

4.15 写出将extra段的段地址传送给ES寄存器的指令序列。

4.16 根据给出的算式,写出指令序列(设X、Y、W为字节型,Z为字型):

(1) Z=5(X+16)
(2) Z=X/4-Y
(3) Z=8X+Y/16-W^2
(4) Z= (X+Y)(X-Y) -X/Y

4.17 分析下列程序段执行情况,给出结果:
​ X DB 5,15,30
​ Y DB 22,14,6
​ Z DW ?
​ ……
MOV BX,OFFSET X
MOV AL,[BX]
ADD AL,Y
INC BX
SUB AL,[BX]
MOV BL,Y+1
IMUL BL
MOV Z,AX

4.18 源程序在汇编过程中,系统是如何获知程序从哪儿开始执行的?

从伪指令END START处获知程序从START标号开始。

4.19 两个数8576H和9988H,分别作减法和加法运算,写出指令及运算结果。运算结果影响哪些标志?

4.20 乘法和除法指令对于字和字节操作是如何进行的?

4.21 用压缩BCD码实现下列运算:

(1) Y1=56+34
(2) Y2=128-35
(3) Y3=68+23-45

4.22 用非压缩BCD码实现下列运算:

(1) Z1=78+46
(2) Z2=95-27
(3) Z3=12×6-33
(4) Z4=(74+18)/6

4.23 编程序。从键盘输入一个数字,去掉ASCII码后保存到BUFF单元。

4.24 编程序。将键盘输入的小写字母变为大写字母显示在屏幕上。
4.25 X和Y都是字节型数据,编写将两数相加的结果显示出来的程序段。
4.26 编写程序,建立一个0~9的平方根表,查表可得某数的平方根。
4.27 编写查表程序。建立一个班级姓名表,给出学号,可显示出其姓名。
4.28 编程实现公式计算Z=X/4+16Y。
4.29 编写程序段,将AL中的数乘以6,与CL相减后再除以3;把商保存到Y单元,余数保存到Y+1单元。
4.30 用简化的程序格式编程序,在屏幕的5行12列上显示红底白字的字符串“Come”。

说点什么

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
提醒