汇编程序专业知识讲座_第1页
汇编程序专业知识讲座_第2页
汇编程序专业知识讲座_第3页
汇编程序专业知识讲座_第4页
汇编程序专业知识讲座_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言程序设计movax,12hcalldisplayJmp1234h11/70主要内容:汇编语言源程序构造汇编语言语句格式伪指令功能调用汇编语言程序设计22/701 汇编语言源程序

机器语言——二进制数形式指令和数据。

B064是什么意思?这就是机器语言。既不直观,又不易理解和记忆.

MOVAL,64H

;很容易记忆理解,这就是助记符。

助记符——用便于记忆英语单词表达指令操作码。它反应了指令功能和主要特性,便于人们理解和记忆。33/70

操作数也许放在存放器中,这就包括操作数地址。程序中遇到转移指令或调用指令,也需要懂得转移地址,若采取详细地址就很不方便,一旦有错,改动也很麻烦。于是人们采取标号或符号来替代地址,例:

LP1:movax,VAR…loopLP1

汇编语言——指令助记符,符号地址,标号,伪指令等语言元素集合以及这些元素使用规则。用汇编语言编写程序叫汇编语言源程序。指令除了操作码以外,尚有一种操作数问题。44/70汇编程序源程序编译程序汇编程序汇编语言源程序机器语言目标程序汇编源程序需翻译成机器语言,变成可执行文献,机器才能执行,这个翻译过程叫汇编。——高级语言中称该过程为“解释”或“编译”。执行翻译程序称为“汇编程序”。55/70汇编语言程序设计与执行过程输入汇编语言源程序源文献.ASM汇编(编译)目标文献.OBJ链接可执行文献.EXE调试最后程序66/701.1汇编语言源程序构造

汇编语言源程序一般由一种或几个程序模块组成,每个模块一般由三个逻辑段组成:数据段——寄存数据、变量堆栈段——堆栈区域代码段——寄存程序指令77/70一种基本汇编语言程序框架如下:

stack

SEGMENTPARA‘stack‘DB100DUP(‘stack’)

stackENDS

dataSEGMENT

<数据、变量在此定义>

dataENDS

codeSEGMENT

ASSUMECS:code,DS:data,ES:data

start:MOVAX,dataMOVDS,AXMOVES,AX

<此处加入你自己程序段>MOVAL,4CH

INT21H

code

ENDSEND

start

堆栈段数据段代码段88/701.2汇编语言语句与格式汇编语言语句有两种:指令性语句——由8086指令助记符组成语句批示性语句——由伪指令组成语句指令性语句格式为:

标号:

指令助记符

目标操作数,源操作数

;注释

批示性语句格式为:

名字

伪指令

操作数1,操作数2,…,操作数n

;注释

注:各部分之间最少要用一种空格作为分隔符。99/70●指令性语句由CPU执行,每一条指令性语句都有一条机器码指令与其对应;

●批示性语句由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分派存放单元以及批示程序开始和结束等。批示性语句无机器码指令与其相对应。

指令性语句汇编时生成机器码;

批示性语句汇编时不生成机器码。1010/70语句组成元素:标号——指令符号地址,用来代表指令在存放器中地址。只能出目前指令性语句中,标号后应加上冒号。名字——段、过程、变量名字,用来代表它们在存放器中地址。只能出目前批示性语句中,名字后不加冒号。指令助记符——8086助记符、伪指令操作数——即指令操作对象对指令性语句——0,1,2个对批示性语句——根据需要而定操作数之间以逗号分隔操作数能够是:寄存器、存放单元、常数或体现式

例如:AX,[DI+BX+10],200,16*8+TABLE,等等1111/70注释——以分号开头,可放在指令后,也可单独一行。

注意注解写法。要写指令(段)在程序中作用,而不要写指令操作。例如:下列为同一条指令写注释1)MOVCX,100;传送100到CX2)MOVCX,100;循环计数器置初值显然,第二种写法要比第一种写法要好。

1212/70汇编语言一种实例:hello.asm

dataSEGMENTHelloDB‘Hello,world!’,0DH,0AH,’$’dataENDSprogSEGMENT

ASSUMECS:prog,DS:datastart:MOVAX,dataMOVDS,AX

LEADX,hello ;取字符串首地址MOVAH,9INT21H ;显示字符串MOVAH,4CHINT21H ;退回DOSprogENDSENDstart名字标号1313/70

1.3数据项与体现式数据项包括常量、变量、标号及体现式。1.常量二进制数,以B结尾。如01001101B。十进制数,如85。十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。字符串:用引号括起来1个或多种字符。如‘ERROR!’,’a’,汇编时被翻译成对应ASCII码45H,52H,52H,4FH,52H,21H和61H。1414/70有三个属性:

段地址:即标号所在段段地址;

偏移量:标号所代表存放单元段内偏移地址;

类型:NEAR或FAR:

NEAR—表达标号所在语句与转移指令/调用指令在同一码段内,跳转时只需变化IP即可。

FAR—标号所在语句与转移指令/调用指令不在同一代码段内。若没有对类型进行说明,默以为NEAR。标号一般作为转移指令或CALL指令转移地址。2.标号——指令所在内存单元符号地址1515/70变量——即内存中存放单元或数据区。变量名——是存放单元(数据区)符号地址或名字。变量也有三个属性:段地址—变量所在段段地址偏移量—变量单元地址与段首地址之间位移量。类型—有BYTE、WORD和DWORD三种。变量在程序中作为存放器操作数被引用。3.变量1616/70标号和变量名使用规则组成:A-Z(不分大小写),0-9,?@

._$不能以数字开头,句号(.)只能作为首字符长度不大于31个字符不能与保存字(指令助记符、伪指令、预定义符号等)重名不能反复定义例如:

正确:LP1,AGAIN,NEXT,_GO,OK_1

错误:4M,LOOP,AAA,#HELP,+ONE1717/704.体现式体现式是常数、寄存器、标号、变量与运算符组合。有数字体现式和地址体现式两种。汇编时按优先规则对体现式进行计算,计算出详细数值或地址。运行时不能变化。体现式中运算符有6类:算术、逻辑、关系、取地址、属性、杂类。1818/70用于数字体现式,例:

MOVAX,4*1024汇编后形式为:

MOVAX,4096用于地址体现式,例:

LEASI,TAB+3若TAB偏移地址为1000H,则汇编后形式为:

LEASI,[1003H]1)算术运算符——+、-、*、/,MOD1919/70逻辑运算符只能用于数字体现式中。例:MOV CL,36HAND0FH

经汇编后:MOVCL,06H注意,不要把逻辑运算符与逻辑运算指令混同:例:ANDAX,3FC0HAND0FF00H汇编后源操作数被翻译为:3F00H,因此上述指令与ANDAX,3F00H等价。2)逻辑运算符——AND、OR、XOR、NOT2020/70关系运算成果是一种逻辑值:真或假关系为真,成果为全1

关系为假,成果为全0例:MOVBX,PORTGT300H若PORT值大于300H,则汇编后为:

MOVBX,0FFFFH不然汇编后为:

MOVBX,03)关系运算符——EQ、NE、LT、GT、LE、GE2121/70SEG:取变量/标号段地址OFFSET:取变量/标号偏移地址例:VARDB12H ……MOVBX,OFFSET VAR;取变量VAR偏移地址MOVAX,SEGVAR;取变量VAR段地址注意,下列指令异同:

MOVBX,OFFSETVARLEABX,VAROFFSET只能取静态偏移地址;LEA指令即可取静态偏移地址,也可取动态偏移地址。4)取地址运算符——SEG、OFFSET2222/70TYPE取变量类型(1,2,4)LENGTH取所定义变量长度(即变量中元素个数)SIZE取所定义存放区字节数

(=TYPE*LENGTH)例:VARDW1,2,3,4,5则TYPEVAR=2LENGTHVAR=5SIZEVAR=105)取值运算符——TYPE、LENGTH、SIZE2323/706)属性运算符——PTR用来指定地址操作数类型。格式:<类型>PTR<地址操作数> 类型∈{BYTE,WORD,DWORD,NEAR,FAR}BYTE、WORD、DWORD

用于描述数据存放单元(变量)地址NEAR、FAR用于描述转移、调用目标地址2424/70例:MOV BYTEPTR[DI],0;字节类型MOV WORDPTR[DI],0;字类型

MOV [DI],0B5H;类型不定PTR也可用来进行强制类型转换例:STR1DW? ;STR1定义为字类型 MOV AX,STR1;合法MOV AL,STR1;非法MOVAL,BYTEPTRSTR1;合法2525/702伪指令数据定义伪指令符号定义伪指令段定义和段寄存器指定伪指令过程定义伪指令结束伪指令由汇编程序执行指令,它本身不被汇编成机器指令。常用伪指令有:2626/702.1数据定义伪指令用于定义变量,即内存单元或数据区。数据定义伪指令格式为:变量名数据定义伪指令操作数,操作数,…常用数据定义伪指令有如下几个:DB定义字节DW定义字DD定义双字操作数能够是常数、变量或体现式2727/70例1:DATA_BDB10,5,10HDATA_WDW100H,-4DATA_DDD0FFFBH汇编后内存分派情况如右图所示。05H10H00H01HFCHFFHFBHFFH00H00H0AHQDATA_BDATA_WDATA_D10510H100H-40FFFBH2828/70例2:操作数能够是字符串,例如

