高等教育:汇编语言程序设计第四章_第1页
高等教育:汇编语言程序设计第四章_第2页
高等教育:汇编语言程序设计第四章_第3页
高等教育:汇编语言程序设计第四章_第4页
高等教育:汇编语言程序设计第四章_第5页
免费预览已结束,剩余74页可下载查看

下载本文档

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

文档简介

1、第四章宏汇编语言伪指令汇编语言程序格式汇编语言程序上机过程汇编源程序的语句类型完整的源程序至少包含两类语句:1 指令性语句符号指令通知CPU进行某种操作的命令,由硬件完成相 应的功能;2指示性指令伪指令为汇编程序提供编译信息,为链接程序提供链 接信息,由软件完成.处理器选择伪操作.8086选择8086指令系统(缺省).286选择80286指令系统286P选择保护方式下的80286指令系统386选择80386指令系统386P选择保护方式下的80386指令系统.486选择80486指令系统486P选择保护方式下的80486指令系统586选择Pentium指令系统.586P述择保护方式下WPenti

2、um指令系统Segmentnamesegment 定位类型链接参数 r分类名 段长度Segment_name ends定位类型:通知琏接程序,逻辑段的目标代码在存储器中如何存放. 给出实际段起点的类型.可以是:PARA 指定段的起始地址必须从小段的边界开始。即段地址的起始地址能被16整除。(缺省)BYTE 该段可以从任何地址开始oWORD段必须从字(偶地址)的边界开始,段的起始地址能被2整除。PAGE该段必须从页的边界(256个字节)开始,即段地址的起始地址能为256整除。链接参数(combine_type):在模块化程序设计中表示该段 和其它同名段间的组合连接方法,若不指明组合类型,则 AS

3、M认为这个段是不准备与别的段相连接.PUBLIC该段连接时将与有相同名字的其他分段连接 在一起。其连接次序由连接命令指定。COMMON连接时与其他同名的分段具有相同的起始地址,所以会产生覆盖,连接后,段的长度等于 最长的COMMO N段的长度。AT expression使凌的赴始址址开始为表达式计算出来 的地址。但不能用来指定代码段。DATA SEGMENT AT 0040HORG 0017H KEYFLAG DB ?DATA ENDSSTACK指定该段运行时为堆栈的一部分,处理方式同 PUBLIC。分类名,:一长度不超过40个字符的字符串,连接时将相同类名 的各段在物理地址上相邻的连接在一起

4、,其顺序则与LINK时提供 的容癮块顺序一致.段长度:USE16段最大长度为64KB,访问时采用16位寻址USE32段最大长度可大于64KB,访问时采用32位寻址ASSUME伪指令IxH格式:ASSUME段寄存器:段名,段寄存器:段名 功能:通知汇编程序,寻址逻辑段使用哪一个段寄存器。 通常作为代码段的第一条指令.cir例:ASSUME CS: CODE, DS: DATA 注意:ASSUME伪指令只是约定了段寄存器与段的关系 不意味着汇编后这些段地址已经装入相应的段寄存器, 除CS外,各个段寄存器的实际值还需用MOV指令来赋值. SS可赋值,也可不赋值例:MOV AX,DATAMOV DS,

5、AX返回属性或数值的运算符求某个逻辑段/变量/标号的段基址运算符SEG格式:SEG段名例:MOV AX, SEG DATA ; AX=名为DATA逻辑段的段基址MOVDS, AX例:XYZ DW 1234H存储模型与简化段定义伪指令 MODEL伪操作简化的段定义伪操作-与简化段定义有关的预定义符号MODEL伪操作格式:MODEL MEMORY-MODEL5MODEL OPTIONSMEMORY-MODEL:用来说明在存储器中是如何安放各个 段的,也就是说明代码段在程序中如何安排,代码的寻 址是近还是远,数据段在程序中又是如何安排的,数据 的寻址是近还是远,根据它们的不同组合,可以建立7种 存储

6、模型。Tiny:所有的数据和代码都放在一个段内,其数据和代码都是 迸访间OSmall:所有的数据放在一个64KB的段内,所有的代码放在另 一个64KB的段内,数据和代码也都是近访问的。Medium:代码使用多个段,一般一个模块一个段,而数据则 合并为一个64KB的段组。数据是近访问的,代码是远访问 的。Compact:所有代码都放在一个64KB的代码段中,数据则放 在多个段内,形成代码是近访问的,而数据则可为远访问 的格式。Large:代码和数据都可用多个段,所以代码和数据都可远访Huge:与Large类型相同,其差别是允许数据段的大小超过 64KB Flat:允许用户用32位偏移量,但DOS

