chap04_汇编语言程序设计

上传人:xia****ai 文档编号:243139527 上传时间:2024-09-16 格式:PPT 页数:98 大小:306KB
返回 下载 相关 举报
chap04_汇编语言程序设计_第1页
第1页 / 共98页
chap04_汇编语言程序设计_第2页
第2页 / 共98页
chap04_汇编语言程序设计_第3页
第3页 / 共98页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,*,*,-,*,-,第4章 汇编语言程序设计,4.1,概述/汇编语言的格式,4.2 语句行的构成,4.3,指示性语句 (,伪操作),4.4,指令语句,4.5 汇编语言程序设计,及,举例,4.1 概述/汇编语言的格式,4.1.1 汇编语言程序的建立,1,用编辑程序(,edit.exe,写字板,记事本等,)建立汇编语言源程序*.,asm,2,用汇编程序,asm,masm,tasm,把源文件转换成用二进制代码表示的目标文件 *.,obj,,若有错误则返回修改.,3,用连接程序,LINK.exe,把目标文件与库文件或其他目标文件连接在一起形成可执行文件 *.,exe,4,由,DOS,装入存储器,在机器上运行。或用,DEBUG(turbo debugger),调试程序。,2024/9/16,2,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,2024/9/16,3,汇编语言程序的一个例子(续),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 ;,整个程序结束,2024/9/16,4,源程序的格式,由此可见,汇编语言源程序分段,每一个段有一个名字,以符号,SEGMENT,作为段的开始,以语句,ENDS,结束,两者有相同的名字。,由若干段组成一个源程序,整个程序以语句,END,作为结束,每一个段又是若干个语句行组成,语句行是源程序的基础,汇编语言大小写不敏感,大小写均可,按习惯书写。,以&作为续行标志,一个语句行由4部分组成,标号: 操作符 操作数 ;注释,CYCLE: CMP SUM,100 ; SUM,单元与100相比较,2024/9/16,5,4.2 语句行的构成,语句行由标记及分隔符按照一定的规则组织起来的。标记是宏汇编源程序的有意义的最小单位。,4.2.1 标记,1. 宏汇编的字符集,字母/数字/特殊字符:可打印字符,,非打印字符:空格,制表符(,tab),,回车,cr(0DH),,换行,LF (0AH),2.,界符(,Delimiters),界符是一些特殊字符,利用它们可以表明某个标记的结束,它们本身也有一定的意义,这一点与分隔符(空格)不同。如 ,:等 .有了界符就不用分隔符。,MOV AL,30H,2024/9/16,6,标记(续),3常量,可以是数字常量或字符常量。,4标识符(,Identifiers),标识符是由程序员(,用户,)自由建立起来的、有特定意义的字符序列。一个标识符是由最多为31个字母、数字及规定的特殊字符(,? _ $),等组成的,且不能用数字打头(以免与十六进制数相混淆)。(与高级语言中变量的定义相似),5保留字(,Reserved words),在语言中有特殊的定义,不能作为标识符使用。,如:,MOV,SEGMENT,EQU,AL,等,同,C,语言的,if,for,while,等,2024/9/16,7,6注释(,Comment),由分号;,(英文非中文),引出,用来说明语句或程序的功能。,汇编程序对分号后的内容不做处理。,作用:注释程序,,增强程序可读性。,2024/9/16,8,4.2.2 符号(,Symbol),在汇编语言源程序中,为了使程序具有,通用,性和可读性,常用符号代替存储单元,符号是一种标识符,要符合标志符的组成规则。,在实际使用中的符号可以分成五类,即寄存器、变量、标号、数、其他符号等.,2.变量(,variable),存放在存储单元中的操作数,在程序中出现的是存储单元地址的符号,即变量名。(,区别于高级语言,取地址 &,i,),变量的3种属性:段值(,segment);,偏移量(,offset);,类型(,type):,字节(,BYTE),字(,WORD),和双字(,double word),变量用存储器初始化命令定义,VAR1 DB 01H,2024/9/16,9,符号(续),3.标号(,label),标号是某条指令所存放单元的符号地址,是转移或调用指令的目标操作数。,标号与变量都是存储单元的符号地址,标号对应存储单元存放的是指令,变量对应的存储单元存放的是数据。,标号的3种属性:段值(,SEG),,偏移量(,offset),和类型(,TYPE),类型:,NEAR,段内调用或返回,FAR,段间(段交叉)调用或返回,2024/9/16,10,4.2.3 表达式(,Expressions),表达式是由操作数和运算符组合的序列。,1操作数(,Operands),操作数可以是寄存器名,或常量(数字常量或字符串常量),或存储器操作数。,(1)常量操作数,如 5,,count,(2),存储器操作数:标号,变量,2024/9/16,11,表达式(续),2运算符(,Operators),算术运算符(,Arithmetic Operators);,逻辑运算符(,Logical Operators);,关系运算符(,Relational Operators);,分析运算符(,Analytic Operators);,合成运算符(,Synthetic Operators);,2024/9/16,12,1、算术运算符,(加)、(减)、*(乘)、/(除)、,MOD(,求余)。,注:当应用于存储器即地址操作数时其规则为:只有当结果有明确的,有意义的物理解释时,这些运算才是有效的.,SUM,与,SUM+2,2024/9/16,13,2.逻辑运算符,AND、OR、XOR、NOT,注:(1) 存储器地址操作数不能进行逻辑运算.,(2),AND,OR,XOR,和,NOT,也是8086指令的助记符.但是,作为,宏汇编的运算符是在程序汇编时计算的;,而,作为指令的助记符,则是在程序执行时计算的,.,例:,AND DX,PORT_VAL AND 0FEH,在程序汇编时,计算,PORT_VAL AND 0FEH,产生一个指令操作数的立即数,在指令执行时,这个立即数与寄存器,DX,的内容相与,结果送,DX,2024/9/16,14,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;若关系是真,则结果为0,FFFFH/0FFH.(C,语言规定,),MOV BX PORT_VAL LT 5,2024/9/16,15,4.2.4 语句,源程序的语句可分为两类:指令语句和指示性语句。,指令语句,汇编程序将其翻译成机器码,,运行时 由,CPU,执行操作。,MOV AL,00H,指示性语句(伪指令),汇编时不生成机器码,它指示,引导汇编程序在汇编时作一些操作,如定义符号、分配存储单元、初始化存储器等。,var DB 01H,2024/9/16,16,语句(续),指令语句的格式,标号:,指令助记符 参数1,参数,n ;,注释,指示性语句的格式:,名字 命令(伪指令) 参数1,参数,n ;,注释,2024/9/16,17,4.3 指示性语句(,directive statements),1. 符号定义语句(,symbol definition),2. 数据定义语句(,data definition),3. 段定义语句(,segmentation ),4. 过程定义语句(,procedure ),5. 结束语句(,termination),伪操作,伪指令(,pseudo),汇编语言程序的语句除指令外,还有,伪操作和宏指令,。伪操作不象机器指令在程序运行期间由计算机(,CPU),来执行,它是,在汇编程序对源程序汇编期间由汇编程序处理的操作,,它可以完成如数据定义,分配存储区,指示程序结束的功能。(不产生机器代码),2024/9/16,18,定义,汇编语言(,assembly language),用助记符(,mnemonic),以及符号地址(,symbol)、,标号(,label),等符号来书写程序,就称为汇编语言。,汇编语言源程序,用汇编语言,并按照各种规则书写的符号程序。,2024/9/16,19,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 ;,定义一条可执行指令(慎用),2024/9/16,20,符号定义语句,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,2024/9/16,21,4.3.2 数据定义语句,格式:,variable,mnemonic,operand,operand ;comment,为一个数据项分配存储单元,用一个符号名与这个存储单元相联系,且为这个数据指定一个初始值。,其中:变量名,指示内存操作数的,地址,(,符号地址);,类型助记符指示内存操作数的类型(字节、字、双字等);,初始值指示内存操作数的内容.,常用的类型助记符有:,DB,DW,DD,(DQ,DT),2024/9/16,22,数据定义语句(续),DB (define byte),伪操作用于定义字节,其后每个操作数占有一个字节,DW(define word),伪操作用于定义字,其后每个操作数占有两个字节,DD(define double word),伪操作用于定义双字,其后每个操作数占有2个字,4个字节,DQ,伪操作用于定义4,个,字,其后每个操作数占有4个字,8个字节,DT,用来定义10个字节,这些伪操作可以把以后跟着的数据存入指定的存储单元,或者,只是分配存储器空间而不存入确定的数据(用 ? 表示),。,DW,和,DD,伪操作可以存储偏移地址或完整的地址(段地址:偏移地址)。,2024/9/16,23,数据定义语句(续),操作数可以是常数,或者是表达式(根据该表达式求得一个常数),DATA_BYTE DB 10,10H,DATA_WORD DW 100,-5,DATA_DW DD 3*20,汇编程序可以在汇编期间指定在存储器中存入数据。,2024/9/16,24,例,DATA_BYTE DB 10,10H,DATA_WORD DW 100,-5,DATA_DW DD 3*20,DATA_BYTE,DATA_WORD,DATA_DW,10,d,10H,100d,-5,60,0,A,10,64,00,FB,FF,3C,00,00,00,2024/9/16,25,例: 操作数可以是字符串,MESSAGE DB HELLO/ H,E,DB AB,DW AB,MESSAGE,48,45,4C,4C,4F,41(,A),42(B),42(,B),41(A),2024/9/16,26,例: 操作数?可以保留存储空间,但不存入数据,ABC DB 0,?,?,0,DEF DW ?,52,?,ABC,DEF,0,0,-,-,00,-,-,34H,00,-,-,2024/9/16,27,复制操作符,dup,操作数字段还可以使用复制操作符(,duplication operator),来复制某个(或某些)操作数,其格式为,Repeat_count DUP (operand,operand),其中,repeat_count,可以是一个表达式,其值为一个正整数,用来指定括号中的操作数的重复次数。,例,ARRAY1 DB 2 DUP (0,1,2,?),ARRY2 DB 100 DUP (?),;,定义100个,byte,存储单元,2024/9/16,28,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,2024/9/16,29,$ 的使用,若操作数中使用$,则表示的是,地址计数器,的当前值。,例:,TABLE DB ?,BUFFER DW $+3,设,TABLE,的偏移地址为0080,H,则汇编后相当于,BUFFER DW 0084H,一个存储器操作数加或者减一个数字值而形成的新的存储器操作数与初始操作数有着相同的类型。,如,SUM DB 4 DUP(?),则,SUM+2,也是字节类型,指向,SUM,之后的第2个存储单元,2024/9/16,30,分析操作符,把存储器地址操作数分解为各个部分,包括:,1,SEG ;,返回存储单元的段地址,2, OFFSET ;,返回存储单元的偏移地址,3, TYPE ;,返回一个数字值,表示存储器操作数的类型部分,4, LENGTH ;,返回一个与存储器地址操作数相联系的单元数,5, SIZE ;,返回一个为存储器地址操作数所分配的字节数,2024/9/16,31,TYPE,操作符,注:字节,字和双字的类型,分别是它们所占有的字节数;而指令单元的类型的值,没有实际的物理意义.,存储器操作数,TYPE,值,数据字节(,DB,定义),1,数据字(,DW,定义),2,数据双字(,DD,定义),4,NEAR,指令单元,-1,FAR,指令单元,-2,2024/9/16,32,LENGTH,操作符与,SIZE,操作符,/2008,10,7,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),2024/9/16,33,合成运算符,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,错),2024/9/16,34,PTR,操作符,用,PTR,属性操作符,指定操作数的类型属性,优先于隐含的类型属性(强制类型转换)。,格式,:,type,PTR,varibale+/-constant expression,其中类型,type,可以是,BYTE,WORD,DWORD,(,双字),,NEAR,FAR,近/远指针;这样变量的类型就可以重新指定了。,2024/9/16,35,PTR(,续),汇编程序可以用隐含的类型属性来确定某些变量是字指令还字节指令。,例:,oper1 DB ?,?,oper2 DW ?,?,MOV oper1,0 ;,字节指令,MOV oper2,0 ;,字指令,2024/9/16,36,PTR(,续),例:,错误的操作,oper1 DB 1,2,oper2 DW 1234H,5678H,MOV AX, oper1+1 ;,字,字,节,MOV AL, oper2 ;,字节,字,;/操作数的类型不匹配,汇编程序在汇编这一段程序时,能发现上面两条,MOV,指令的两个操作数的类型属性是不相同的,因此汇编程序将指示出错。,2024/9/16,37,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,01,02,34,12,78,56,oper1,oper2,2024/9/16,38,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,2024/9/16,39,4.3.3 段定义语句,8086按段来组织和利用存储器。,段定义操作指令,SEGMENT,ENDS,ASSUME,和,ORG,汇编程序必须知道程序的段结构,并知道在各种指令执行时将访问哪一个段(由段寄存器的指向),,这个信息由,ASSUME,语句提供。,例子:如何使用,SEGMENT,ENDS,和,ASSUME,命令,以定义代码段、堆栈段、数据段和附加段,2024/9/16,40,段定义语句(续),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,2024/9/16,41,段定义语句(续),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,2024/9/16,42,段定义,SEGMENT,ENDS,格式 段名,SEGMENT,.,段名,ENDS,段定义由伪操作,SEGMENT,开始、,ENDS,结束。,程序经汇编、连接及装入内存后,段名为一具体的段值,2024/9/16,43,ASSUME,伪操作,格式:,ASSUME,段寄存器:段名,段寄存器:段名, ,ASSUME,语句,只是使汇编程序知道在程序执行时各个段寄存器的值,而这些段寄存器的实际值(除了代码段寄存器,CS,外),必须在程序执行时,用,MOV,指令来赋给。,当把可执行的目标程序(.,EXE,文件)装入内存时,操作系统会自动把代码段的段码赋给,CS,因此,不必在程序中用,MOV,指令对,CS,赋值.,2024/9/16,44,ORG(origin),伪操作,规定段内的起始地址,格式,ORG ,指定了段内在它以后的程序或数据块存放的起始地址,MY_SEG SEGMENT,AT 1A2BH,;,指定段地址为1,A2BH,OR, 0003,H;,段内偏移是量0003,H,MY_SEG ends,P110,书上的内存模型不要求,2024/9/16,45,4.3.4 过程定义语句,格式,proc_name PROC NEAR/FAR,RET,proc_name ENDP,过程的调用,CALL,2024/9/16,46,4.3.5 结束语句,结束语句与开始语句成对使用,SEGMENT/ends; PROC/endp,END,语句,标志整个源程序的结束,通知汇编程序结束。,格式:,END,第一条可执行指令,2024/9/16,47,4.4 指令语句,一条8086指令是由一个操作码字段和一些由操作数寻址方式所指定的字段组成的.,4.4.1,补充两条指令,1,NOP (no operation),空或无操作,该指令不执行任何操作。其机器码占有一个字节,执行需3个时钟周期,,常用于调整延时,。在调试程序中,用这条指令占有一定的存储单元,以便在调试时用其他指令取代(相当于空行的作用)。,(,教材,P114 NOP,不浪费时间是不对的。,),2024/9/16,48,2,,NIL,空指令(,TASM.exe,程序不支持),不要求,保留空格,不产生任何指令,在汇编语言程序中是为标号保留空格的.,如:,CYCLE: NIL,INC AX,为修改程序方便,若以后需要的话,便于在,INC,指令前插入其他的指令。(意义不大),2024/9/16,49,4.4.2 指令前缀,8086指令允许指令用一个或多个指令前缀(,prefix),(1),段超越 (,Segment override) MOV BX,ES:SI,(2),重复(,REP,REPZ/REPE,REPNZ/REPNE)(,串处理指令),(3),锁定(,Lock),2024/9/16,50,4.4.3 操作数的寻址方式,1,立即寻址,2,寄存器寻址,3,直接寻址,4,通过基址寄存器(,BX,BP),间接寻址,5,通过变址寄存器(,SI,DI),间接寻址,6,通过基址寄存器+变址寄存器间接寻址,7,通过基址/或变址寄存器+位移量间接寻址,8,通过基址+变址寄存器+位移量间接寻址,2024/9/16,51,4.4.4 串操作指令,指示性语句帮助汇编程序确定操作数的类型,例:,alpha DB ?,?,?,beta DB ?,?,?,mov si, offset alpha,mov di, offset beta,cld,movs beta,alpha ;/,movsb,字节操作,2024/9/16,52,例:把两个未组合的,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,程序,Exp117.asm,2024/9/16,53,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,赋值,2024/9/16,54,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 ;,未组合的,BCD,调整指令,STOS str2 ;,stosb,loop CYCLE,ret,START endp,code ends,end START ;,第一条可执行指令(由过程名指向),2024/9/16,55,程序说明,程序结束返回,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,等表示此段开始于16,byte,的边界(可不加),,stack,表示一个堆栈段,并给了个名字,stack,在此段中用,DB,伪指令为堆栈段保留了100,byte,的空间(根据实际需要来设置),2024/9/16,56,在代码段中定义了一个过程,START PROC FAR,START ENDP,为了在程序执行完后,能把控制权返回,DOS,而设置的,在这个过程的前3条指令,push ds/ mov ax,0/push ax,是在过程一开始在堆栈中推入一个段地址(,DS),和一个,IP,指针值(0000,H),为过程的最后一个指令,RET,提供了转移地址。,源程序经汇编,目标程序,再经连接程序进行连接和定位,连接程序为每一个任务程序建立了一个256,bytes,程序段前缀,在此前缀开始安排了一条结束程序运行返回,DOS,,给,DS,赋的值就是程序段前缀的段地址,上面的3条指令使用户程序结束后,控制返回,DOS,2024/9/16,57,返回,DOS,的简单方法,(推荐采用!),code segment,assume cs:code, ss:mstack, ds:data, es:data,GO: mov ax, data ; mov ax, seg str1,mov ax, 4c00H ; mov al, 4ch,int 21h ; /,通过中断调用返回,DOS,2024/9/16,58,补充 汇编语言的上机过程,1,用编辑程序(,edit.exe,写字板,记事本等,)建立汇编语言源程序*.,asm,2,用汇编程序,tasm,把源文件转换成用二进制代码表示的目标文件 *.,obj,,若有错误则返回修改.,3,用连接程序,LINK.exe,把目标文件与库文件或其他目标文件连接在一起形成可执行文件 *.,exe,4,由,DOS,装入存储器,在机器上运行。或用,DEBUG(turbo debugger),调试程序。,2024/9/16,59,实验集成环境:,DOS,下运行,tddebug.,键盘操作,ALT+E,C,R,Q,2024/9/16,60,4.5 汇编语言程序设计及举例,一、建立一个汇编语言程序的步骤,1,,根据实际问题建立数学模型,2,确定合理的算法和数据结构,3,画出程序框图,自顶向下,逐步求精,4,编写程序,分配工作单元和寄存器,5,上机调试程序,进行测试,2024/9/16,61,流程图,在编制复杂的程序时,应先绘制程序流程图,流程图是程序的逻辑结构、计算方案和执行过程的形象描述。,流程图中常用的符号:,1,矩形框:表示一般处理功能,2,菱形框: 表示判断框,框内标明比较判断的条件,有一个入口和几个出口,3,椭圆框:表示流程的开始,结束或暂停,4,程序中调用的子程序或过程用,5,连接点,它是两处程序的连接符号,6,带箭头的直线,表示流程的方向。,2024/9/16,62,流程图(续),有了框图,分配工作寄存器和内存工作单元,用汇编程序进行编码。,程序设计是一个实践性很强的工作,只有扎实地掌握基础知识,不断练习,积累经验,多看,参考考,程序,才能不断提高编程水平。,判断程序的质量主要有两个标准:程序的执行时间,程序所占的存储单元(简称为时空指标)。现在主要强调合理的数据结构,计算方法,清晰的程序结构。,2024/9/16,63,4.5.2 顺序程序,程序有顺序、循环、分支和子程序四种结构形式。顺序程序按顺序逐条执行,结构简单。以下说明循环与分支、子程序程序结构。,教材,P120,例 4-1两个32无符号乘法程序,(不要求),AB*CD=(A*216+B) * (C*216+D),=,B*D,+,A*D*216,+,B*C*216,+,A*C*216*216,7 8,* 5 6,4 8,4 2 0,4 0 0,3 5 0 0,4 3 6 8,2024/9/16,64,4.5.2 分支程序,相当于高级语言中的,if-else-(then),和,switch,case,语句。,通常根据某些运算结果来判断和选择程序的不同走向形成分支。因此在形成分支时,一般要有,测试,(测试标志寄存器的标志位,判断某些条件是否成立);,转向,(根据判断结果,决定程序走向,由转移指令完成);,标号,(给分支程序转向的第一个语句赋予一个标号,作为此分支的标志)三个部分,例:符号函数的程序实现,Y=f(x)= 1,if x0,0,if x=0,-1,if x0 -plus,mov bx, -1 ; 0ffffh ; x0, BX = -1h,教材,P122, mov bx,0ffH,错误,2024/9/16,67,程序例子(续,),jmp CONTI,ZERO: mov bx, 0 ; x=0, bx 0 bx - 1,CONTI: mov y_buf, bx ;,存放结果,mov ax, 4c00H,int 21H,code_seg ends,end START,2024/9/16,68,4.5.3 循环程序设计,对应,C,语言的,for,dowhile,while,循环程序由以下几部分组成。,1,循环初态(初始化部分),如设置循环次数,以及为循环体正常工作而建立的初始状态,如设置地址指针等,做好前续工作。,2,循环体 包括循环工作部分和循环控制部分。循环工作部分进行实际的数据处理,是核心部分。循环控制部分完成修改(如更新计数器和指针)和控制(跳转,继续/退出循环)两方面的内容。,3,结束部分 分析和存储结果。,2024/9/16,69,例1 用计数器控制循环,在一组给定个数的带符号16位数构成的数组中寻找最大值,放在指定的存储单元。,C,语言的实现,int data10;,max = data0;,for (i=1; i max ),max = datai;,printf(maximum number is %d, max);,2024/9/16,70,例1 用计数器控制循环(续),程序例子,ex122.asm,data_segsegment,buffer DW 4, -2, 6,-5, 10,count EQU $-buffer,max DW ?,data_segends,stack_seg segment stack stack,db 64 dup(0),top EQU $-stack_seg,stack_seg ends,code_seg segment,assume cs:code_seg, ds: data_seg,START: mov ax, data_seg; data segment addr.,mov ds, ax ; into DS register,mov ax, stack_seg; set up stack and SP,mov ss, ax,mov sp, top,2024/9/16,71,例1 用计数器控制循环(续),mov cx, count/2,;,教材错误,LEA bx, buffer; mov bx, offset buffer,mov ax, bx,dec cx;,比较,n-1,次,inc BX,inc BX;,教材错误,AGAIN: cmp ax, bx ;,完成一次比较,JGE NEXT,mov ax, bx ;,找大一个稍大的值,更新,NEXT: INC BX,inc BX ;,教材错误,LOOP AGAIN,mov max, ax;,保存结果(教材上没有),mov ax, 4c00H,int 21H,code_seg ends,end START,2024/9/16,72,多重循环(循环嵌套),应分别考虑多重循环的控制条件及其实现。另外,应该注意在每次外层循环再次进入内层循环时,初始条件必须重新设置。,例:软件延时程序:执行一条指令需要一定时间,由若干条指令形成循环程序,通过选择指令和安排循环次数就可以得到所需的延时时间。,DELAY: mov dx, 3fffH,TIME: mov ax, 0ffffh ;,重置初始条件,TIME1: dec ax,nop,jne TIME1,dec dx,JNE TIME,2024/9/16,73,4.5.4,子程序设计,子程序又称为过程,相当于高级语言中的过程函数,(1) 过程定义,proc_name PROC NEAR/FAR,proc_name endp,其中过程名是标识符,也是子程序入口的符号地址,(2) 子程序的调用与返回,CALL RET NEAR/FAR,属性 段内/段间调用/返回,应注意子程序运行期间的堆栈状态,由于,CALL,时使返回地址入栈,所以,RET,时应该使此返回地址出栈。子程序对堆栈的使用应特别注意,以免发生错误,(加图示),2024/9/16,74,子程序设计(续),(3)保存与恢复寄存器(保存现场),若调用子程序时,主程序与所使用的寄存器发生冲突,而又不希望子程序破坏主程序的中间结果(传送结果的,reg,除外),在进入子程序后, 可将相应的寄存器内保存在堆栈中,在退出子程序之前把,reg,的内容恢复原状(出栈)。,注意,PUSH /POP,要反向对称。,Push ax,Push bx,Pop bx,Pop ax,2024/9/16,75,子程序的参数传送,C,语言,int func1(int a,float b) ,return x;,主程序调用,y=func(aa,bb);,主程序在调用子程序时,经常需要传递一些参数给子程序,子程序运行完后也要回送一些信息给调用程序,这种信息传送称为变量传送(参数传送或过程通信)。参数传送方式:,1)通过寄存器传送参数(最广泛),2)如过程和调用程序在同一源文件(同一程序模块中),则过程可直接访问模块中的变量(如数据段的数据),相当于全局变量,2024/9/16,76,子程序的参数传送(续),3),通过地址表传送变量地址 在主过程中建立一个地址表,把要传送给子程的参数存放在地址表的首地址中,通过寄存器传送到子过程中,子程通过地址表取得所需的参数,并把结果存入指定的存储单元中去。(同,C,语言传送指针概念),4)通过堆栈传送参数或参数地址,在主程序中把参数地址保存到堆栈中,在子程序中从堆栈中取出参数(由,BP,作指针)以达到传送参数的目的,必须注意,子程序结束时的,RET,指令应使用带参数的返回指令(,RET n),,以便返回主程序后堆栈能恢复原始状态不变。,2024/9/16,77,嵌套与递归子程序,一个子程序也可作为调用程序去调用另一个子程,这种情况就为子程序的嵌套。嵌套的层数就称为嵌套深度。应注意寄存器的保存与恢复与堆栈问题。,一个程序调用它自身,称为递归调用。递归对应于数学上对函数的递归定义。往往能设计出效率较高的程序,完成相当复杂的计算。,N!,递归定义 0!=1,N!=N*(N-1),2024/9/16,78,子程序例 数码转换程序 (教材,P127),输入/输出设备以,ASCII,码表示字符,数通常以10进制数表示,而机器内部以二进制表示。在,CPU,与,I/O,设备之间必须进行代码转换,实现码转换的方法,1)用算术、逻辑运算指令实现(软件),2)用查表实现,3)用硬件实现,如,BCD,码到7段显示转换的译码器等,2024/9/16,79,例:十六进制到,ASCII,码的转换,十六进制与其,ASCII,码,0, 030,H,9 939H,A(10) A41H,F (15) F46H,0-9 +30H +0,A-F +37H + A-0ah,2024/9/16,80,例:十六进制到,ASCII,码的转换 流程图,2024/9/16,81,子程序的流程图,2024/9/16,82,P127,例 子程序的设计,data_segsegment,L1 DW 2 ;,要转换的字节数,string DB 34H, 98H,L2 DW ?;,转换结果的字节数,buffer DB 2*2 dup (?),data_segends,stack_seg segment stack stack,staptr dw 128 dup(?),top EQU LENGTH staptr,stack_seg ends,code_seg segment,assume cs:code_seg, ds: data_seg, ss:stack_seg,start: mov ax, data_seg; data segment addr.,mov ds, ax; into DS register,2024/9/16,83,P127,例 子程序的设计(续),mov ax, stack_seg ; set up stack and SP,mov ss, ax,mov sp, top,lea bx, string ;,要转换的字节地址,lea si, buffer ;,转换结果地址,mov cx, L1 ;,要转换字节的长度,mov ax, cx,SAL cx, 1; cx * 2,转换结果的长度,mov L2, cx ;,转换结果长度,mov cx, ax ;,恢复,cx,值,AGAIN: mov al, bx,mov dl, al ;,保存一份,al,and al, 0fh,CALL CHANGE ;,转换字节低4位,2024/9/16,84,P127,例 子程序的设计(续),mov al, dl,push cx,mov cl, 4,shr al,cl;,将,al,的高4位移到低4位,pop cx,CALL CHANGE ;,转换字节高4位,inc bx ;,修改指针,loop AGAIN,mov ax, 4c00h,int 21H; return to DOS,2024/9/16,85,P127,例 子程序的设计(续),CHANGE PROC,cmp al, 10,jl ADD_0,ADD AL, A-0-10,ADD_0: add al, 0,mov si, al,inc si,ret,CHANGE endp,code_seg ends,end start,2024/9/16,86,4.5.5,DOS,和,BIOS,调用,BIOS(basic input/output system),提供了系统加电自检,引导装入,主要,I/O,设备的处理程序以及接口控制等功能模块,提供了最基本的系统硬件与软件间接口.,DOS(disk operating system),是,PC,机的磁盘操作系统,DOS,系统功能调用。,DOS,规定用中断指令,INT 21H,进入各子程序的总入口,再为每个功能调用规定一个功能号,以便进入相应各个子程序的入口。子程序的入口参数及出口参数都有具体规定。,2024/9/16,87,Dos,调用(续),DOS,提供了80多个功能调用,使用方法如下。,1)调用功能的功能号存入,AH,寄存器,2)根据调用功能的规定设置入口参数,3)用,INT 21H,指令转入子程序入口,4)相应的子程序运行完后,可以按规定取得出口参数,2024/9/16,88,Dos,调用(续),1,返回,DOS,系统,功能号 4,CH,调用参数,AL=,返回码,mov ax, 4c00H ;,同时给,AH,AL,赋值,int 21H,2024/9/16,89,Dos,调用(续),2,从键盘输入一个字符并回显在屏幕上(检验是否按下,CTRL-BREAK,键,若是,则结束程序),功能号,AH=01H,返回参数,AL=,键入字符,例:设计一个交互程序,Get_key: mov ah,1 ; read a key with echo,int 21h,cmp al,Y ;is it Y?,je YES ; if so,jump to YES,cmp al,N ; is itN?,je NO,jne Get_key ; otherwise, wait rot Y or N,2024/9/16,90,Dos,调用(续),3,显示单个字符,检验,CTRL-BREAK,功能号,AH=02H,调用参数,DL=,字符,2024/9/16,91,例,:在屏幕(,CRT),上显示0-9 (,教材,P131) ex131.asm,stack_seg segment stack stack,db 64 dup(0),top EQU $-stack_seg,stack_seg ends,code_seg segment,as
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!