版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、123.13.1汇编语言概述汇编语言概述 1 1、机器语言机器语言二进制数形式的指令和数据。二进制数形式的指令和数据。 B0 64 B0 64 是什么意思?这就是机器语言。既不直观是什么意思?这就是机器语言。既不直观, ,又不易理解和记忆又不易理解和记忆. . 2 2、汇编语言汇编语言- MOV AL MOV AL,64H64H ;很容易记忆理解,这就是很容易记忆理解,这就是助记符助记符。 助记符助记符用便于记忆的英语单词表示的指令操作码。用便于记忆的英语单词表示的指令操作码。它它反映了指令反映了指令的功能和主要特征的功能和主要特征, ,便于人们理解和记忆。便于人们理解和记忆。 指令除了操作码
2、以外指令除了操作码以外, ,还有一个操作数问题。还有一个操作数问题。 操作数可能放在存储器中操作数可能放在存储器中, ,这就涉及操作数的地址。程序中遇到转移这就涉及操作数的地址。程序中遇到转移指令或调用指令指令或调用指令, ,也需要知道转移地址也需要知道转移地址, ,若采用具体地址就很不方便若采用具体地址就很不方便, ,一旦有一旦有错,改动也很麻烦。于是人们错,改动也很麻烦。于是人们采用标号或符号来代替地址。采用标号或符号来代替地址。3 LP1LP1: mov ax,: mov ax,VARVAR loop loop LP1LP1 汇编语言汇编语言指令助记符指令助记符, ,符号地址,标号,伪指
3、令等语言元素的集合符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。以及这些元素使用的规则。 用汇编语言编写的程序叫用汇编语言编写的程序叫汇编语言源程序汇编语言源程序。 汇编源程序需翻译成机器语言汇编源程序需翻译成机器语言, ,变成可执行文件变成可执行文件, ,机器才能执行机器才能执行, ,这个翻这个翻译过程叫译过程叫汇编汇编。高级语言中称该过程为高级语言中称该过程为“解释解释”或或“编译编译”。执行。执行翻译的程序称为翻译的程序称为“汇编程序汇编程序”。源程序的编译程序源程序的编译程序汇编程序汇编程序汇编语言源程序汇编语言源程序机器语言目标程序机器语言目标程序4汇编语言程序设计与
4、执行过程汇编语言程序设计与执行过程输入汇编语言源程序输入汇编语言源程序 源文件源文件 .ASM汇编(编译)汇编(编译) 目标文件目标文件 .OBJ链接链接 可执行文件可执行文件 .EXE调试调试 最终程序最终程序小汇编:小汇编:ASM 宏汇编:宏汇编:MASM3、高级语言:通用性强。例:、高级语言:通用性强。例:MATLAB、C、Pascal53.2 3.2 汇编语言源程序的格式汇编语言源程序的格式 汇编语言源程序通常由一个或几个程序模块组成汇编语言源程序通常由一个或几个程序模块组成, ,每个模块一般由三每个模块一般由三个逻辑段组成:个逻辑段组成: 数据段数据段存放数据、变量存放数据、变量 D
5、ATA SEGMENT DATA SEGMENT DATA ENDS DATA ENDS 堆栈段堆栈段堆栈区域堆栈区域 STACK SEGMENTSTACK SEGMENT STACK ENDS STACK ENDS 代码段代码段存放程序指令存放程序指令 CODE SEGMENT CODE SEGMENT CODE ENDSCODE ENDS3.2.1 分段结构分段结构6 一个基本的汇编语言程序框架如下: stack SEGMENT PARA stack DB 100 DUP(stack) stack ENDS data SEGMENT data ENDS code SEGMENT ASSUM
6、E CS:code, DS:data, ES:data start: MOV AX, data MOV DS, AX MOV ES, AX MOV AH, 4CH INT 21H code ENDS END start 堆栈段堆栈段数据段数据段代码段代码段7例:将两个五字节的例:将两个五字节的16进制数相加进制数相加DATA SEGMENT ;定义数据段;定义数据段DATA1 DB 0F8H,60H,0ACH,74H,3BH ;变量一,字节;变量一,字节DATA2 DB 0C1H,36H,93H,0D5H,20H ;变量二,字节;变量二,字节DATA ENDS ;数据段结束;数据段结束CODE
7、 SEGMENT ;定义代码段;定义代码段 ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX ;初始化;初始化DS MOV CX,5 ;置循环次数送;置循环次数送CX MOV SI,0 ;(SI)=0 CLC ;(CF)=08LOOPER: MOV AL,DATA2SI ;取一个字节加数;取一个字节加数 ADC DATA1SI,AL ;与被加数相加,带进位加法;与被加数相加,带进位加法 INC SI ;SI加加1 DEC CX ;CX减减1 JNZ LOOPER ;若;若(CX)不等于不等于0,转,转LOOPER MOV AH,4CH INT
8、 21H ;返回;返回DOSCODE ENDS ;代码段结束;代码段结束 END START ;源程序结束;源程序结束注:注:MOV AH,4CH INT 21H ;DOS功能调用,结束正在运行的程序,返回功能调用,结束正在运行的程序,返回DOS93.2.2 3.2.2 汇编语言语句的类型和组成汇编语言语句的类型和组成汇编语言的语句有两种:汇编语言的语句有两种:指令性语句指令性语句由由80868086指令助记符构成的语句指令助记符构成的语句指令性语句指令性语句的格式为:的格式为: 标号标号: : 指令助记符指令助记符 目的操作数,源操作数目的操作数,源操作数 ; ;注释注释注:各部分之间至少要
9、用一个空格作为分隔符。注:各部分之间至少要用一个空格作为分隔符。l 指令性语句指令性语句由由CPU执行,每一条指令性语句都有一条机器码指令与其对应执行,每一条指令性语句都有一条机器码指令与其对应 指令性语句汇编时生成机器码指令性语句汇编时生成机器码; ; 例:例:LOOPER: MOV AL,DATASILOOPER: MOV AL,DATASI10汇编语言的语句有两种:汇编语言的语句有两种:指示性语句指示性语句由伪指令构成的语句由伪指令构成的语句指示性语句指示性语句的格式为:的格式为: 名字名字 伪指令伪指令 操作数操作数1,1,操作数操作数2,2,操作数操作数n n ; ;注释注释注:各部
10、分之间至少要用一个空格作为分隔符。注:各部分之间至少要用一个空格作为分隔符。l 指示性语句指示性语句由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。机器码指令与其相对应。 指示性语句汇编时指示性语句汇编时不不生成机器码。生成机器码。例:例:DATA DB 0FBH,60HDATA DB 0FBH,60H11标号有三个属性:标号有三个属性: 段地址段地址:即标号所在段的段地址;:即标号所在
11、段的段地址; 程序中引用一个标号,该标号的段地址应在程序中引用一个标号,该标号的段地址应在CSCS中。中。 偏移量偏移量:标号所代表存储单元的段内偏移地址;:标号所代表存储单元的段内偏移地址;1616位的无符号数位的无符号数 类类 型型:NEARNEAR或或FARFAR: NEARNEAR表示标号所在语句与转移指令表示标号所在语句与转移指令/ /调用指令在同一码段内调用指令在同一码段内, ,跳转时只需改变跳转时只需改变IPIP即可。即可。 FARFAR标号所在语句与转移指令标号所在语句与转移指令/ /调用指令不在同一代码段内。调用指令不在同一代码段内。 若没有对类型进行说明若没有对类型进行说明
12、, ,默认为默认为NEARNEAR。标号通常作为标号通常作为转移指令转移指令或或CALLCALL指令指令的转移地址。的转移地址。3.2.3 3.2.3 名字名字12汇编语言的一个实例汇编语言的一个实例: : hello.asmhello.asm Hello Hello DB DB Hello, world!Hello, world!,0DH,0AH,0DH,0AH,$ $ ASSUMEASSUME CS:CS:progprog,DS:,DS:datadatastartstart: MOV : MOV AX,AX,datadata MOV DS,AX MOV DS,AX LEA LEA DX,D
13、X,hellohello; ;取字符串首地址取字符串首地址 MOV AH,9MOV AH,9 INT 21H INT 21H; ;显示字符串显示字符串 MOV AH,4CH MOV AH,4CH INT 21H INT 21H; ;退回退回DOSDOS名字标号13 3.2.4 3.2.4 助记符和伪操作助记符和伪操作助记符:助记符:80868086、8088CPU8088CPU指令的助记符,例如:指令的助记符,例如:MOV, ADD,MULMOV, ADD,MUL等等伪操作指令:如伪操作指令:如DBDB、SEGMENTSEGMENT、ENDSENDS、ASSUMEASSUME、ENDSENDS
14、3.2.5 3.2.5 操作数操作数操作数包括操作数包括常量常量、寄存器寄存器、标号标号、变量变量及及表达式表达式。1.1.常量常量 二进制数二进制数, ,以以B B结尾。如结尾。如01001101B01001101B。 十进制数十进制数, ,如如8585。 八进制数八进制数, ,以以Q Q结尾。如结尾。如174Q174Q。14 十六进制数十六进制数, ,以以H H结尾。第结尾。第1 1个数字为个数字为A-FA-F时,时,前面应加前面应加0 0,如,如0 0F160HF160H。字符串:用引号括起来的字符串:用引号括起来的1 1个或多个字符。如个或多个字符。如ERROR!, a,ERROR!,
15、 a,汇编汇编时被时被 翻译成对应的翻译成对应的ASCIIASCII码码4 45H,52H,52H,4FH,52H,21H5H,52H,52H,4FH,52H,21H和和61H61H。十进制科学计数法。如:十进制科学计数法。如:8.75E-48.75E-4十六进制实数。如:十六进制实数。如:10A4E87R10A4E87R2 2、寄存器、寄存器8 8位寄存器:位寄存器:AHAH、ALAL、BHBH、BLBL、CHCH、CLCL、DHDH、DLDL1616位寄存器:位寄存器:AXAX、BXBX、CXCX、DXDX、SISI、DIDI、BPBP、SPSP、DSDS、CSCS、SSSS、DSDS3
16、3、标号:代表一条指令的、标号:代表一条指令的符号地址符号地址15 变量名变量名是存储单元是存储单元( (数据区数据区) )的符号地址或名字。的符号地址或名字。 变量也有三个属性变量也有三个属性: :段地址段地址变量所在段的段地址变量所在段的段地址偏移量偏移量变量单元地址与段首地址之间的位移量。变量单元地址与段首地址之间的位移量。类类 型型有有BYTEBYTE、WORDWORD和和DWORDDWORD三种。三种。 变量在程序中作为变量在程序中作为存储器操作数存储器操作数被引用。被引用。标号和变量名的使用规则标号和变量名的使用规则 组成:组成:A-Z(不不分大小写分大小写), 0-9, ? .
17、_ $ 不不能以数字开头能以数字开头 长度小于长度小于31个字符个字符 不不能与保留字能与保留字(指令助记符、伪指令、预定义符号等指令助记符、伪指令、预定义符号等)重名重名 不不能重复定义能重复定义例如:例如: 正确的:正确的:LP1, AGAIN, NEXT, _GO, OK_1 错误的:错误的:4M, LOOP, AAA, #HELP, +ONE4.4.变量变量-即内存中的存储单元或数据区。即内存中的存储单元或数据区。165.5.表达式表达式 表达式是常数、寄存器、标号、变量与运算符的组合。表达式是常数、寄存器、标号、变量与运算符的组合。 有有数字表达式数字表达式和和地址表达式地址表达式两
18、种。两种。 汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。行时不能改变。 表达式中的运算符有表达式中的运算符有6 6类:算术、逻辑、关系、取地址、属性、杂类。类:算术、逻辑、关系、取地址、属性、杂类。(1)1)算术运算符算术运算符 + +、- -、* *、/ /,MODMOD 用于数字表达式用于数字表达式, ,例:例: MOV AX,4MOV AX,4* *10241024汇编后的形式为汇编后的形式为: : MOV AX,4096 MOV AX,4096 用于地址表达式用于地址表达式, ,例例: : LEA
19、 SI,TAB+3LEA SI,TAB+3若若TABTAB的偏移地址为的偏移地址为1000H1000H,则汇编后的形式为:,则汇编后的形式为:LEA SI,1003H LEA SI,1003H 17逻辑运算符只能用于数字表达式中。逻辑运算符只能用于数字表达式中。 例:例:MOVMOVCL,36H AND 0FHCL,36H AND 0FH 经汇编后:经汇编后:MOV CL,06HMOV CL,06H注意,不要把逻辑运算符与逻辑运算指令混淆:注意,不要把逻辑运算符与逻辑运算指令混淆: 例:例:AND AX, AND AX, 3FC0H AND 0FF00H3FC0H AND 0FF00H汇编后源
20、操作数被翻译为:汇编后源操作数被翻译为:3F00H3F00H,所以上述指令与,所以上述指令与AND AX, 3F00HAND AX, 3F00H等价。等价。(2)2)逻辑运算符逻辑运算符 AND AND、OROR、XORXOR、NOTNOT 关系运算的结果是一个逻辑值:关系运算的结果是一个逻辑值:真真或或假假 关系为真关系为真, ,结果为全结果为全1 1; 关系为假关系为假, ,结果为全结果为全0 0例:例: MOV BX,PORT GT 300HMOV BX,PORT GT 300H 若若PORTPORT的值大于的值大于300H,300H,则汇编后为:则汇编后为:MOV BX,0FFFFHM
21、OV BX,0FFFFH 否则汇编后为:否则汇编后为: MOV BX,0MOV BX,0(3)3)关系运算符关系运算符EQEQ、NENE、LTLT、GTGT、LELE、GEGE18OFFSET:取变量:取变量/标号的偏移地址标号的偏移地址注意,以下指令的异同:注意,以下指令的异同: MOV BX, OFFSET VAR LEA BX, VAROFFSET只能取静态的偏移地址;只能取静态的偏移地址;LEA指令即可取静态的偏移地址,也可取动态的偏移地址。指令即可取静态的偏移地址,也可取动态的偏移地址。SEG:取变量:取变量/标号的段地址。标号的段地址。例:例:MOV AX, SEG DATA MO
22、V DS,AX ;取变量;取变量DATA的段地址的段地址(4)4)分析运算符和合成运算符分析运算符和合成运算符19TYPE 取变量的类型(取变量的类型(1,2,4)VAR DW ? ;字字ARRAY DD 10DUP(?) ;双字双字STR DB This is a test ;字节字节 MOV AX,TYPE VAR ;(AX)=2 MOV BX, TYPE ARRAY ;(BX)=4 MOV CX, TYPE STR ;(CX)=1LENGTH 取所定义变量的长度(即变量中元素的个数)取所定义变量的长度(即变量中元素的个数)未使用重复操作符未使用重复操作符DUP,变量个数为,变量个数为1;
23、否则如上例中的变量否则如上例中的变量ARRAY的个数为的个数为10;20SIZE 取所定义存储区的字节数(取所定义存储区的字节数(=TYPE*LENGTH)例:例:VAR DW 1,2,3,4,5 则则 TYPE VAR = 2,LENGTH VAR = 5,SIZE VAR = 10合成运算符合成运算符PTR:用来指定地址操作数的类型用来指定地址操作数的类型格式:格式: PTR 类型类型BYTE, WORD, DWORD, NEAR, FARBYTE、WORD、DWORD 用于描述数据存储单元用于描述数据存储单元(变量变量)地址地址NEAR、FAR 用于描述转移、调用的目的地址用于描述转移、
24、调用的目的地址例:例:MOVMOV BYTE PTRDI,0 ; BYTE PTRDI,0 ;字节类型字节类型 MOV MOV WORD PTRDI,0 ; WORD PTRDI,0 ;字类型字类型 MOVMOV DI,0B5H ; DI,0B5H ;类型不定类型不定21PTRPTR也可用来进行强制类型转换也可用来进行强制类型转换例:例:STR1 DW STR1 DW ? ;STR1 ;STR1定义为字类型定义为字类型 MOV AX,STR1 ; MOV AX,STR1 ;合法合法 MOV MOV AL,STR1 ; AL,STR1 ;非法非法 MOV AL, MOV AL, BYTE PTR
25、BYTE PTR STR1 ; STR1 ;合法合法合成运算符合成运算符THIS:用来指定存储器操作数的类型用来指定存储器操作数的类型合成运算符合成运算符SHORTSHORT:地址操作数:地址操作数22(5)5)其他运算符其他运算符方括号方括号:存储器地址:存储器地址MOV CL,BX ;MOV CL,BX ;间址寻址间址寻址MOV AL,SI+5 ;MOV AL,SI+5 ;变址寻址变址寻址段超越运算符:段超越运算符:MOV AX,ES:DIMOV AX,ES:DIHIGHHIGH、LOWLOW:获取数值或地址表达式的高位和低位字节:获取数值或地址表达式的高位和低位字节VAR EQU 0AB
26、CDHVAR EQU 0ABCDH MOV AH,HIGH VAR ; (AH)=0ABH MOV AH,HIGH VAR ; (AH)=0ABH MOV AL,LOW VAR ; (AL)=0CDH MOV AL,LOW VAR ; (AL)=0CDH233.2.6 注释注释 注释注释以分号开头,可放在指令后,也可单独一行。以分号开头,可放在指令后,也可单独一行。 注意注解的写法。要写指令(段)在程序中的作用,而注意注解的写法。要写指令(段)在程序中的作用,而不不要写指令要写指令的操作。的操作。 例如:以下为同一条指令写的注释例如:以下为同一条指令写的注释 1)MOV CX,100 ;传送传
27、送100到到CX 2)MOV CX,100 ;循环计数器置初值循环计数器置初值 显然,第二种写法要比第一种写法要好。显然,第二种写法要比第一种写法要好。 243.3 3.3 伪操作命令伪操作命令 数据定义伪指令数据定义伪指令 符号定义伪指令符号定义伪指令 段定义和段寄存器指定伪指令段定义和段寄存器指定伪指令 过程定义伪指令过程定义伪指令 结束伪指令结束伪指令253.3.2 3.3.2 数据定义伪指令数据定义伪指令 用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:用于定义变量,即内存单元或数据区。数据定义伪指令的格式为:变量名变量名 数据定义伪指令数据定义伪指令 操作数,操作数,操作数
28、,操作数,常用的数据定义伪指令有如下几种:常用的数据定义伪指令有如下几种: DB DB 定义定义字节、字节、DW DW 定义定义字、字、DD DD 定义定义双字、双字、DQ DQ 定义定义八八字节字节 DT DT 定义定义十字节十字节操作数可以是常数、变量或表达式操作数可以是常数、变量或表达式例例1 1:DATA_B DB 10,5,10HDATA_B DB 10,5,10H DATA_W DW 100H,-4 DATA_W DW 100H,-4 DATA_D DD 0FFFBH DATA_D DD 0FFFBH 汇编后的内存分配情况如右图所示汇编后的内存分配情况如右图所示。05H10H00H
29、01HFCHFFHFBHFFH00H00H0AH26例例2 2:DATA DB 100,0FFH ;DATA DB 100,0FFH ;存入存入64H64H,0FFH0FFH EXPR DB 2 EXPR DB 2* *3+7 ;3+7 ;存入存入0DH=13D0DH=13D STR DB WELCOME! ; STR DB WELCOME! ;存入存入8 8个字符个字符 AB DB AB ;AB DB AB ;存入存入41H41H,42H42H BA DW AB ; BA DW AB ;存入存入42H42H,41H41H ABDD DD AB ; ABDD DD AB ;存入存入42H42H
30、,41H41H,0000,0000 OFFAB DW AB ; OFFAB DW AB ;存入变量存入变量ABAB的偏移地址的偏移地址 ADRS DW TABLE,TABLE+5,TABLE+10 ; ADRS DW TABLE,TABLE+5,TABLE+10 ;存入存入3 3个偏移地址个偏移地址 TOTAL DD TABLE ; TOTAL DD TABLE ;先存入先存入TABLETABLE偏移地址,再存段地址偏移地址,再存段地址 NUM DQ 00 11 22 33 44 55 66 77H NUM DQ 00 11 22 33 44 55 66 77H ; ;存入存入77H77H,6
31、6H66H,55H55H,44H44H,33H33H,22H22H,11H11H,00H00H, DECML DT 1234567890H DECML DT 1234567890H ; ;存入存入90H90H,78H78H,56H56H,34H34H,12H12H,0000,0000,0000,0000,0000 HEXTAB DB 01,02,03,04,05,06,07,08,09 HEXTAB DB 01,02,03,04,05,06,07,08,09 DB 0AH,0BH,0CH,0DH,0EH,0FH DB 0AH,0BH,0CH,0DH,0EH,0FH 27例例3 3:操作数可以是
32、字符串,例如:操作数可以是字符串,例如STR DBHELLO 汇编后的情况如图:汇编后的情况如图:注意下面两个定义的不同之处:注意下面两个定义的不同之处:DBAB ;41H ;41H在低字节,在低字节,42H42H在高字节在高字节DW AB ; ;42H42H在低字节,在低字节,41H41H在高字节在高字节STRHELLO48H45H4CH4CH4FH操作数操作数?用来保留存储空间用来保留存储空间,但不存入数据但不存入数据.例例4:ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,?,?,?,?28l复制操作符复制操作符DUP:重复的数据可以使用复制操作符重复的数据可以
33、使用复制操作符DUP, ,如上面如上面RSV亦可写成亦可写成: : RSV DW 8 DUP(?)若操作数中若使用若操作数中若使用$, ,则表示的是地址计数器的当前值。则表示的是地址计数器的当前值。例:例: TABLE DB 10 DUP(?) BUFFER DW TABLE,$+3设设TABLE的偏移地址为的偏移地址为0080H, ,则汇编后如下图所示:则汇编后如下图所示:BUFFER0080H80HTABLE.8FH00H0089H10 Bytes293.3.3 3.3.3 符号定义伪指令符号定义伪指令1 1、 EQU 格式:名字格式:名字 EQU 表达式表达式 把一个表达式用一个符号表示
34、,以后凡出现该表达式的地方都可用把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于这个符号表示。类似于C C语言中的语言中的#define#define。用用EQUEQU定义的符号未清除前不能重新定义。清除定义的符号未清除前不能重新定义。清除EQUEQU定义用定义用PURGEPURGE伪指令。伪指令。不占用存储空间不占用存储空间, ,仅是给符号赋值仅是给符号赋值 CR EQU ODH ;CR EQU ODH ;常数常数A EQU ASCII_TABLE A EQU ASCII_TABLE ;变量;变量STR EQU 64STR EQU 64* *1024 1024
35、;数值表达式;数值表达式ADR EQU ES:BP+DI+5 ADR EQU ES:BP+DI+5 ;地址表达式;地址表达式CBD EQU AAM CBD EQU AAM ;指令助记符;指令助记符302 2、= 格式:名字格式:名字 = 表达式表达式区别:可对同一名字重复定义区别:可对同一名字重复定义不不占用存储空间占用存储空间, ,仅是给符号赋值仅是给符号赋值例例1:FIVE EQU 5 COUNT EQU CX TEN EQU 10 DIST = BYTE PTRSI+BP GOTO = JMP MOV AX, TEN MOV CX, COUNT ADD DIST, FIVE DIST =
36、 WORD PTRSI+BP+1 ADD DIST, AX GOTO LABEL 定义定义引用引用31例例2 2:COUNT=10COUNT=10 MOV CX,COUNT ;(CX)=10 MOV CX,COUNT ;(CX)=10 COUNT=COUNT-1 COUNT=COUNT-1 MOV BX,COUNT ;(BX)=9 MOV BX,COUNT ;(BX)=9例例3 3: COLUMN COLUMN EQU 80 EQU 80 ROW ROW EQU 25 EQU 25 SCREENFUL SCREENFUL EQU COLUMN EQU COLUMN* *ROWROW3 3、LA
37、BEL 格式:名字格式:名字 LABEL 类型类型例:例:AREAW LABEL WORD ; AREAWAREAW LABEL WORD ; AREAW类型为类型为WORDWORD323.3.4 3.3.4 段定义伪操作段定义伪操作1 1、SEGMENT/ENDSSEGMENT/ENDS格式:格式: 段名段名 SEGMENT 定位类型定位类型组合方式组合方式类别类别 段名段名 ENDS 汇编语言程序是按段来组织程序和数据的。汇编语言程序是按段来组织程序和数据的。 和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编和存储器的物理段相对应,汇编语言程序中的段称为逻辑段。汇编连接后被映射到
38、物理段中。连接后被映射到物理段中。33逻辑段从一个节逻辑段从一个节 (16个字节个字节) 的边界开始的边界开始。 即即段的起始地址应能被段的起始地址应能被16整除整除, 或这说段或这说段起始物理地址应为起始物理地址应为0H。默认类型默认类型逻辑段从字节边界开始,即段可以从任何地址开始逻辑段从字节边界开始,即段可以从任何地址开始。逻辑段从字边界开始。即段的起始地址必须是偶数逻辑段从字边界开始。即段的起始地址必须是偶数。逻辑段从页边界开始。逻辑段从页边界开始。256字节称为一页,故段的起始字节称为一页,故段的起始物理地址应为物理地址应为00H。34 说明不同模块中同名段的组合方式。说明不同模块中同
39、名段的组合方式。 PUBLIC: 所有此类型的同名段组合成一个逻辑段,公用一个段地所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。址,运行时装入同一个物理段中。 COMMON : 所有此类型的同名段具有相同的起始地址所有此类型的同名段具有相同的起始地址(覆盖覆盖),共享相,共享相同的存储区域。同的存储区域。 AT : 按绝对地址定位,段地址就是表达式的值。按绝对地址定位,段地址就是表达式的值。 STACK : 专用于说明堆栈段,组合方式同专用于说明堆栈段,组合方式同PUBLIC35STACK SEGMENT STACK DB 100 DUP(?) STACK EN
40、DSDATA1 SEGMENT BYTESTRING DB This is an example!DATA1 ENDSDATA2 SEGMENT WORDBUFFER DW 40 DUP(0) DATA2 ENDS 36CODE1 SEGMENT PAGE CODE1 ENDSCODE2 SEGMENT PAGE CODE2 ENDS START: MOV AX,STACK; MOV SS,AXCODE2 ENDS END START 37长度说明:长度说明:STACK的长度为的长度为100*1=100D=64HDATA1的长度为的长度为19*1=19D=13HDATA2的长度为的长度为40*
41、2=80D=50HCODE1的长度为的长度为13*1=13D=0DHCODE2的长度为的长度为52*1=52D=34H所占内存地址:所占内存地址:STACK:00000H00063H,占,占64H=100个字节,从个字节,从00H开始开始DATA1:00064H00076H,占,占13H=19个字节,从个字节,从任何地址开始任何地址开始DATA2:00078H000C7H,占,占50H=80个字节,以偶数地址个字节,以偶数地址开始开始CODE1:00100H0010CH,占,占0DH=13个字节,从个字节,从00H开始开始CODE2:00110H00143H,占,占34H=52个字节,从个字节
42、,从00H开始开始 382 2、 ASSUME伪指令伪指令在代码段中,还必须明确段和段寄存器的关系,这由在代码段中,还必须明确段和段寄存器的关系,这由ASSUME语句语句来指定。如来指定。如 ASSUME ASSUME CS:codeCS:code, , DS:dataDS:data, , ES:dataES:data 语句中的语句中的codecode和和datadata为段名。为段名。 这个语句说明:这个语句说明: CSCS将指向名字为将指向名字为codecode的代码段的代码段 DSDS和和ESES将指向名字为将指向名字为datadata的数据段的数据段但要注意但要注意, ,ASSUMEA
43、SSUME伪指令只是告知汇编程序有关段寄存器与段的关系伪指令只是告知汇编程序有关段寄存器与段的关系, ,并并没有给段寄存器赋予实际的初值。故下面的语句没有给段寄存器赋予实际的初值。故下面的语句 MOVMOV AX,DATA AX,DATA MOV MOV DS,AX DS,AX MOV MOV ES,AX ES,AX将段基址装入段寄存器将段基址装入段寄存器。如果程序中用到堆栈。如果程序中用到堆栈段,则段,则SS也需装入实际的初值。也需装入实际的初值。代码段基地址代码段基地址不需要程序员装入不需要程序员装入CS寄存器,而由寄存器,而由OS负责装入。负责装入。39例例1: CODE SEGMENT
44、1: CODE SEGMENT ASSUME CS:CODE,DS:DATA1,SS:STACKASSUME CS:CODE,DS:DATA1,SS:STACK MOV AX, DATA1 MOV AX, DATA1 MOV DS, AX MOV DS, AX MOV AX, STACK MOV AX, STACK MOV SS, AX MOV SS, AX CODE ENDS CODE ENDS40例例2: .DOSSEG2: .DOSSEG .MODEL SMALL .MODEL SMALL .STACK 100H .STACK 100H .DATA .DATAIVAR DB 5IVAR
45、DB 5IARRAY DW 50DUP(5)IARRAY DW 50DUP(5)STRING DB This is a stringSTRING DB This is a string .CODE.CODE413.3.5 3.3.5 过程定义伪指令过程定义伪指令PROCPROC、ENDPENDP 过程就是子程序。一个过程可以被其它程序所调用过程就是子程序。一个过程可以被其它程序所调用( (用用CALLCALL指令指令) ),过,过程的最后一条指令一般是返回指令程的最后一条指令一般是返回指令(RET)(RET)。 过程定义伪指令的格式为过程定义伪指令的格式为 PROCPROC NEAR/FAR
46、NEAR/FAR RET RET ENDPENDP 注意:注意:PROCPROC和和ENDPENDP必须成对出现。必须成对出现。调用调用NEARNEAR过程:先将过程:先将IPIP内容压入堆栈,再将入口地址传送到内容压入堆栈,再将入口地址传送到IPIP(SP)(SP)(SP)-2, (SP)+1:SP) (IP)42调用调用FARFAR过程:先将过程:先将CSCS内容压入堆栈,再将内容压入堆栈,再将IPIP内容压入堆栈,最后内容压入堆栈,最后将段地址送将段地址送CSCS,偏移地址送,偏移地址送IPIP(SP)(SP)(SP)-2, (SP)+1:SP) (CS);(SP)(SP)(SP)-2,
47、 (SP)+1:SP) (IP)(CS)(CS)SEG far_proc, (IP) (IP) OFFSET far_proc, 例:例:NAME1 PROC FARNAME1 PROC FAR CALL NAME2 CALL NAME2 RET RET NAME2 PROC NEAR NAME2 PROC NEAR . . RET RET NAME2 ENDP NAME2 ENDP NAME1 ENDP NAME1 ENDP 433.3.6 模块定义与连接伪操作模块定义与连接伪操作1、NAME 模块名模块名 ;NAME前面不允许加标号前面不允许加标号2、END 标号标号 ;END后面语句不予
48、处理后面语句不予处理3、PUBLIC 符号符号, ;说明某些符号是公共的;说明某些符号是公共的4、EXTRN 名字:类型名字:类型, 若为变量,类型可以是若为变量,类型可以是BYTE、WORD、DWORD例:例:EXTRN ALPHA:BYTE, BETA:WORD若为过程,类型可以是若为过程,类型可以是NEAR、FAR例:例:EXTRN SBRT:FAR若为数值,类型可以是若为数值,类型可以是ABS443.4 3.4 DOS系统功能调用介绍系统功能调用介绍 系统功能调用系统功能调用由由OSOS提供的一组实现特殊功能的子程序供程序员在提供的一组实现特殊功能的子程序供程序员在程序中调用,以减轻编
49、程工作量。程序中调用,以减轻编程工作量。 系统功能调用有两种,一种称为系统功能调用有两种,一种称为DOS功能调用,另一种称为功能调用,另一种称为BIOS功功能调用。能调用。 用户程序在调用这些系统服务程序时,不是用用户程序在调用这些系统服务程序时,不是用CALL命令,而是采用命令,而是采用软中断指令软中断指令INT n来实现来实现。n=5n=51FH,调用,调用BIOS中的服务程序;中的服务程序;n=20n=203FH,调用,调用DOS中的服务程序;中的服务程序; 在在DOS系统系统中,功能调用都是用软中断指令中,功能调用都是用软中断指令INT 21H来实现的。来实现的。45关于数据输入和输出
50、我们这里只讨论关于数据输入和输出我们这里只讨论键盘输入键盘输入和和显示输出显示输出,调用系统调用系统功能需要提供入口参数及所调用的功能号功能需要提供入口参数及所调用的功能号,调用结束返回结果。调用结束返回结果。461. 1. DOSDOS键盘功能调用键盘功能调用( (1) 1) 检查键盘状态检查键盘状态( (功能号功能号=0BH=0BH) ) MOV AH,0BHMOV AH,0BH INT 21H INT 21H例例1 1: LOOP: LOOP: MOV AH, OBHMOV AH, OBH INT 21H INT 21H INC AL INC AL JNE LOOP ; JNE LOOP
51、 ;无键入则循环无键入则循环LOOPLOOP RET ; RET ;有键入停止循环返回有键入停止循环返回 47( (2) 2) 单字符输入一个字符单字符输入一个字符( (功能号功能号=1=1) ) MOV AH,1MOV AH,1 INT 21H INT 21H AL 例例2: GET_KEY: 2: GET_KEY: MOV AH,1MOV AH,1; ;等待键入字符等待键入字符 INT 21HINT 21H; ;结果在结果在ALAL中中 CMP AL,Y CMP AL,Y ; ;是是Y?Y? JZ YES JZ YES; ;是是, ,转转YESYES CMP AL,N CMP AL,N ;
52、 ;是是N?N? JZ NO JZ NO; ;是是, ,转转NONO JMP GET_KEY JMP GET_KEY ; ;否则继续等待输入否则继续等待输入 YES: YES: NO: NO: 48( (3) 3) 输入字符串输入字符串( (功能号功能号=0AH=0AH) ) 此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。此功能调用从键盘输入一串字符并把它存入用户指定的缓冲区中。 MOV AH, 0AHMOV AH, 0AH LEA DX, LEA DX, INT 2 INT 21 1H H用户定义的输入字符串的缓冲区格式用户定义的输入字符串的缓冲区格式 (预留的预留的N1个字节的
53、存储单元个字节的存储单元) 0DHN2N1 N1: 缓冲区长度缓冲区长度(最大键入字符数最大键入字符数) N2: 实际键入的字符数实际键入的字符数(不包括回车符不包括回车符) 49例:例: DATA SEGMENT BUFSIZE DB 25 ACTCHAR DB ? CHARTEXT DB 25 DUP(?) DB $ CODE SEGMENT MOV DX, OFFSET BUFSIZE MOV AH,0AH INT 21H 50 若用户键入的字符数若用户键入的字符数( (包括回车包括回车) )定义的定义的N1, ,本功能调用将不再接本功能调用将不再接收新的键入,且光标不再向右移动。收新的
54、键入,且光标不再向右移动。例例2 2:设在数据段定义键盘缓冲区如下:设在数据段定义键盘缓冲区如下: STR1 DB 10,?,10 DUP(?) STR1 DB 10,?,10 DUP(?) 调用调用DOSDOS功能的功能的0AH0AH号功能的程序段为:号功能的程序段为: LEA DXLEA DX,STR1STR1 MOV AH MOV AH,0AH0AH INT 21H INT 21H 此程序段最多从键盘接收此程序段最多从键盘接收1010个按键(包括回车)。个按键(包括回车)。512. 2. DOSDOS显示功能调用显示功能调用(1) (1) 在显示器上显示一个字符在显示器上显示一个字符(
55、(功能号功能号=2=2) ) MOV AH, 2MOV AH, 2 MOV DL, MOV DL, INT 21H INT 21H 例:在显示器上显示一个字符例:在显示器上显示一个字符A MOV AH, 2 MOV AH, 2 MOV DL, MOV DL, A ; ;或或MOV DL,MOV DL, 41H41H INT 21H INT 21H(2)(2)显示字符串显示字符串( (功能号功能号=9=9) ) MOV AH, 9MOV AH, 9 LEA DX, LEA DX, INT 21H INT 21H ; ;注意:被显示的字符串必须以注意:被显示的字符串必须以$结束。结束。52附:附:
56、BIOS功能调用功能调用BIOS:基本输入输出系统,是固化在:基本输入输出系统,是固化在EPROM中的一组实现基本输入中的一组实现基本输入输出功能的子程序。输出功能的子程序。BIOS调用通过多个软中断提供,调用方法为调用通过多个软中断提供,调用方法为:MOV AH,INT BIOS中的几个主要中断类型如下:中的几个主要中断类型如下:INT 10H屏幕显示屏幕显示INT 13H磁盘操作磁盘操作INT 14H串行口操作串行口操作INT 16H键盘操作键盘操作INT 17H打印机操作打印机操作每类中断由包含许多子功能,调用时通过功能号指定。每类中断由包含许多子功能,调用时通过功能号指定。 BIOS功
57、能调用说明见附录。功能调用说明见附录。533.5 3.5 汇编语言程序设计举例汇编语言程序设计举例例例1:源数据区与目标数据区地址可能重叠的数据块传送:源数据区与目标数据区地址可能重叠的数据块传送图图3.15 源数据区与目标数据区地址重叠示意图源数据区与目标数据区地址重叠示意图54注注1:若源数据区的起始地址低于目:若源数据区的起始地址低于目标数据区的起始地址,应从高地址开标数据区的起始地址,应从高地址开始传送;否则应从低地址开始传送。始传送;否则应从低地址开始传送。注注2:数据块的长度在:数据块的长度在CX中。中。55CODE SEGMENT ASSUME CS:CODEBLK_MOV PR
58、OC FARSTART: PUSH DS ;DS压入堆栈压入堆栈 MOV AX, 0 PUSH AX ;AX压入堆栈压入堆栈 MOV AX, SI ;计算源数据区物理地址的高;计算源数据区物理地址的高16位位 SHR AX, 1 SHR AX, 1 SHR AX, 1 SHR AX, 1 ;AX内容右移内容右移4位位 MOV DX, DS ;段地址存入;段地址存入DX ADD AX, DX ;物理地址高;物理地址高16位存入位存入AX中中 MOV DS, AX ;结果送;结果送DS AND SI, 0FH ;源数据区物理地址低;源数据区物理地址低4位送位送SI56 MOV BX, DI ;计算
59、目标数据区物理地址的高;计算目标数据区物理地址的高16位位 SHR BX, 1 SHR BX, 1 SHR BX, 1 SHR BX, 1 ;BX内容右移内容右移4位位 MOV DX, ES ;段地址存入;段地址存入DX ADD BX, DX ;物理地址高;物理地址高16位存入位存入BX中中 MOV ES, BX ;结果送;结果送ES AND DI, 0FH ;源数据区物理地址低;源数据区物理地址低4位送位送DI CMP AX,BX ;比较;比较DS与与ES的高的高16位位 JA DOWN ;若;若DS高,则转移到高,则转移到DOWN JB UP ;若;若ES高,则转移到高,则转移到UP 57
60、 CMP SI,DI ;若相等,则比较低;若相等,则比较低4位地址位地址 JA DOWN ;若;若SI高,则转高,则转DOWN JB UP ;若;若DI高,则转高,则转UP JMP EXIT ;若相等,则无条件退出;若相等,则无条件退出UP: STD ;(DF)=1,从高地址开始传送,从高地址开始传送 MOV AX,CX ;将数据段长度送;将数据段长度送AX DEC AX ;AX减减1 ADD SI,AX ;(SI) (SI)+(AX) ADD DI,AX ;(DI) (DI)+(AX) JMP TRANS58DOWN: CLD ;(DF)=0,从低地址开始传送,从低地址开始传送TRANS:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业组织架构的未来趋势与挑战
- 文化产业发展中的政府角色定位与政策支持
- 幼儿早期教育与家园共育的融合策略
- 如何利用运动应对日常情绪挑战
- 水上工程中盘扣式浮动脚手架的设计与实施
- 建筑施工组织设计及实施方法
- 油气输送管道第三方施工安全交底细则
- 智慧医疗发展现状及未来趋势分析
- 工业自动化与人工智能的融合案例
- 提升远程项目管理效果的培训与教育
- 医院保安工作考核制度
- 男科疾病超声治疗应用指南
- 肿瘤终末期患者生活质量评估与提升方案
- 砌体墙体裂缝处理方案
- 扶贫致富电商培训课件
- 化州介绍教学课件
- 2026年全国中学生天文知识竞赛(中学组)经典试题及答案
- 药店课件教学课件
- 2025年高效能项目管理系统开发项目可行性研究报告
- 建筑项目施工安全检查表含整改措施
- 2026年安徽卫生健康职业学院单招职业技能考试题库及参考答案详解
评论
0/150
提交评论