7、下不允许使用这种模型,只能在OS/2下或其他保护模式的操作系统下使用。MODEL-OPTIONS:允许用户指定3种选项高级语言接口,操作系统,堆栈距离高级语言接口选项:指该汇编语言程序作为某一种高级语言 程序的过程而为该高级语言程序所调用时,应该用如C, BASIC, PASCAL, FORTRAN等来力口以说明。操作系统选项:说明程序运行于哪一个操作系统之下,可用 OS-DOS或OS-OS2来说明,缺省项为OS-DOSo堆栈距离选项:可用NEARSTACK或FARSTACK来说明,NEARSTACK:把堆栈段和数据段组合到一个DGROUP段 中,DS和SS均指向DGROUP段。FARSTAC

8、K:把堆栈段和数据段并不合并。当存储模型为TINY, SMALL, MEDIUM和FLAT时,缺省项 为NEARSTACK,当存储模型为COMPACT, LARGE和 HUGE时,缺省项为FARSTACK。例:MODEL LARGE,PASCALQS-DOS,FARSTACK汇编给出的标准段.code.initialized data.uninitialized data.far initialized data.far uninitialized data .con stants.stack堆栈段初始化数据段未初始化数据段 远初始化数据段 远未初始化数据段常数段堆栈段.CODEname对于一

9、个代码段的模型,段名为可选项,对于多个 代码段的模型,则应为每个代码段指定段名。.DATA.DATA?.FARDATAname可指定段名,如不指定,则将以FAR-DATA命 名.FARDATA?name可指定段名,如不指定,则将以FAR-BSS命 名.CONST.STACKsize可指定堆栈段大小,如不指定,则缺省值为1KB。注意:当使用简化段伪操作时,必须在这些简化段伪操作出现之前, 即程序的一开始先用.MODEL伪操作定义存储模型,然后再用 简化段伪操作定义段。每一个新段的开始就是上一个段的结束, 而不必用ENDS作为段的结束符。与简化段定义有关的预定义符号model以数值表示当前所用的存

10、储模型Tiny=1 Small 或 flat=2 Compact=3 Medium=4 Large=5 Huge=6rnrcode由.code伪操作定义的段名或段组名 codesize以数值表示当前代码段情况在指定的存储模型中,只有一个代码段 (tiny,small,compact,flat)时,此值为0,其他 有多个代码段的情况下,此值为1。data由.data伪操作定义的段名,或由.data,.data?,.const和.stack所定义的段组名。 datasize以数值表示当前数据段情况在指定的存储模型中,只有一个数据 段(tiny,small,compact,flat)时,此值为0,有

11、 套个数竊段的compact和large时,此值知。有 多个数据段且有超过64KB的大数据段的HUGE时, 此值为2。与简化段定义有关的预定义符号 fardata由.fardata伪操作定义的段名 fardata?由.fardata?伪操作定义的段名 curseg当前段名stack堆栈段的段名或段组名 filecur当前文件名(包括扩展名) filename当前文件名(不包括扩展名) wordsize表明段为16位还是32位的数值回送符,如为16位,则回送2;如为32位,贝!|回送4。例:用.data定义数据段mov ax,data mov ds,ax用MODEL定义存储模型时的段缺省属性P1

12、40 表,Start:mov ax,(g)datamov ds,axmov ax,4c00h int 21 hend stamodel small stack 100h constdata.codeStart:mov ax,DGROUP mov ds,axmov ax,4c00h int 21 h end start *例4.4.model small .fardata .const.codeStart:mov ax,data mov ds,ax mov ax,fardata mov es,ax assume es:fardatamov ax,4c00h int 21 h段组定义伪指令grpn

13、ame GROUP segname,segname. grpname:段组 名Segname:段名加片 矽Dsegl segment word public data,Dsegl endsDseg2 segment word public datDseg2 endsDatagroup group dsegl ,dseg2 Cseg segment para public code assume cs:cseg,ds:datagroupStartzmov ax,datagroup mov ds,axmov ax,4c00h int 21 hCseg endsend start1、程序的开始和结束

14、END在模块化程序中,子模块结束2、END label程序的结束label指定程序第一条要运行的指令的地址。表明主程序的结束为模块命名 module-name 2.title text指定列表文件的每一页上打印的标题。同时,如果程序中没有name伪操作,则汇编程序将用text中的 前6个字符作为模块名。Text最多可有6 0个字符。如果无name和title,则将用源文件名作为模块名。 所以name和title并不是必须的,但一般经常使用 title,以便在列表文件中能打印出标题来。.startup定义程序的初始入口点,并产生设置DS, ss, SP的代码,如果程序中使用 了.st

