过程定义伪指令PROC
微计算机原理基础填空题附答案

第一章:概述●计算机时钟脉冲的频率称为(主频),它的倒数称为(时钟周期)。
●冯. 诺依曼原理是基于(程序存储)和(程序控制)。
●计算机中的总线包括(地址总线)、(数据总线)和(控制总线)。
●CPU有(运算器)、(控制器)、(寄存器)和(接口单元)。
●计算机硬件系统由(CPU )、(存储器)和(I/O接口)组成。
●计算机系统由(硬件)系统和(软件)系统两大部分组成。
●CPU的字长与(数据线宽度)有关;寻址空间与(地址线宽度)有关。
●若CPU的数据线宽度为8位,则它的字长为(8 )位;地址线宽度为16位,则它的寻址空间为(64K )。
●计算机语言分为(机器)语言、(汇编)语言和(高级)语言。
●计算机软件分为(系统)软件和(应用)软件两大类。
●将源程序翻译为目标程序的语言处理程序有(汇编)程序、(解释)程序和(编译)程序。
●指令通常包含(操作码)和(操作数)两部分;不同功能指令的有序集合称为(程序)。
●正数的原、反、补码(相同);负数的原、反、补码(不同)。
●十进制数17的二进制数表示为(00010001B )。
●十六进制数17H的二进制数表示为(00010111B )。
●十进制符号数+5在计算机中的8位二进制补码表示为(00000101 )。
●十进制符号数-5在计算机中的8位二进制补码表示为(11111011 )。
●机内符号数01111000的真值为(+120 );机内符号数11111000的真值为(-8 )。
●计算机处理小数有(定点)表示法和(浮点)表示法。
●在小数的定点表示中有(纯小数)表示和(纯整数)表示。
●基本ASCII码为(7 )位编码,共(128 )个码值;含(32 )个控制码和(94 )个符号码。
●字符A的ASCII码值为41H;字符a的ASCII码值为(61H );字符B的ASCII码值为(42H )。
●十进制数89的二进制表示为(01011001 );十六进制表示为(59H )。
●十六进制数7BH的十进制数表示为(124 );二进制表示为(01111011B )。
8086汇编语言伪指令

一、伪指令详解伪指令在百度百科中的定义为:伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。
例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。
伪指令有2个特点:1.由于是伪“指令”,因而它只存在于汇编语言中。
高级语言中不叫指令,叫语句;2.由于是“伪”指令,也即“假”指令,因而不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。
与指令的区别::1.指令是在执行阶段发挥作用的,由CPU(Intel、AMD等)来执行。
2.伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。
二、数据定义伪指令为源程序中的数据和堆栈区分配数据存储单时,使用最多的伪指令。
数据定义伪指令格式如下:常用的数据定义伪指令类型有:∙DB(定义字节,常用)一个字节数据占1个字节单元,读完一个,偏移量加1∙DW(定义字,常用)一个字数据占2个字节单元,读完一个,偏移量加2∙DD(定义双字)一个双字数据占4个字节单元,读完一个,偏移量加4∙DQ(定义四字)一个四字数据占8个字节单元,读完一个,偏移量加8∙DT(定义十字节,用于BCD码)数据定义伪指令后面的初值表可以是常数、表达式、字符串。
例如:D2DW110*230;为D2分配1个字,存放表达式的值D3DB‘GOOD!’;为D3分配5字节,用来存放字符串‘GOOD!’D4DD2.4E+3;为D4分配2个字,存放一个浮点数D5DB‘AB’;为D5分配2字节,字符A在低字节,B在高字节D6DW‘AB’;为D6分配1个字,字符A在高字节,B在低字节S1DB5DUP(?);为S1预留5字节的存储空间S2DW3DUP(0);为S2分配3个字,初值设为0语句1相当于C语言中的DW D2=110*230,只不过是语法结构不太一样注意:通过变量名操作时,变量名代表存储区的第一个数据的地址。
子程序的调用

mov ax,data mov ds,ax call nearp lea ax,nearp call ax call nproc lea bx,nproc call word ptr [bx]
call farp call fproc lea bx,fproc
Nearp proc near
…… ret Nearp endp Code1 ends end main code2 segment
3)在调用时,NEAR 和FAR 可以强制改变 CALL FAR PTR NEARPROC CALL NEAR PTR FARPROC
子过程的调用与返回指令
子过程的调用是个”有去有回”的过程,子程序执行
完后必须返回CALL指令的下一条指令处,因此必须对
CALL指令的下条指令的地址进行保存.保存地址的操作 是通过堆栈来完成.不是采用PUSH \POP指令来实现,而
通过存储器来传递参数
当调用程序和子程序处于同一文件中,可以直接访问 块内的变量或数据。 举例3:编写程序从键盘上输入一个字符串,存于变量为INPUT中, 要求以回车键作为输入过程的结束,字符结尾部分添加0。 (1) 分析: 子程序getstring直接从键盘输入字符串,入口参数:无。出 口参数:字符串变量INPUT 变量INPUT 属于通过存储器传递参数,调用程序和子程序处 于同一文件在数据段定义变量属于局部变量
Findmax proc
mov ax,[si] Lp1: cmp ax,[si+2] jg next xchg ax,[si+2] next: add si,2 loop lp1 ret findmax endp Code ends
end main
参数的传递
汇编语言程序设计复习题答案

