




已阅读5页,还剩59页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 汇编语言程序设计,4.1 概述/汇编语言的格式 4.2 语句行的构成 4.3 指示性语句 (伪操作) 4.4 指令语句 4.5 汇编语言程序设计及举例,2019/8/4,-2-,4.1 概述/汇编语言的格式,4.1.1 汇编语言程序的建立 1,用编辑程序(edit.exe,写字板,记事本等)建立汇编语言源程序*.asm 2,用汇编程序asm,masm,tasm把源文件转换成用二进制代码表示的目标文件 *.obj,若有错误则返回修改. 3,用连接程序LINK.exe把目标文件与库文件或其他目标文件连接在一起形成可执行文件 *.exe, 4,由DOS装入存储器,在机器上运行。或用DEBUG(turbo debugger)调试程序。,2019/8/4,-3-,4.1.2 汇编语言程序的一个例子,MY_DATA SEGMENT ; 定义数据段 SUM DB ? ; 为符号SUM保留一个字节 MY_DATA ENDS ; 定义数据段结束 MY_CODE SEGMENT ; 定义代码段 ASSUME CS:MY_CODE, DS:MY_DATA ;规定CS和DS的内容 PORT EQU 3 ; 端口的符号名 GO: MOV AX, MY_DATA ; DS初始化为MY_DATA MOV DS,AX MOV SUM, 0 ; 清SUM单元 CYCLE: CMP SUM,100 ;SUM单元与100相比较 JNA NOT_DONE ; 若未超过,转至NOT_DONE,2019/8/4,-4-,汇编语言程序的一个例子(续),MOV AL, SUM ; 若超过,把SUM单元的内容 OUT PORT_VAL, AL ; 通过AL输出 HLT ; 停机 NOT_DONE: IN AL, PORT_VAL ;若未超过,输入下一个字节 ADD SUM, AL ; 与以前的结果累加 JMP CYCLE ; 继续循环,转至CYCLE MY_CODE ENDS ; 代码段结束 END GO ; 整个程序结束,2019/8/4,-5-,源程序的格式,由此可见,汇编语言源程序分段,每一个段有一个名字,以符号SEGMENT作为段的开始,以语句ENDS结束,两者有相同的名字。 由若干段组成一个源程序,整个程序以语句END作为结束 每一个段又是若干个语句行组成,语句行是源程序的基础 汇编语言大小写不敏感,大小写均可,按习惯书写。 以 SUM单元与100相比较,2019/8/4,-6-,4.2 语句行的构成,语句行由标记及分隔符按照一定的规则组织起来的。标记是宏汇编源程序的有意义的最小单位。 4.2.1 标记 1. 宏汇编的字符集 字母/数字/特殊字符:可打印字符, 非打印字符:空格,制表符(tab),回车cr(0DH),换行LF (0AH) 2.界符(Delimiters) 界符是一些特殊字符,利用它们可以表明某个标记的结束,它们本身也有一定的意义,这一点与分隔符(空格)不同。如 ,:等 .有了界符就不用分隔符。 MOV AL,30H,2019/8/4,-7-,标记(续),3常量 可以是数字常量或字符常量。 4标识符(Identifiers) 标识符是由程序员(用户)自由建立起来的、有特定意义的字符序列。一个标识符是由最多为31个字母、数字及规定的特殊字符(? _ $)等组成的,且不能用数字打头(以免与十六进制数相混淆)。(与高级语言中变量的定义相似) 5保留字(Reserved words) 在语言中有特殊的定义,不能作为标识符使用。 如:MOV,SEGMENT,EQU,AL等,同C语言的if,for,while等,2019/8/4,-8-,6注释(Comment) 由分号;(英文非中文)引出,用来说明语句或程序的功能。 汇编程序对分号后的内容不做处理。 作用:注释程序,增强程序可读性。,2019/8/4,-9-,4.2.2 符号(Symbol),在汇编语言源程序中,为了使程序具有通用性和可读性,常用符号代替存储单元,符号是一种标识符,要符合标志符的组成规则。 在实际使用中的符号可以分成五类,即寄存器、变量、标号、数、其他符号等. 2.变量(variable) 存放在存储单元中的操作数,在程序中出现的是存储单元地址的符号,即变量名。(区别于高级语言,取地址 类型(type):字节(BYTE),字(WORD)和双字(double word) 变量用存储器初始化命令定义 VAR1 DB 01H,2019/8/4,-10-,符号(续),3.标号(label) 标号是某条指令所存放单元的符号地址,是转移或调用指令的目标操作数。 标号与变量都是存储单元的符号地址,标号对应存储单元存放的是指令,变量对应的存储单元存放的是数据。 标号的3种属性:段值(SEG),偏移量(offset)和类型(TYPE) 类型:NEAR 段内调用或返回 FAR 段间(段交叉)调用或返回,2019/8/4,-11-,4.2.3 表达式(Expressions),表达式是由操作数和运算符组合的序列。 1操作数(Operands) 操作数可以是寄存器名,或常量(数字常量或字符串常量),或存储器操作数。 (1)常量操作数,如 5,count (2)存储器操作数:标号,变量,2019/8/4,-12-,表达式(续),2运算符(Operators) 算术运算符(Arithmetic Operators); 逻辑运算符(Logical Operators); 关系运算符(Relational Operators); 分析运算符(Analytic Operators); 合成运算符(Synthetic Operators);,2019/8/4,-13-,1、算术运算符,(加)、(减)、*(乘)、/(除)、MOD(求余)。 注:当应用于存储器即地址操作数时其规则为:只有当结果有明确的,有意义的物理解释时,这些运算才是有效的. SUM与SUM+2,2019/8/4,-14-,2.逻辑运算符,AND、OR、XOR、NOT 注:(1) 存储器地址操作数不能进行逻辑运算. (2)AND,OR,XOR和NOT,也是8086指令的助记符.但是,作为宏汇编的运算符是在程序汇编时计算的;而作为指令的助记符,则是在程序执行时计算的. 例:AND DX,PORT_VAL AND 0FEH 在程序汇编时,计算PORT_VAL AND 0FEH,产生一个指令操作数的立即数,在指令执行时,这个立即数与寄存器DX的内容相与,结果送DX,2019/8/4,-15-,3、关系运算符,1) 相等equal (EQ) 2) 不等not equal (NE) 3) 小于less than (LT) 4) 大于greater than (GT) 5) 小于或等于Less than or equql (LE) 6) 大于或等于greater than or equql (GE) 注:关系运算的两个操作数,或者都是数字的,或者是同一个段的存储器地址.结果始终是一个数字值.若关系是假,则结果为0;若关系是真,则结果为0FFFFH/0FFH.(C语言规定) MOV BX PORT_VAL LT 5,2019/8/4,-16-,4.2.4 语句,源程序的语句可分为两类:指令语句和指示性语句。 指令语句,汇编程序将其翻译成机器码,运行时 由CPU执行操作。MOV AL,00H 指示性语句(伪指令),汇编时不生成机器码,它指示,引导汇编程序在汇编时作一些操作,如定义符号、分配存储单元、初始化存储器等。 var DB 01H,2019/8/4,-17-,语句(续),指令语句的格式 标号: 指令助记符 参数1,参数n ;注释 指示性语句的格式: 名字 命令(伪指令) 参数1,参数n ;注释,2019/8/4,-18-,4.3 指示性语句(directive statements),1. 符号定义语句(symbol definition) 2. 数据定义语句(data definition) 3. 段定义语句(segmentation ) 4. 过程定义语句(procedure ) 5. 结束语句(termination) 伪操作,伪指令(pseudo) 汇编语言程序的语句除指令外,还有伪操作和宏指令。伪操作不象机器指令在程序运行期间由计算机(CPU)来执行,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,它可以完成如数据定义,分配存储区,指示程序结束的功能。(不产生机器代码),2019/8/4,-19-,定义,汇编语言(assembly language) 用助记符(mnemonic)以及符号地址(symbol)、标号(label)等符号来书写程序,就称为汇编语言。 汇编语言源程序 用汇编语言,并按照各种规则书写的符号程序。,2019/8/4,-20-,4.3.1 符号定义语句,1.等值语句 EQU EQU语句给符号名定义一个值,或定义为别的符号名,甚至可定义为一条可执行指令等。 格式 name EQU expression C语言 #define PI 3.14159265358979 例:buffer_size EQU 32 ;数赋给符号名 DATA EQU HEIGHT+12 ;地址表达式赋给符号名(HEIGHT为地址) ALPHA EQU 7; 一组赋值伪操作把7-2=5赋给符号名beta BETA EQU ALPHA-2; COUNT EQU CX ; 定义寄存器CX的同义语 COUNT(慎用) CBD EQU AAD ; 定义一条可执行指令(慎用),2019/8/4,-21-,符号定义语句,2.等号(Equal sign)语句 = 与EQU语句类似,能对符号进行再定义 例:exp =5 exp =6; exp = exp+1; 3.解除语句 PURGE 用EQU定义过的符号可用PURGE解除语句解除并重新定义。格式:PURGE 符号1,符号2,符号n 例:PORT EQU 5 PURGE PORT PORT EQU 10,2019/8/4,-22-,4.3.2 数据定义语句,格式: variable mnemonic operand,operand ;comment 为一个数据项分配存储单元,用一个符号名与这个存储单元相联系,且为这个数据指定一个初始值。 其中:变量名指示内存操作数的地址(符号地址); 类型助记符指示内存操作数的类型(字节、字、双字等); 初始值指示内存操作数的内容. 常用的类型助记符有:DB,DW,DD,(DQ,DT),2019/8/4,-23-,数据定义语句(续),DB (define byte)伪操作用于定义字节,其后每个操作数占有一个字节 DW(define word)伪操作用于定义字,其后每个操作数占有两个字节 DD(define double word)伪操作用于定义双字,其后每个操作数占有2个字,4个字节 DQ伪操作用于定义4个字,其后每个操作数占有4个字,8个字节 DT 用来定义10个字节 这些伪操作可以把以后跟着的数据存入指定的存储单元,或者只是分配存储器空间而不存入确定的数据(用 ? 表示)。DW和DD伪操作可以存储偏移地址或完整的地址(段地址:偏移地址)。,2019/8/4,-24-,数据定义语句(续),操作数可以是常数,或者是表达式(根据该表达式求得一个常数) DATA_BYTE DB 10,10H DATA_WORD DW 100,-5 DATA_DW DD 3*20 汇编程序可以在汇编期间指定在存储器中存入数据。,2019/8/4,-25-,例,DATA_BYTE DB 10,10H DATA_WORD DW 100,-5 DATA_DW DD 3*20,2019/8/4,-26-,例: 操作数可以是字符串,MESSAGE DB HELLO/ H,E DB AB DW AB,MESSAGE,48 45 4C 4C 4F,41(A) 42(B),42(B) 41(A),2019/8/4,-27-,例: 操作数?可以保留存储空间,但不存入数据,ABC DB 0,?,?,0 DEF DW ?,52,?,ABC,DEF,00 - - 00 - - 34H 00 - -,2019/8/4,-28-,复制操作符 dup,操作数字段还可以使用复制操作符(duplication operator)来复制某个(或某些)操作数,其格式为 Repeat_count DUP (operand,operand) 其中repeat_count可以是一个表达式,其值为一个正整数,用来指定括号中的操作数的重复次数。 例 ARRAY1 DB 2 DUP (0,1,2,?) ARRY2 DB 100 DUP (?) ; 定义100个byte存储单元,2019/8/4,-29-,DUP操作可以嵌套 例 ARRAY3 DB 100 DUP (0,2 DUP (1,2),0,3) ARRAY3 DB 100 DUP (0,1,2,1,2,0,3) 可以用DW或DD伪操作把变量或标号的偏移地址(DW)或整个地址(DD)存入存储器,用DD伪操作存入地址时,第一个字为偏移地址,第二个字为段地址。 例:PARAMETER_TAB DW PAR1 DW PAR2 INTERSEG_DATA DD DATA1 DD DATA2,2019/8/4,-30-,$ 的使用,若操作数中使用$,则表示的是地址计数器的当前值。 例:TABLE DB ? BUFFER DW $+3 设TABLE的偏移地址为0080H,则汇编后相当于 BUFFER DW 0084H 一个存储器操作数加或者减一个数字值而形成的新的存储器操作数与初始操作数有着相同的类型。 如 SUM DB 4 DUP(?)则 SUM+2也是字节类型,指向SUM之后的第2个存储单元,2019/8/4,-31-,分析操作符,把存储器地址操作数分解为各个部分,包括: 1, SEG ;返回存储单元的段地址 2, OFFSET ;返回存储单元的偏移地址 3, TYPE ;返回一个数字值,表示存储器操作数的类型部分 4, LENGTH ;返回一个与存储器地址操作数相联系的单元数 5, SIZE ;返回一个为存储器地址操作数所分配的字节数,2019/8/4,-32-,TYPE 操作符,注:字节,字和双字的类型,分别是它们所占有的字节数;而指令单元的类型的值,没有实际的物理意义.,2019/8/4,-33-,LENGTH操作符与SIZE操作符,LENGTH操作符返回一个与存储器地址操作数相联系的单元数(所定义的基本单元数).注意:用LENGTH返回的存储区必须用DUP( )来定义,否则返回1。 BUFFER DW 100 DUP (00H) LENGTH BUFFER =100 用法:MOV CX, LENGTH BUFFER SIZE操作符返回一个为存储器地址操作数所分配的字节数。 SIZE BUFFER = 100*2=200 用法: MOV CX, SIZE BUFFER 一般来说,若一个存储单元操作数为X,则 SIZE X = (LENGTH X) * (TYPE X),2019/8/4,-34-,合成运算符TYPE,THIS (类似C语言中联合的概念),建立一些新的存储器地址操作数。 PTR操作符产生一个新的存储器地址操作数.新的操作数的段地址和段内偏移量与PTR运算符右边的操作数的对应分量相同,而类型由PTR的左边的操作数指定. PTR操作数并不分配存储器,它可以给已分配的存储器一个另外的定义. 例: TWO_BYTE DW ? 将第一个字节定义为: one_byte EQU BYTE PTR TWO_BYTE 将第二个字节定义为: other_byte EQU BYTE PTR TWO_BYTE+1 (教材P105错),2019/8/4,-35-,PTR操作符,用PTR属性操作符,指定操作数的类型属性,优先于隐含的类型属性(强制类型转换)。 格式:type PTR varibale+/-constant expression 其中类型type可以是BYTE,WORD,DWORD(双字),NEAR,FAR近/远指针;这样变量的类型就可以重新指定了。,2019/8/4,-36-,PTR(续),汇编程序可以用隐含的类型属性来确定某些变量是字指令还字节指令。 例: oper1 DB ?,? oper2 DW ?,? MOV oper1,0 ;字节指令 MOV oper2,0 ;字指令,2019/8/4,-37-,PTR(续),例:错误的操作 oper1 DB 1,2 oper2 DW 1234H,5678H MOV AX, oper1+1 ;字字节 MOV AL, oper2 ;字节字 ;/操作数的类型不匹配 汇编程序在汇编这一段程序时,能发现上面两条MOV指令的两个操作数的类型属性是不相同的,因此汇编程序将指示出错。,2019/8/4,-38-,PTR(续),oper1 DB 1,2 oper2 DW 1234H,5678H MOV AX,WORD PTR oper1+1 (AX)=3402H MOV AL,BYTE PTR oper2+1 (AL) = 12H,2019/8/4,-39-,THIS 运算符,建立一个新的存储器地址操作数,并且不分配存储器.用运算符THIS建立起来的新的存储器地址操作数的类型在THIS中指定,而它的段地址和偏移量就是汇编时的当前值. 例:Word_buf EQU THIS WORD Byte_buf DB 100 DUP(00H) Word_buf 的类型是字(在THIS中指定),而它的段地址和段内偏移值即为下面的byte_buf的相应值(即在汇编时遇到THIS操作符时的段地址和偏移量的当前值) THIS操作符建立NEAR/FAR指令单元 Lab1 EQU this FAR cmp sum,100 Jmp lab1,2019/8/4,-40-,4.3.3 段定义语句,8086按段来组织和利用存储器。 段定义操作指令 SEGMENT,ENDS,ASSUME和ORG 汇编程序必须知道程序的段结构,并知道在各种指令执行时将访问哪一个段(由段寄存器的指向),这个信息由ASSUME语句提供。 例子:如何使用SEGMENT,ENDS和ASSUME命令,以定义代码段、堆栈段、数据段和附加段,2019/8/4,-41-,段定义语句(续),my_data segment ;定义数据段 X DB ? Y DW ? Z DD ? my_data ends my_extra segment ;定义附加段 alpha DB ? beta DW ? gamma DD ? my_extra ends my_stack segment stack stack ;定义堆栈段 DW 100 DUP(?) TOP EQU THIS WORD my_stack ends,2019/8/4,-42-,段定义语句(续),my_code segment assume CS:my_code, DS:my_data assume ES:my_extra, SS:my_stack START: MOV AX,seg X; / MOV AX, my_data mov DS, AX mov AX, seg alpha / mov AX, my_extra mov ES, AX mov AX, my_stack mov SS,AX mov SP, offset TOP my_code ends end START,2019/8/4,-43-,段定义SEGMENT,ENDS,格式 段名 SEGMENT . 段名 ENDS 段定义由伪操作SEGMENT开始、ENDS结束。 程序经汇编、连接及装入内存后,段名为一具体的段值,2019/8/4,-44-,ASSUME伪操作,格式: ASSUME 段寄存器:段名,段寄存器:段名, ASSUME语句,只是使汇编程序知道在程序执行时各个段寄存器的值,而这些段寄存器的实际值(除了代码段寄存器CS外),必须在程序执行时,用MOV指令来赋给。 当把可执行的目标程序(.EXE文件)装入内存时,操作系统会自动把代码段的段码赋给CS,因此,不必在程序中用MOV指令对CS赋值.,2019/8/4,-45-,ORG(origin)伪操作,规定段内的起始地址,格式 ORG 指定了段内在它以后的程序或数据块存放的起始地址 MY_SEG SEGMENT AT 1A2BH ;指定段地址为1A2BH OR 0003H;段内偏移是量0003H MY_SEG ends P110 书上的内存模型不要求,2019/8/4,-46-,4.3.4 过程定义语句,格式 proc_name PROC NEAR/FAR RET proc_name ENDP 过程的调用 CALL,2019/8/4,-47-,4.3.5 结束语句,结束语句与开始语句成对使用 SEGMENT/ends PROC/endp END语句,标志整个源程序的结束,通知汇编程序结束。 格式: END 第一条可执行指令,2019/8/4,-48-,4.4 指令语句,一条8086指令是由一个操作码字段和一些由操作数寻址方式所指定的字段组成的. 4.4.1 补充两条指令 1,NOP (no operation)空或无操作 该指令不执行任何操作。其机器码占有一个字节,执行需3个时钟周期,常用于调整延时。在调试程序中,用这条指令占有一定的存储单元,以便在调试时用其他指令取代(相当于空行的作用)。 (教材P114 NOP不浪费时间是不对的。),2019/8/4,-49-,2,NIL空指令(TASM.exe程序不支持)不要求,保留空格,不产生任何指令,在汇编语言程序中是为标号保留空格的. 如:CYCLE: NIL INC AX 为修改程序方便,若以后需要的话,便于在INC指令前插入其他的指令。(意义不大),2019/8/4,-50-,4.4.2 指令前缀,8086指令允许指令用一个或多个指令前缀(prefix) (1)段超越 (Segment override) MOV BX,ES:sum (2)重复(REP,REPZ/REPE,REPNZ/REPNE)(串处理指令) (3)锁定(Lock),2019/8/4,-51-,4.4.3 操作数的寻址方式,1,立即寻址 2,寄存器寻址 3,直接寻址 4,通过基址寄存器(BX,BP)间接寻址 5,通过变址寄存器(SI,DI)间接寻址 6,通过基址寄存器+变址寄存器间接寻址 7,通过基址/或变址寄存器+位移量间接寻址 8,通过基址+变址寄存器+位移量间接寻址,2019/8/4,-52-,4.4.4 串操作指令,指示性语句帮助汇编程序确定操作数的类型 例: alpha DB ?,?,? beta DB ?,?,? mov si, offset alpha mov di, offset beta cld movs beta,alpha ;/ movsb 字节操作,2019/8/4,-53-,例:把两个未组合的BCD码相加掌握程序的结构,NAME ADD_TWO_BCD ;NAME也是一个伪操作 ;- data segment str1 DB 1752 ;or db 1,7,5,2 str2 DB 3814 count EQU $-str2 ;namely count EQU 4 data ends ;- mstack segment para stack stack stapn DB 100 dup (?) top EQU LENGTH STAPN mstack ends,2019/8/4,-54-,code segment assume cs:code, ss:mstack, ds:data, es:data START PROC FAR ; / dos调用的一个远过程 push DS ; 程序结束,返回DOS mov ax,0 ; xor ax,ax push ax GO: mov ax, data ; mov ax, seg str1 mov ds, ax mov es, ax mov ax, mstack mov ss, ax mov ax, top mov sp, ax ; 给DS,ES,SS,SP赋值,2019/8/4,-55-,clc ; CF=0 cld ; DF =0 mov si, offset str1 mov di, offset str2 mov cx, count CYCLE: LODS str1 ;lodsb adc al, di ; 考虑进位,带进位的加 aaa STOS str2 ;stosb loop CYCLE ret START endp code ends end START ;第一条可执行指令(由过程名指向),2019/8/4,-56-,程序说明,程序结束返回DOS的另一方法(常用) mov ax, 4c00H ; /或 mov al, 4ch int 21h ; 中断调用 堆栈段的定义 mstack segment para stack stack stapn DB 100 dup (?) top EQU LENGTH STAPN mstack ends 其中PARA(graph)word,page等表示此段开始于16byte的边界(可不加),stack表示一个堆栈段,并给了个名字stack,在此段中用DB伪指令为堆栈段保留了100byte的空间(根据实际需要来设置),2019/8/4,-57-,在代码段中定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年统计学专业期末考试题库:统计调查误差控制与数据清洗策略试题
- 一建《机电工程管理与实务》2025年考试案例分析题库:案例分析策略与实战演练试题
- 2025年职业指导师专业能力测试卷:案例分析及解决方案设计题库
- 2025年大数据分析师职业技能测试卷:大数据在智能语音识别与智能环保中的应用试题
- 2025年房地产估价师考试房地产估价师考试案例分析试题
- 2025年交通安全及管制专用设备项目申请报告
- 假期旅游证明及请假记录表(7篇)
- 以春苗为话题作文:绿绿的春苗9篇
- 2025年电子商务师(初级)职业技能鉴定试卷:电子商务数据分析应用试题
- 商业贸易展览参展协议条款
- 2024年6月新疆高中学业水平考试历史试卷真题(含答案详解)
- (2025.06.12)领导干部任前应知应会党内法规和法律知识考试题库(2025年度)
- 2025年高考北京卷化学高考真题+答案(参考版)
- 2025至2030中国汽车滤清器行业市场发展分析及商业模式与投融资报告
- 医用光学技术和仪器使用
- 仗鼓舞比赛活动方案
- 南昌职业大学《影视配音创作》2023-2024学年第二学期期末试卷
- 2024年湖南融通资源循环产业有限公司技能岗位招聘真题
- 销售转正笔试题目及答案
- 树木砍伐合同简单协议书
- 2025年安徽省农业职业技能大赛(水生物病害防治员)备赛试题库(含答案)
评论
0/150
提交评论