STRDB ‘HELLO’汇编后情况如图:STR‘H’‘E’‘L’‘L’‘O’注意下面两个定义不一样之处:DB ‘AB’ ;41H在低字节,42H在高字节DW‘AB’;42H在低字节,41H在高字节48H45H4CH4CH4FH2929/70操作数?用来保存存放空间,但不存入数据.例3:ABCDB0,1,2,3,4,’OK’,’$’RSVDW?,?,?,?,?,?,?,?复制操作符DUP:反复数据能够使用复制操作符DUP,如上面RSV亦可写成:RSVDW8DUP(?)若操作数中若使用$,则表达是地址计数器目前值。3030/70例:TABLEDB10DUP(?)BUFFERDWTABLE,$+3设TABLE偏移地址为0080H,则汇编后如下列图所示:BUFFER0080H80HTABLE008AH008BH008CH008DH...8FH00H00H0089H10Bytes3131/702.2符号定义伪指令把一种体现式用一种符号表达,后来凡出现该体现式地方都可用这个符号表达。类似于C语言中#define。符号定义伪指令有两种:EQU,=用EQU定义符号未清除前,不能重新定义。清除EQU定义可用PURGE伪指令。用”=”定义符号可在任何时候进行重定义。二者均不占用存放空间,仅是给符号赋值3232/70例:FIVEEQU5

COUNTEQUCX

TENEQU10

DIST=BYTEPTR[SI+BP]

GOTO=JMP…MOVAX,TENMOVCX,COUNTADDDIST,FIVE

DIST=WORDPTR[SI+BP+1]ADDDIST,AX

GOTOLABEL定义引用3333/702.3段定义伪指令汇编语言程序是按段来组织程序和数据。和存放器物理段相对应,汇编语言程序中段称为逻辑段。汇编连接后被映射到物理段中。三类段:代码(程序)、数据、堆栈段定义伪指令:SEGMENT、ENDS、ASSUME、ORG定义一种段基本格式:

段名

SEGMENT

[定位类型][组合方式][类别]

<汇编语言语句>

段名

ENDS3434/70这两个伪指令总是成对出现,二者前面段名应一致。SEGMENT说明了一种段开始,ENDS说明了一种段结束。对数据段和堆栈段,段中语句一般是变量定义。对代码段则是指令语句。如:dataSEGMENT<指令语句>dataENDSSEGMENT和ENDS伪指令3535/70ASSUME伪指令在代码段中,还必须明确段和段寄存器关系,这由ASSUME语句来指定。如

ASSUMECS:code,DS:data,ES:data语句中code和data为段名。这个语句说明:

1.CS将指向名字为code代码段

2.DS和ES将指向名字为data数据段3636/70但要注意,ASSUME伪指令只是通知汇编程序有关段寄存器与段关系,并没有给段寄存器赋予实际初值。故下面语句

MOV AX,DATAMOV DS,AXMOV ES,AX将段基址装入段寄存器。假如程序中用到堆栈段,则SS也需装入实际初值。代码段基地址不需要程序员装入CS寄存器,而由OS负责装入。3737/70SEGMENT语句后能够带有可选参数,用以要求逻辑段其他某些属性。1)定位类型说明如何确定逻辑段边界。有四种:PARA(Paragraph):

逻辑段从一种节(16个字节)边界开始。即段起始地址应能被16整除,或这说段起始物理地址应为××××0H。——默认类型BYTE:

逻辑段从字节边界开始,即段能够从任何地址开始。WORD:

逻辑段从字边界开始。即段起始地址必须是偶数。PAGE:

逻辑段从页边界开始。256字节称为一页,故段起始物理地址应为×××00H。3838/70

2)组合类型说明不一样模块中同名段组合方式。PUBLIC :所有此类型同名段组合成一种逻辑段,公用一种段地址,运行时装入同一种物理段中。COMMON:所有此类型同名段具有相同起始地址(覆盖),共享相同存放区域。AT<数值体现式>:按绝对地址定位,段地址就是体现式值。STACK:专用于说明堆栈段,组合方式同PUBLIC3939/703)类别用单引号括起来字符串。所有同类别段被安排在连续存放区域中。如:在模块1中有段定义:

seg1SEGMENTPARASTACK‘stack’

…seg1ENDS在模块2中有段定义:

seg2SEGMENTPARASTACK‘stack’

…seg2ENDS则连接时这两个段被安排在一起。4040/70ORG要求了段内指令或数据寄存开始地址(偏移地址初值),其格式为:

ORG<体现式>体现式值即为开始地址,从此地址起连续寄存程序或数据。例:ABCSEGMENTORG100Hbegin:……

ABCENDSORG伪指令指令从100H开始寄存4141/702.4过程定义伪指令PROC、ENDP过程就是子程序。一种过程能够被其他程序所调用(用CALL指令),过程最后一条指令一般是返回指令(RET)。过程定义伪指令格式为

<过程名>

PROC[类型]……RET

<过程名>

ENDP注意:PROC和ENDP必须成对出现。4242/70过程类型有两种:

NEAR——(默认类型)表达段内调用

FAR——表达段间调用

调用一种过程格式为:

CALL

<过程名>4343/702.5宏定义伪指令假如需要数次使用同一种程序段,能够将这个程序段定义为一种”宏指令”,然后在需要时,可简单地用宏指令名来替代这个程序段。指令格式为:<宏指令名>

MACRO

[形参表]

<宏定义体>

ENDM4444/70例:两个数之和宏定义和宏调用。宏定义为:DADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AX

ENDMX、Y、Z是形式参数。调用宏DADD时可写为:

DADD

DATA1,DATA2,SUMDATA1,DATA2,SUM是实际参数,由它们替代定义中X、Y、Z。4545/70宏调用与过程(子程序)调用都是一次定义,数次调用。它们之间差异是:①执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理,而CALL、RET则是由CPU执行指令。②汇编成果:宏命令伪指令汇编后被展开。③执行速度:宏命令执行速度较快(因无调用转移)④

占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程能够节省代码占用内存空间。4646/70宏展开:汇编程序会把宏调用按宏定义展开。例如:宏定义为:DisplayMACROstringLEADX,stringMOVAH,9INT21HENDM程序中宏调用:……DISPLAYERROR_MESSAGEDISPLAYEXIT_MESSAGE……汇编后成果:(带有+号指令为宏展开后成果)……+LEADX,ERROR_MESSAGE+MOVAH,9+INT21H+LEADX,EXIT_MESSAGE+MOV AH,9+INT21H……4747/702.6汇编结束伪指令END汇编语言源程序最后,要加汇编结束伪指令END,以使汇编程序结束汇编。格式:END[体现式]END后跟体现式一般就是程序第一条指令标号,批示程序启动地址(要执行第一条指令地址)。4848/703DOS系统功能调用介绍系统功能调用——由OS提供一组实现特殊功能子程序供程序员在程序中调用,以减轻编程工作量。系统功能调用有两种,一种称为DOS功能调用,另一种称为BIOS功能调用。顾客程序在调用这些系统服务程序时,不是用CALL命令,而是采取软中断指令INTn来实现。在DOS系统中,功能调用都是用软中断指令INT21H来实现。4949/70INT2lH功能大体能够分为四个方面:设备管理、目录管理、文献管理和其他。参见P411页附录C.3D0S系统功能调用使用办法如下:① AH←功能号;② 设置该功能所要求其他入口参数;③ 执行INT21H指令;分析出口参数。下列介绍INT21H几个最常用功能。5050/70有关数据输入和输出我们这里只讨论键盘输入和显示输出,调用系统功能需要提供入口参数及所调用功能号,调用结束返回成果。1.DOS键盘功能调用(1)从键盘输入一种字符(功能号=1)

MOVAH,1INT21H<AL中有键入字符>

5151/70例:程序中有时需要顾客对提醒做出应答。GET_KEY:MOVAH,1

;等候键入字符

INT21H

;成果在AL中

CMPAL,’Y’ ;是’Y’?JZYES ;是,转YESCMPAL,’N’ ;是’N’?JZNO ;是,转NOJMPGET_KEY ;不然继续等候输入YES: …

…NO: …5252/70(2)输入字符串(功能号=0AH)此功能调用从键盘输入一串字符并把它存入顾客指定缓冲区中。

MOVAH,

0AH

LEADX,<字符串缓冲区首地址>

INT21H

(预留N1个字节存放单元)

0DHN2N1N1:缓冲区长度(最大键入字符数)N2:实际键入字符数(不包括回车符)顾客定义输入字符串缓冲区格式5353/70若顾客键入字符数(包括回车)≥定义N1,本功能调用将不再接收新键入,且光标不再向右移动。例:设在数据段定义键盘缓冲区如下:

STR1DB10,?,10DUP(?)调用DOS功能0AH号功能程序段为:

LEADX,STR1MOVAH,0AHINT21H此程序段最多从键盘接收10个按键(包括回车)。5454/702.DOS显示功能调用(1)在显示屏上显示一种字符(功能号=2)

MOVAH,2

MOVDL,<要显示字符>INT21H例:在显示屏上显示一种字符‘A’MOVAH,2MOVDL,’A’;或MOVDL,

41HINT21H5555/70

MOVAH,9LEADX,<字符串>

INT21H注意:被显示字符串必须以’$’结束。(2)显示字符串(功能号=9)5656/70例:在屏幕上显示:’HELLO,WORLD!’;在数据段定义字符串:DATASEGMENTSTR1DB‘HELLO,WORLD!$’DATAENDS;在代码段中进行显示输出

MOVAH,9LEADX,STR1INT21H完整程序:HELLO.ASM5757/70汇编语言上机过程YYYNNN有错?有错?有错?结束汇编输入(修改)源程序连接运行查错开始用EDIT,NOTEPAD等任何文本编辑器。源程序存为.ASM文献用MASM宏汇编程序进行汇编。汇编后生成.OBJ目标文献。命令格式:MASM<源文献名.ASM>;用LINK连接程序进行连接。连接后生成.EXE可执行文献。命令格式:LINK<目标文献名.OBJ>;用TD、DEBUG等调试程序进行调试。命令格式:TD<可执行文献名.EXE>5858/70标号:条件满足?处理2次序程序3分支程序NYIF…THEN构造程序构造:

… 测试/比较指令(TEST/CMP)条件转移指令(Jx标号)

处理体

标号:其他指令 …5959/70程序构造:TEST/CMP指令Jx标号1

处理体P1JMP标号2标号1:

处理体P2标号2:其他指令…条件满足?处理P1处理P2标号1:标号2:条件1条件2IF…THEN…ELSE构造6060/70标号1:条件1成立?P1NYCASE构造程序构造:…TEST/CMP指令(测试条件1)

Jx标号1;不满足转标号1

处理体P1…

JMP标号n+1标号1:TEST/CMP指令(测试条件2)

Jx标号2;不满足转标号2

处理体P2…

JMP标号n+1标号2:TEST/CMP指令(测试条件3)Jx标号3;不满足转标号3

处理体P3…JMP标号n+1标号3:TEST/CMP指令(测试条件4)……标号n+1:(公共出口)条件2成立?条件n成立?…Pn+1标号2:标号n:标号n+1:P2PnNNYY6161/704循环程序1.DO…UNTIL<条件>构造先执行,再判断条件。工作部分最少执行一次。初始化循环体循环控制继续循环?YN6262/702.DOWHILE<条件>构造先判断条件,再执行。工作部分有也许一次都不执行。初始化循环体循环控制继续循环?YN6363/70掌握下列几点:调用子程序用CALL指令,返回调用程序用RET指令。子程序允许嵌套调用。进入子程序后首先要保护主程序运行状态(标志位)和使用寄存器内容(称为保护现场),退出子程序前要恢复现场。调用前要预先确定子程序中要使用哪些寄存器,并定义入口参数和出口参数。参数传递可利用寄存器、存放单元或堆栈(要用BP寻址)。子程序设计举例6464/70例1:

二进制数(0-F)转换成ASCII(‘0’-‘F’)子程序。BIN2ASCPROC;要转换数在AL低四位;转换成果仍在AL中CMPAL,9JAA2FADDAL,30HJMPDONEA2F:ADDAL,37HDONE:RETBIN2ASCENDP

调用办法:(在主程序中)…

MOVAL,0CH

CALLBIN2ASC(AL中有0CHASCII码43H,’C’)6565/70例.字符串处理程序设计

对字符串进行操作时,往往需要确定它长度。一般字符串结束标志以CR或$作标志。因此能够用扫描CR或$办法计算出串长。在计算串长时,应注意串长一般应不大于255个字节。

6666/70简化流程图:开始求串长串长<256?显示串长高位显示串长低位结束Y警告:太长求串长目前字符是‘$’?搜索CR字符同步指针增量返回N串长加1存串长N找到?NYY初始化指针/计数器6767/70如下程序是准备将0至100中奇数求和,成果送SUM字单元DATASEGMENT

;(1)定义成果单元,初值为0

DATAENDS

STACTSEGMENTPARASTACK

DB100DUP(?)

STACKENDS;定义好堆栈

CODESEGMENT

ASSUMEDS:DATA,CS:CODE,SS:STACK

START:MOV;(2)

MOVDS,AX

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论