《汇编语言程序设计》复习题一、填空题1、8086CPU内部结构按功能分为两部分,即 BU(执行部件)和 BIU(总线接口部件)。
2、CPU中的总线接口部件BIU,根据执行部件EU的要求,完成CPU与主存储器或I/0端口之间的数据传送。
3、8086中的BIU由四个 16 位段寄存器、一个 16 位指令指针、 6 字节指令队列、 20 位地址加法器和总线控制电路组成。
4、8086/8088的执行部件EU由 8 个通用寄存器、 1 个专用寄存器、一个标志寄存器和 ALU 等构成。
5、根据功能不同,8086的标志位可分为状态标志和控制标志。
6、8086/8088构成的微机中,每个主存单元对应两种地址:段基值和偏移量。
7、8086CPU具有 20 根地址线,直接寻址能力可达 1M 。
8、逻辑地址由段基值和偏移量组成,其中的段基值是由段寄存器存储。
9、计算机的指令由操作码和地址码两部分组成。
10. 零地址指令是不带地址码的机器指令,其操作数是由隐含指定提供的。
11. 8088CPU中共有 14 个寄存器,这些寄存器为 16 位。
12. F标志寄存器共有9个标志位,除OF、SF、AF和CF外,还有 DF 、 IF 、 TF 、▁ ZF 和 PF ,其中用于记录是否产生进位的标志位是 CF 。
13. 标号和变量所具有的三种属性分别为段属性、偏移量属性和类型属性。
14. 操作数有三种类型,分别为常数操作数、寄存器操作数和存储器操作数。
15. 一个源程序中可以包含代码段、数据段堆栈段及附加段。
其中代码段是源程序中必不可少的,其它的段可有可无。
16. SEGMENT/ENDS称为段定义伪指令;ASSUME称为段寻址伪指令;NAME/END称为模块定义伪指令;源程序结束伪指令为 END ;过程定义伪指令为 PROC/ENDP 。
数据定义伪指令为 DB 、 DW 、DD 。
17. 一般DOS系统功能调用的步骤为:(1) 送入口参数到指定寄存器;(2)送功能号至AH ;(3)软中断指令INT 。
汇编语言-子程序

随着指令的丰富、子程序的引入,汇编语言的表达也越来越灵 活。为了方便地组织数据,引入了结构伪操作STRUC。 STRUC可以把不同类型的数据放在同一个结构里,方便处理。 a). 结构类型说明格式为: structure_name STRUC … ;DB、DW、DD等伪操作 structure_name ENDS 注意:ENDS之前为结构名,注意与段结束相区别。 例如:下列语句说明了一个名STUDENT的结构类型: STUDENT STRUC ID DW ? SCORE DB 0 NAME DB „ABCDEFGH‟ STUDENT ENDS 但是,定义一个结构类型的时候不进行任何存储器分配,只有 在定义结构变量时才进行存储分配。
b). 结构变量的定义 格式是: [变量名] 结构名 < [字段值表]> 例:Lisi STUDENT <103 , 88 , „LI‟> ;三个字段重新赋值 Wangwu STUDENT <104 ,, „WANG‟> ;字段SCORE仍用缺省 值 Zhangsan STUDENT <> ;三个字段均用缺省初值 Team STUDENT 50 DUP (<>) ;定义50个结构变量,初值不变 在定义结构变量时,如果某个字段有多值,就不能给该字段重 新赋初值(定义时存在“DUP”, “ , , , ”等)。 c). 访问方式 访问方式:结构变量名.结构字段名 该变量的地址实质少年宫是结构变量地址的偏移பைடு நூலகம்相应字段偏 移值之和。 例:Zhangsan.ID ;访问张三的学号,实际上是直接寻址 还可以把结构变量地址的偏移先存入某个基址或变址寄存器, 然后利用“[寄存器名]”来代替结构变量名。 例如:MOV BX , OFFSET Zhangsan MOV AL , [BX].SCORE
指令系统中各种助记符的英文全名