15、artup,则结束程序的END伪操作中不 必再指定程序的入口点标号。exii Neiulrbvace recm.va-ue褊回黑请洱3厭貳迪0命 滋岚回画。例:.model small.datacode startup.exit 0 end 立即数:经汇编后转换成等值的二进制补码。 如:12, 0A8H, 10100000B, 34Q, - 2 字符串常数:经汇编后转换成相应的ASCII码。 如:A,P10,3;DL=31H用伪指令EQU或定义。EQU 552F8H例:MOV DL, 符号常数-例:COUNTPOINTER =MOVMOVCL,DX,COUNT ; CL=55 POINTER

16、; DX=2H8H数值运算符算术运算符有: 除,即取余)+、一、*、/、MOD (摸例:MOV AX, 8+5;汇编时完成运算,其值若出界给出错误信息,;AX=1NOT:按位取反例:MOVAL=01101100BAND:按位相与 例:MOVOR:按位相或例:MOVXOR:按位异或例:MOVAL=OFFHAL , NOT 10010011B;AL, 37H AND OFH ;AL=07HAL, 7 OR 30H ;AL=37HAL50AAH XOR 55H;HIGH:截取高8位 例:MOVLOW:截取低8位 例:MOVHIGHWORDAH, HIGH BX;BHAHAL, LOW BXLAL运算

17、 符格式说明例EQX EQ YX = Y为“真”MOV AX, XEQ 5;若 X=5 则 AX=0FFFFH 否则AX=0HNEX NE YXY为“真”MOV BL, X NE 25LEX LE YXY为“真”MOV DI, X GE 07HLTX LT YXY为“真”MOV DL, X GT 25注:关系运算符为“真”时,结果为“一1”(即全1),否则gWWM MMBBT M WMB HMMJMtt MM MB.M1 rr- w关系运算符标号和变量又称符号地址标号一代表指令地址,定义在代码段,为转移指令提供目标。变量一代表内存操作数的存储地址,或者说变量名就代表某个单元。定义在 DS, E

18、S, SS段。命名规则:不能用保留字、仅能使用给定集合的符号、不能用数字打头、最长 不超过31个字符。标号和变量的3个属性I段属性:其所在的段基址,用SEG运算符可算出。 偏移属性:用OFFSET运算符可算出其有效地址。 类型属性:变量的类型有:字节型:用DB伪指令定义 符.hl双字型:用DD伪指令定义四字型:用DQ伪指令定义字型:用DW伪指令定义使用时,可用PTR运算三字型:用DF伪指令定义五字型:用DT伪指令定义标号的类型有:器衆 蕊驚1勰蠶諜聽琵地址圣标号的定义定义类型为NEAR的标号(1) 隐含定义:在标号名后加冒号,放在指令前例:L1:MOVAX,BX(2) 显式定义:标号名LABE

19、L标号属性标号名EQU THIS标号属性例:L2 LABEL NEAR MOV CX,5L3 EQU THIS FAR MOV BXJ234H注意:同一条指令处可定义两个类型属性不同的标号例:L6 LABEL FARL7:XORAX,OFOFH数据定义及存储器分配格式:Vniiable Mnemonic Operand,. ;Comments解释:Variable又称为变量,是可以省略的。用于 襄示符号地址。Comments注释字段用来说明该为操作的功能, 是可以省略的。Mnemonic助记符用来说明所用伪操作的助记 符。有以下几种:DB用于定义字节,其后的每个操作符都占用一个字节 DW用于定

20、义字,其后的每个操作符都占用一个字 DD用于定义双字,其后的每个操作符都占用两个字 DQ用于定义四个字,其后的每个操作符都占用四个字 DT用于定义十个字节,其后的每个操作符都占用十个 字节,形成压缩的BCD码。数据定义的例子1操作数可以是常数或表达式。DatabyteDate_wordData dwdb dw dd10A10H 100,100h, 5 3*20,0fffdh存储器中的分配形式如何? ?DATA BYTEDATA WORDDATA DWOA041064000001FBFF3C000000FDFF0000厂r 数据定义例子41、操作数可以是字符串Message db “HELLO2

21、、操作数是“?,可以保留存储空间,但不存入数据。ABC DBDFF DW ?,52,?3、操作数字段可以使用复制操作符DUP 格式:repeat_count DUP (operandoperand) Repeat_count可以是一个正靈数,或表达式用来 指定括号中的操作数的重复次数。ARRAY DB 2DUP(0,l,2,?)4、DUP可以嵌套使用。ARRAYDB 100 DUP(0,2 DUP(l,2),0,3)可以存入符号地址的偏移地址或整个地址1、DW存入偏移地址2、DD存入16位段地址和16位偏移地址3、DF存入16位段地址和32位偏移地址DWPARIDWPAR2DWPAR3DDDA

22、TA1DFDATA2INTERSEG DATAPARAMETER TABLE变量在内存区中的存放情况定义变量的伪指令功能是在变量名所对应的地址开始的内存区依次存入各项值当同时有几个变量定义语句时,将按照由上到下的书写顺序,由低地址到高地址给每个变量语句中 的表达式分配存储单元在芮荐奁中分配菌浚 始存放DATA1 DB 20HDATA2 DW 0204H,100HDATA3 DB (-1*3),(15/3)DATA4 DD 12345HDATA5 DB 0123,DATA6 DW ABTCTD,DATA7 DB ?DATA8 DD ?DATA9 DB 5 DUP(OO)DATA10 DW 3 D

23、UP(?)例澜读以下程序,写出指令执行后的目标操作数 数据段:ORG 1000HNUM1 DB 12H,34H,56H,78H,90HNUM2 DW 1122H,3344H,5566HNUM3 DD 13572468H,87654321HNUM4 DW NUM1代码段:MOV AX.SEG数据段段名MOV DS,AXMOV BL,NUM1MOV BX,NUM2+2MOV BL,BYTE PTR NUM3MOV BX.WORD PTR NUM1+1MOV BL,NUM12*2MOV BX,NUM24MOV BX,WORD PTR NUM33MOV BX,3MOV BL,NUM1BXMOV SI,

24、OFFSET NUM1MOV BXJSI+1NEAR (近) FAR (远)PTR转移地址标号/过程名PTR运算符j .格式:类型的说明符 PTR地址表达式BYTE (字节)WORD (字) PTR内存操作数的5种寻址之一 DWORD (双字)修改类型属性的运算符运算符格式:name LABEL Type 对于变量Type = BYTE WORD DWORD 对于标号Type =FAR NEAR BYTE_ARRAY LABEL BYTE WORD_ARRAY LABEL FAR返回属性或数值的运算符取变量/标号的偏移地址运算符OFFSET式:OFFSET变量名或标号例:MOV BX, OFF

25、SET XYZ返回变量或标号的类型TYPE格式:TYPE变量/标号返回变量类型:字节=1 ,字=2 ,双字=4 ;返回标号类型:NEAR=1, FAR = - 2 o地址计数器常见用法地址计数器nr-在汇编程序对源程序汇编的过程中,使用地址计数器来保 存当前正在汇编的指令的地址地址计数器的值可用$来 表示,汇编语言允许用户直接用$来引用地址计数器的值.例 1 JNE $+6例 2. ARRAY DW 1,2,$+4,3,4,$+4,设汇编时 ARRAY 分配的偏移地址为0074H,试画出ARRAY变量的内存分配图.紧跟在DB, DW,伪指令之后,统计出分配给某个变量的单元数。例:XYZ DW

26、1234H, 5678HCOUNT EQU $-XYZ ; COUNT=4LENGTH操作符格式:LENGTH Variable对于DUP定义的变量,返回分配的单元数。其他 返回1。例如:FEES DW 100 DUP(?) ARRAY DW 1,2,3MOV CX,LENGTH FEESMOV CX,LENGTH ARRAY编译后:MOV CXJOOMOV CX,1SIZE格式:SIZE Variable汇编程序返回分配给该变量的字节数。值等于TYPE和LENGTH的乘积。ORG伪指令设置当前地址计数器的值格式:ORG constant expression 例:VECTORS SEGMENTORG 10VECT1 DW 47A5HORG 20VECT2 DW 0C596HVECTORS ENDSEVEN伪操作EVEN使下一个字节地址成为偶数。 格式:EVEN例如:DATA segmentevenword_arraydw 100 dup(?)DATAendsALIGN伪操作保证双字数组边界从4的倍数开始创造了条件. 格式:ALIGN boundary其中boundary必须是2的壽例:DATA SEGMENTALIGN 4ARRAY DB 100 D

温馨提示

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

评论

0/150

提交评论