我现将指令系统中各种助记符的英文全名写出来,各种助记符的记忆就会变得很简单o(∩_∩)o...在这之前,先说一下寄存器:数据寄存器分为:AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.BH&BL=BX(base):基址寄存器,常用于地址索引;CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.DH&DL=DX(data):数据寄存器,常用于数据传递。
他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。
这2组8位寄存器可以分别寻址,并单独使用。
另一组是指针寄存器和变址寄存器,包括:SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置;BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。
指令指针IP(Instruction Pointer)标志寄存器FR(Flag Register)OF(overflow flag)DF(direction flag)CF(carrier flag)PF(parity flag)AF(auxiliary flag)ZF(zero flag)SF(sign flag)IF(interrupt flag)TF(trap flag)段寄存器(Segment Register)为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。
伪指令用来对汇编程序进行控制

伪指令用来对汇编程序进行控制,对程序中的数据实现条件转移、列表、存储空间分配等处理,其格式和汇编指令一样,但一般不产生目的代码,即不直接命令CPU 去执行什么操作。
伪指令是汇编语言的特色之一,具有两个基本特征:1、伪指令是一条指令。
它在程序中不是可有可无的,使用时受到严格的规范,与标准指令一样,在程序中占有固定的位置,有固定的书写格式。
每条伪指令都与标准指令一样可实现特定的功能,伪指令是不能用标准指令替代的。
2、伪指令不是一条真正的指令,没有指令代码。
在程序编译过程中,伪指令的功能会被实现,但伪指令会被删除,在编译后的目标文件中(目标文件一般是代码文件),不会有伪指令的编码。
也可以这样理解:指令是对计算机发出的命令,而伪指令则是对编译器发出的命令。
在编译程序结束时,伪指令的使命就完成了。
伪指令是相对标准指令而言的,高级语言不存在伪指令,因为高级语言不存在指令,很难说明高级语言中哪一条语句是什么指令。
伪指令是为程序开发工程师提供辅助的程序表达,让编译器实现一些标准指令所不能表达的内容。
伪指令的作用:1、程序定位的作用。
把各程序段之间的相互关系和在存储器的位置告诉编译器。
2、为非指令代码进行定义。
包括逻辑变量、字符和存储区等。
3、为程序完整性做标注。
程序段的开始和结束。
4、有条件地引用程序段。
比如条件循环、条件选择以及宏等。
在ARM处理器中,伪指令的应用和51系列的单片机很相似,它们除了把正常的程序用指令表达给计算机以外,还需要把程序设计者的意图表达给编译器。
无论是51系列单片机还是ARM处理器,都需要定义数据以便编译器能够正确识别代码和数据,都可以引用宏,都可以为符号或变量赋值等。
一、定义数据伪指令该类伪指令用来定义存储空间及其所存数据的长度。
· DB :定义字节,即每个数据是 1 个字节。
· DW :定义字,即每个数据占 1 个字 (2 个字节 ) 。
· DD :定义双字,即每个数据占 2 个字。
(完整版)汇编语言中常用的伪指令档

汇编语言中常用的伪指令分类:软件相关2013-01-23 20:13 515人阅读评论(0) 收藏举报areaequ伪指令常用汇编语言汇编语言中,指令语句在源程序汇编时会产生可供计算机执行的指令代码,即目标代码。
汇编程序除指令语句外,还需要提供一些指令,用于辅助源程序的汇编。
比如指定程序或数据存放的起始地址,为数据分配一段连续的内存单元等。
这些指令在汇编时并不生成目标代码,不影响程序执行,因此称之为伪指令。
本文简单总结了常用的伪指令,如下。
1、EQU(Equate)一般格式为:标号:EQU 操作数指令功能为将操作数赋予标号,两边的值完全相等。
使用EQU伪指令给一个标号赋值后,此标号在整个源文件中值固定。
AREA: EQU 1000H ;将标号AREA赋值为1000H2、ORG(Origin)一般格式为:ORG xxxxH(绝对地址或标号)XxxxH决定此语句后第一条指令(或数据)的地址。
该段源程序或数据被连续存放在此后的地址内,直到下一条ORG指令为止。
ORG 8000H ;此后目标代码存储在存储器中以0x8000h开始的地址空间中。
ADD R1,#1MOV R2, #23、DB(Define Byte)一般格式为:标号:DB 字节常数或字符或表达式标号字段可有可无,字节常数或字符是指一个字节数据。
此伪指令的功能是把字节常数或字节串存放至内存连续的地址空间中。
ORG 8000HDATA1:DB 43H,09H,08HDATA2:DB 07H伪指令DB指定了43H,09H,08H 顺序存放在8000H开始的存储单元中,DATA2中的07H紧挨着DATA1的地址空间存放,即07H存放在8003H单元中。
注:DW(Define Word)指令定义与DB类似,区别在于DW定义一个字,DB定义一个字节。
4、END一般格式为:标号:END 地址或标号地址或标号可以忽略。
此伪指令用于指示汇编语言程序段结束。
因此一个源程序中仅有一个END,且一般放在程序最后。
2.4伪指令

EQU:为标号赋值。
◦ 格式:label: . EQU value ◦ 所赋之值可以为在此标号之前定义过的某一符号常量或一 表达式。符号不能超前引用。 ◦ 举例:
label: .EQU 10
VDEF:为标号赋值,可以在程序的任何部位为标 号重复赋值。
◦ 格式:int0: .VDEF 0x5F
主要用来对段、程序数据等进行定义。 1、 PUBLIC, EXTERNAL, DEFINE, VAR, EQU, VDEF
PUBLIC:声明将在其他文件中被引用的全局标号。 格式:.PUBLIC label[ ,label] [ ,…] 当要声明多个全局标号时,要用逗号将每一标号分开。 在外部文件中用伪指令EXTERNAL所声明的标号必须是用 PUBLIC伪指令已经声明过的。 ◦ 举例: .PUBLIC sym1,sym2 //声明多个全局标号用逗号隔开, 空格被忽略 ◦ ◦ ◦ ◦
DW:以16位整型数据形式来存储常量或变量。 格式:[label:] .DW [value][,value][,…] 说明:
◦ 本伪指令是把一系列的16位整型常量或变量存入连续的整 型数据单元中。 ◦ 用逗号隔开多个数值。 ◦ 常量中含有ASCII字符串,必须用单引号将其括起来。 ◦ 若DW后未输入任何数值,自动会存入一个整型零常量。
过程调用 在程序中调用一个过程时,程序控制就从调用程序 中转移到被调用的过程,且从过程的起始位置开始 执行该过程的指令,直到执行到RETF指令时,程序 控制返回调用过程时原程序的断点位置继续执行下 面的指令。 过程调用格式:
◦ CALL 过程名
举例:
(汇编语言教程)5_80868088汇编语言-2

104H DUP(11H 104H DUP(11H)
DUP( DUP(0)
ENDS
ENDS DATA2 DATA2 SEGMENT PARA DB COMMON ‘DATA2’ DATA2 DATA N2 DATA2 DATA2 105H DUP( 105H DUP(0)
DATA2 DATA2 N1 DATA2 DATA2 END
默认值为: 默认值为:PARA
III、 III、组合类型
段名 SEGMENT [定位类型] [组合类型] [使用类型] [‘类别’] 定位类型] 组合类型] 使用类型] [‘类别 类别’ …… …… ; 语句序列 段名 ENDS
PRIVATE:私有段,不进行组合。 PUBLIC:
– 不同模块中的同为public属性的同名段连接组合成一个逻辑段。
3、过程定义伪指令
格式: 格式:过程名 [类型 类型] PROC [类型] … 过程体语句 RET 段名 ENDP PROC和ENDP是成对出现的 是成对出现的。 PROC和ENDP是成对出现的。 类型有近(NEAR)和远(FAR)两种, 类型有近(NEAR)和远(FAR)两种,若过程缺省 NEAR缺省 则属默认值。若为远过程, FAR不 缺省, 或NEAR缺省,则属默认值。若为远过程,则FAR不 能省略。 能省略。 过程名具有段地址、 过程名具有段地址、段内偏移量和类型三个属 性。
2、源程序开始和结束伪指令
程序开始伪指令
– NAME伪指令 NAME伪指令 – TITLE伪指令 TITLE伪指令
程序结束伪指令
– END
(1)程序开始伪指令NAME 程序开始伪指令NAME
NAME伪指令 NAME伪指令 格式: 格式:NAME 模块名 含义:表示一个模块的开始, 含义:表示一个模块的开始,并给出该模 块名。 块名。
8086指令系统中的指令英文全称

8086指令系统中的指令英文全称数据寄存器分为:AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.BH&BL=BX(base):基址寄存器,常用于地址索引;CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.DH&DL=DX(data):数据寄存器,常用于数据传递。
他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。
这2组8位寄存器可以分别寻址,并单独使用。
另一组是指针寄存器和变址寄存器,包括:SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置;BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。
指令指针IP(Instruction Pointer)标志寄存器FR(Flag Register)OF(overflow flag)DF(direction flag)CF(carrier flag)PF(parity flag)AF(auxiliary flag)ZF(zero flag)SF(sign flag)IF(interrupt flag)TF(trap flag)段寄存器(Segment Register)为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。
伪 指 令

<>
2.标号定义伪指令
格式:标识符 LABEL 类型 功能:给其后的内存单元定义一个新的类型属性
说明:给该伪指令后面的一个变量或标号定义另外一种属性,但不 重新分配内存空间,便于以多种形式访问定义的变量或标号。
例如: WORD_ARY LABEL WORD
BYTE_ARY DB 100 DUP (0)
其汇编后的存储格式如图。
(4,5),6)
<>
1.3 段定义伪指令
8086/8088的存储器采用分段技术来组织,存储器的物理地址是 由段地址和偏移地址组合而成。因此,8086/8088的程序设计必须按 段来组织、使用存储器,每一个数据或代码都应存储于一个指定的段 当中,与段定义有关的伪指令是:SEGMENT┅ENDS,ASSUME和ORG
MY_DATA SEGMENT ;定义一个数据段,内部有三个变量
ORG 100H ;数据段的变量从100H开始定义
X DB 10 ;偏移地址为100H
Y DB 6 ;偏移地址为101H
Z DB ? ;偏移地址为102H
MY_DATA
ENDS
;段定义结束
MY_STACK
SEGMENT
;定义一个100字的堆栈
分别使用两个变量名,对一个存储空间,实现字节地址存取一个字节,
或字地址同时存取两个字节数据。
又比如:
FAR_LAB LABEL FAR ;定义下面程序为远调用,可被其它段调用。
NEAR_LAB:PUSH AX ;段内标号,只能被同一段内的程序调用。
┋
;程序体
<>
1.2 变量定义伪指令
变量定义就是为数据分配一个确定的存储单元,同时,为了程序使用 该单元方便,给这个存储单元取了一个唯一的名字(变量名)。定义 的存储单元可以是字节、字、双字、三字、四字和十字节
子程序的调用

主程序流程图
开始
调用子程序DECBIN,从键盘 接受一个十进制并转化为对应的二进制 调用子程序CRLF实现回车换行 调用子程序BINHEX,把二进制数转换成 16进制并显示 调用子程序CRLF实现回车换行 Y 是否退出 N 接收下一次键盘输入 END
decbin PROC NEAR push ax push cx mov bx,0 mov si,0 Newchar: mov ah,1 int 21h cmp al,’*’ je ext1 sub al,30h jl ext2 cmp al,9 jg ext2 cbw xchg ax,bx mov cx,10 mul cx xchg ax,bx add ax,bx jmp newchar
子程序的定义
3.注意问题
1)过程体内必须有一条RET指令被执行 proc1 proc mov ax,0 proc1 endp proc2 proc mov bx,-1 ret proc endp
子程序的定义
2)调用程序和过程在同一程序段时,属性选择NEAR,当调 用程序和过程不在同一程序段时,应选择FAR 3)在调用时,NEAR 和FAR 可以强制改变 CALL FAR PTR NEARPROC CALL NEAR PTR FARPROC
参数的传递
1 参数传递: 当子程序被调用时,一般需要向子程序传递若干参数, 由子程序来对这些参数完成特定功能处理;当子程序 处理后,需要向调用它的主程序传递结果。这种主程 序和子程序之间的信息的传递称为参数的传递。
参数的传递
2 参数传递方法: 寄存器传递参数 存储器传递参数 地址表传递变量地址 堆栈传递参数
子过程的调用与返回指令
4.子程序调用方式举例
分析下面程序段,说明各种调用子程序的方法和寻址方式: data segment nproc dw nearp fproc dd farp data ends code1 segment assume cs:code1,cs:data Main proc far
过程定义伪指令PROCENDP课件

通过RET指令将程序的控制权返回到调用该过程的程序。
过程定义的示例演示
示例代码
我们将演示一个简单的过程定义示例,让你可以更好地了解过程定义伪指令的实际应用。
总结与要点
1 伪指令是一种特殊的汇编语言指令
它们用于指示编译器执行某些操作而不生成机器指令。
2 PROC指令用于定义一个过程
它可以定义过程名、局部符号和参数传递。
过程定义伪指令PROCENDP课 件
欢迎来到过程定义伪指令(PROCENDP)课件!本课程将深入浅出地介绍伪指 令的概念、PROC和ENDP伪指令的详细解释、过程的定义和结束方法,以及给 令的含义。伪指令是一种特殊的汇编语言指令,用 于指示编译器或汇编器在编译过程中执行某些操作,而不是生成实际的机器 指令。它们主要用于定义常量、变量、宏、过程等。
如何定义一个过程?
1
选择合适的过程名
过程名应具有描述性和可读性,以便其他程序员能轻松理解。
2
确定过程所需的参数
根据过程的功能,确定所需的参数类型和数量。
3
编写过程的代码
使用PROC指令定义过程的开始,并编写过程的功能代码。
如何结束一个过程?
编写过程的结束部分
在过程的功能代码后,使用ENDP指令标记过程的结束。
3 ENDP指令用于标记过程的结束
它使编译器知道在哪里结束过程定义。
PROC伪指令详解
基本语法
PROC指令用于定义一个过程,其基本语法为:
局部符号
PROC指令内部定义的符号称为局部符号,它们只在该过程内部可见。
参数传递
PROC指令还可以用于定义带参数的过程,以便数据在过程中进行传递。
ENDP伪指令详解
微机原理第四章练习题及解答

微机原理第四章练习题及解一:单项选择题●汇编源程序文件的扩展名是( C )。
A:*.LST B:*.OBJ C:*.ASM D:*.EXE●源程序文件汇编后的目标文件的扩展名是( B )。
A:*.LST B:*.OBJ C:*.ASM D:*.EXE●目标文件连接后的可执行文件的扩展名是( D )。
A:*.LST B:*.OBJ C:*.ASM D:*.EXE●下列可作为标识符用的字符串是( C )。
A:MOV B:ZF C:FAH D:PTR●下列为寄存器名的字符串是( B )。
A:ZP B:BP C:AP D:CP●下列为状态标志的字符串是( A )。
A:ZP B:BF C:DF D:TF●下列为控标志的字符串是( D )。
A:ZP B:SF C:OF D:TF●下列为指令助记符的字符串是( C )。
A:ADCC B:AAAA C:SUB D:POOP●下列为运算符的字符串是( B )。
A:ADC B:PTR C:OAG D:LOOP●定义字类型的伪指令符是( B )。
A:DB B:DW C:DD D:DQ●说明字节类型的伪指令符是( C )。
A:WORD B:DWORD C:BYTE D:SHOR●返回变量段属性的伪指令符是( B )。
A:OFFSET B:SEG C:TYPE D:SIZE●定义过程结束的伪指令符是( C )。
A:END B:ENDS C:ENDP D:ENDM●下列为段定义的伪指令是( B )。
A:PROC B:SEGMENT C:ASSUME D:STRUC●下列为符号定义的伪指令是( B )。
A:ORG B:EQU C:STR D:RET二:填空题●将指令助记符翻译为指令机器码的过程称为(汇编)。
●汇编程序的功能是输入扩展名为ASM的(汇编源程序)文件,输出扩展名为OBJ的(目标代码)文件和扩展名为LST的(列表)文件。
●汇编源程序中的保留字类型有(寄存器名)、(标志名)、(指令助记符)、(伪指令符)和(运算符)。
指令系统中各种助记符的英文全名

我现将指令系统中各种助记符的英文全名写出来,各种助记符的记忆就会变得很简单o(∩_∩)o...在这之前,先说一下寄存器:数据寄存器分为:AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.BH&BL=BX(base):基址寄存器,常用于地址索引;CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.DH&DL=DX(data):数据寄存器,常用于数据传递。
他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。
这2组8位寄存器可以分别寻址,并单独使用。
另一组是指针寄存器和变址寄存器,包括:SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置;BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。
指令指针IP(Instruction Pointer)标志寄存器FR(Flag Register)OF(overflow flag)DF(direction flag)CF(carrier flag)PF(parity flag)AF(auxiliary flag)ZF(zero flag)SF(sign flag)IF(interrupt flag)TF(trap flag)段寄存器(Segment Register)为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。
伪指令

BUF3 DD‘HELLO’;超过2个字符的字符串只能用DB
BUF4 DB BLOCK;地址表达式只能用DW或DD定义
如将DB改为DW,则操作数项表示取BLOCK的偏移地
址;如将DB改为DD,则操作数项表示取BLOCK的偏移
地址和段地址,且第一个字为偏移地址,第二个字为段地址。
注意事项:段寄存器名必须是CS、DS、ES、SS中的
一个,而段名则必须是由SEGMENT定义的
段名,并且用SEGMENT定义了几个段,
ASSUME伪指令就需要指明几个段。
4.过程定义伪指令
过程定义伪指令用来定义一个子程序,子程序又称过程,在主程序中由CALL指令调用,调用结束将返回到主程序中CALL指令的下一条指令继续执行,而子程序中必须有一条返回指令RET。
STR2DB16 DUP(?)
CNTEQU $-STR1
MOVCX,CNT
3.操作数值不能超出相应数据类型限定的取值范围。
4.操作数项可以包括多个数据,它们之间用逗号隔开。操作数项可以是常数表达式、地址表达式(仅适用DW、DD)、字符串(超过2个字符仅用DB)、问号(只分配存储单元,而不赋值)、重复子句DUP。
下面是不正确的定义:
BUF1:DB 90H,80H;变量不能有冒号
5.模块定义伪指令
在汇编语言中每一个独立的源程序称为一个模块,在源程序的开始可以用NAME或TITLE伪指令为模块命名,而源程序结束使用END伪指令。
指令格式:NAME模块名
TITLE模块名
END[标号]
指令功能:
1. NAME伪指令可以缺省,如果缺省NAME指令,汇编程序
以TITLE指令中前6个字符作为模块名.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
;在代码段中进行显示输出 MOV AH,9 LEA DX,STR1 INT 21H
完整的程序: HELLO.ASM
17
附:BIOS功能调用
BIOS:基本输入输出系统,是固化在EPROM中的一组实 现基本输入输出功能的子程序。 BIOS调用通过多个软中断提供,调用方法为:
23
IF…THEN…ELSE结构
条件1
条件满足 ?
条件2
处理P1
标号1: 处理P2
标号2:
程序结构:
TEST/CMP指令 Jx 标号1
处理体P1
JMP 标号2 标号1:
处理体P2
标号2:其他指令 …
24
CASE结构
程序结构:
条件1成立 ?
Y
P1
标号1: N
条件2成立 ?
Y
P2
… 标号2: N
条件n成立 ?
Y
显示串长高位
警告: 太长
显示串长低位
结束
求串长
初始化指针/计数器
串长加1
Y 当前字符是‘$’? N
搜索CR字符 同时指针增量
N 找到?
Y
存串长
返回
32
程序如下:
DATA STRING LENGTH1 CR MESSAGE DATA
SEGMENT
DB ‘This is a string…’,0DH,’$’
3.源程序的基本结构:顺序、分支、循环、过程
19
如何绘制程序框图(流程图)?
(1)用方框表示工作框,框中用简明语言 标明要完成的功能
(2) 用菱形框表示判断框
?
框中标明比较、判断和条件
N
Y
20
(3)用
框表示调用子程序或过程。
框中标明子程序名字(入口参数等)
(4)各框之间用直线连起来表示程序走向。 流程图的例子FlowChart.doc
➢ 在DOS系统中,功能调用都是用软中断指令INT 21H来实现的。
9
INT 2lH功能大致可以分为四个方面: 设备管理、目录管理、文件管理和其它。 参见P411页附录C.3
D0S系统功能调用的使用方法如下: ① AH←功能号; ② 设置该功能所要求的其他入口参数; ③ 执行INT 21H指令; ④ 分析出口参数。
21
汇编语言上机过程
开始
输入(修改)源程序
汇编
Y
有错 ?
N
连接
Y
有错 ?
N
运行
有错 ?
N
Y 查错
用EDIT,NOTEPAD等任何文本 编辑器。源程序存为.ASM文件 用MASM宏汇编程序进行汇编。 汇编后生成.OBJ目标文件。 命令格式:MASM <源文件名.ASM>;
用LINK连接程序进行连接。 连接后生成.EXE可执行文件。 命令格式:LINK <目标文件名.OBJ>;
DW ?
;串长度存放在这里
DB 0DH
DB
’The string is too long!’,0DH,0AH,’$’
ENDS
CODE
MAIN BEGIN:
SEGMENT ASSUME CS:CODE,DS:DATA PROC FAR MOV AX,DATA MOV ES,AX MOV DS,AX
33
STR1 DB 10,?,10 DUP(?) 调用DOS功能的0AH号功能的程序段为:
LEA DX,STR1 MOV AH,0AH INT 21H 此程序段最多从键盘接收10个按键(包 括回车)。
14
2. DOS显示功能调用
(1) 在显示器上显示一个字符(功能号=2) MOV AH, 2 MOV DL, <要显示的字符> INT 21H
以下介绍INT 21H的几个最常用的功能。
10
关于数据输入和输出我们这里只讨 论键盘输入和显示输出,调用系统功能 需要提供入口参数及所调用的功能号, 调用结束返回结果。
1. DOS键盘功能调用
(1) 从键盘输入一个字符(功能号=1) MOV AH,1 INT 21H <AL中有键入的字符>
11
例:程序中有时需要用户对提示做出应答。
MOV AH,<功能号> <设置入口参数,一般将参数放在寄存器中> INT <中断类型>
BIOS中的几个主要中断类型如下: INT 10H——屏幕显示 INT 13H——磁盘操作 INT 14H——串行口操作 INT 16H——键盘操作 INT 17H——打印机操作
每类中断由包含许多子功能,调用时通过功能号指定。 BIOS功能调用说明见p416附录D。
5
宏展开:汇编程序会把宏调用按宏定义展开。
例如:宏定义为:
Display MACRO string LEA DX,string MOV AH,9
INT 21H
ENDM 程序中宏调用:
……
DISPLAY
ERROR_MESSAGE
DISPLAY
EXIT_MESSAGE
…… 汇编后的结果:(带有+号的指令为宏展开后的结果)
存入用户指定的缓冲区中。 MOV AH, 0AH LEA DX, <字符串缓冲区首地址> INT 21H
用户定义的输入字符串的缓冲区格式
N1
N2
(预留的N1个字节的存储单元)
N1: 缓冲区长度(最大键入字符数) N2: 实际键入的字符数(不包括回车符)
0DH
13
若用户键入的字符数(包括回车)≥定义的 N1,本功能调用将不再接收新的键入,且光 标不再向右移动。 例:设在数据段定义键盘缓冲区如下:
…… + LEA DX,ERROR_MESSAGE + MOV AH,9
+ INT 21H + LEA DX,EXIT_MESSAGE + MOV AH,9
+ INT 21H
……
6
4.2.6 汇编结束伪指令END
汇编语言源程序的最后,要加汇编结束 伪指令END,以使汇编程序结束汇编。 格式: END [表达式] END后跟的表达式通常就是程序第一条 指令的标号,指示程序的启动地址(要 执行的第一条指令的地址)。
结束
用TD、DEBUG等调试程序进行调试。 命令格式:TD <可执行文件名.EXE>
22
4.4.2 顺序程序(p175-176,自学) 4.4.3 分支程序
IF…THEN结构
条件满足
N
?
Y
处理
标号:
程序结构: … 测试/比较指令 (TEST/CMP) 条件转移指令 (Jx 标号)
处理体
标号: 其他指令 …
① 执行形式:宏命令伪指令由宏汇编程序在汇编过 理中进行处理,而CALL、RET则是由CPU执行的 指令。
② 汇编结果:宏命令伪指令汇编后被展开。
③ 执行速度:宏命令执行速度较快(因无调用转移)
④ 占用内存:宏指令简化了源程序,但不能简化目 标程序,并不节省内存单元。使用过程可以节省代 码占用的内存空间。
4.2.4 过程定义伪指令PROC、ENDP
过程就是子程序。一个过程可以被其它程序所调 用(用CALL指令),过程的最后一条指令一般是返回 指令(RET)。
过程定义伪指令的格式为
<过程名> PROC [类型]
… … RET
<过程名> ENDP
注意:PROC和ENDP必须成对出现。
1
过程的类型有两种: NEAR——(默认类型)表示段内调用 FAR——表示段间调用
30
例2. 字符串处理程序设计 此例取自p182[例4-17]。 对字符串进行操作时,往往需要确定它的长
度。通常字符串结束标志以CR或$作标志。所 以可以用扫描CR或$的方法计算出串长。
在计算串长时,应注意串长一般应小于255 个字节。
以下是流程图和源程序。
31
简化的流程图:
开始 求串长
串长<256? N
;要转换的数在AL的低四位 ;转换结果仍在AL中 CMP AL, 9 JA A2F ADD AL, 30H JMP DONE A2F: ADD AL, 37H DONE: RET BIN2ASC ENDP
调用方法:(在主程序中) … MOV AL, 0CH CALL BIN2ASC (AL中有0CH的ASCII码43H, ’C’)
处理体P3…
JMP 标号n+1
标号3:TEST/CMP指令(测试条件4)
…
…
标号n+1:(公共出口)
例:P178,[例4-14],统计成绩。流程图中虚线框内 25
4.4.4 循环程序
1.DO…UNTIL<条件> 结构 先执行,再判断条件。工作部分至少执行
一次。
初始化
循环体
循环控制
继续循环?
Y
N
26
✓子程序允许嵌套调用。 ✓进入子程序后首先要保护主程序的运行状态(标
志位)和使用的寄存器内容(称为保护现场),退 出子程序前要恢复现场。 ✓调用前要预先确定子程序中要使用哪些寄存器, 并定义入口参数和出口参数。参数传递可利用 寄存器、存储单元或堆栈(要用BP寻址)。
29
例1: 二进制数(0-F)转换成ASCII(‘0’-‘F’)的子程序。 BIN2ASC PROC
18
4.4 汇编语言程序设计基础
4.4.1 概述
1.程序质量(自学) 2.汇编语言程序设计的步骤:
1-根据实际问题抽象出数学模型,确定算法 2-画出程序框图(流程图) 3-分配内存工作单元和寄存器 4-根据框图编写源程序,存成.ASM文件 5-对源程序汇编,生成.OBJ目标文件 6-把.OBJ文件连接成.EXE执行文件 7-运行、调试