《汇编语言优秀课件》由会员分享,可在线阅读,更多相关《汇编语言优秀课件(77页珍藏版)》请在金锄头文库上搜索。
1、汇编语言程序设计南京工业大学2017春任课教师:管昕洁2021/3/291第四章汇编语言程序结构汇编语言程序的基本结构汇编语言的数据运算符与表达式伪指令2021/3/292汇编语言程序的基本结构汇编程序的基本框架汇编语言的指令格式2021/3/293汇编程序的基本框架完整段定义框架简化段定义框架2021/3/294完整段定义框架完整段定义框架STACKSEGMENT;定义堆栈段STACKENDSDATASEGMENT;定义数据段DATAENDSCODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACK;说明代码段的段地址放在CS中;数据段的段地址放在DS中;
2、堆栈段的段地址放在SS中START:MOVAX,DATAMOVDS,AX;数据段段地址送DS中;程序MOVAX,4C00H;程序结束返回DOSINT21HCODEENDS;代码段结束ENDSTART2021/3/295简化段定义框架MODELSMALL386STACK;堆栈段DATA;数据段CODE;代码段STARTUP;程序EXIT;返回DOSEND2021/3/296【例例4-1】设设 X,Y,Z为为16位位带带符符号号的的字字变变量量,计计算算(X+125-X*Y)/Z后将商存入后将商存入X,余数存入,余数存入Y中。中。STACKSEGMENT;定义堆栈段;定义堆栈段DW100HDUP(
3、?)(?)STACKENDSDATASEGMENT;定义数据段;定义数据段XDW3YDW4ZDW10DATAENDSCODESEGMENT;定义代码段;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACK;START:MOVAX,DATAMOVDS,AX;数据段段地址送;数据段段地址送DS中中MOVAX,X;乘数;乘数XAXIMULY;XYDX:AXMOVCX,AXMOVBX,DX;结果再存放到;结果再存放到BX:CX中暂存中暂存MOVAX,X;XAXADDAX,125;X+125AXCWD;将;将AX转换成双字转换成双字DX:AXSUBAX,CX;低;低16位减法位减法SB
4、BDX,BX;高;高16位减法,位减法,X+125-XYDX:AXIDIVZ;(;(X+125-XY)Z,商,商AX,余数,余数DXMOVX,AX;商;商XMOVY,DX;余数;余数YMOVAX,4C00H;程序结束返回;程序结束返回DOSINT21HCODEENDS;代码段结束;代码段结束ENDSTART2021/3/297MODELSMALL;选择编程模式为小模式;选择编程模式为小模式386;选择;选择80386指令系统指令系统STACK;堆栈段;堆栈段DW100HDUP(?)(?)DATA;数据段;数据段XDW3YDW4ZDW10CODE;代码段;代码段STARTUPMOVAX,X;乘数
5、;乘数XAXIMULY;XYDX:AXMOVCX,AX;MOVBX,DX;结果再存放到;结果再存放到BX:CX中暂存中暂存MOVAX,X;XAXADDAX,125;X+125AXCWD;将;将AX转换成双字转换成双字DX:AXSUBAX,CX;低;低16位减法位减法SBBDX,BX;高;高16位减法,位减法,X+125-XYDX:AXIDIVZ;(;(X+125-XY)Z,商,商AX,余数,余数DXMOVX,AX;商;商XMOVY,DX;余数;余数YEXIT;返回;返回DOSEND2021/3/298汇编语言的指令格式汇编语言程序中的指令可以分为指令、伪指令两种。指令的格式标号:操作码操作数;
6、注释方括号中的内容根据程序或指令的要求可有可无。标号由26个大小写英文字母、09数字、(下划线)、$、?等字符组成,数字不能出现在标号的第一个字符位置,后跟“:”。操作码汇编指令的助记符(关键字),一条汇编指令必须有唯一的操作码,指出该指令的操作内容。操作数为操作提供必要的数据信息。注释表示对该条指令的说明,可写可不写,如果有注释则必须在注释前加分号。2021/3/299汇编语言的指令格式伪指令格式名字名字伪指令助记符伪指令助记符操作数操作数;注释;注释方括号中的内容根据程序或指令的要求可有可无名字是该语句的符号地址,后不跟后不跟“:”伪指令助记符(伪操作符)给出该伪指令的操作内容操作数为操作
7、提供必要的信息名字:变量名、过程名、段名、常量名等名字和标号都具有三个属性:段基址、偏移量和类型标号的类型:NEAR型和FAR型变量的类型:字节、字、双字、四字等2021/3/2910汇编语言的数据常量变量标号变量定义时用到的操作符和表达式2021/3/2911常量汇编语言的常数主要包括整数、字符、字符串、符号常量与数值表达式等整数整数包括:二进制、八进制、十六进制、十进制表示的整数,如 :011000101B、 7654Q、 0ABCDH、 32768D( 或32768)在指令中把二进制、八进制、十六进制、十进制表示的整数叫做立即数字符与字符串字符与字符串必须用单引号或双引号括起来。例如:“
8、A”为字符常量,“AAA”为字符串常量2021/3/2912常量符号常量符号常量是用赋值伪指令EQU定义的符号名赋值伪指令的格式:常量名EQU表达式例如:XEQU100;X为符号常量,在程序中X为100,X是一个常量。数值表达式以常数(立即数)或符号地址(变量、标号等)作为操作数的地方,均可使用数值表达式。2021/3/2913变量变量的一般格式:变量名助记符操作数;注释其中:变量名是一个非保留字的标识符,可有可无助记符指定变量的长度,如P99表4-1所示操作数可以是数字常量、字符常量、字符串常量、符号常量、数值表达式、地址表达式、?、nDUP操作数等可以包含0个、一个或多个操作数,多个操作数
9、之间以逗号(,)分隔2021/3/2914变量标识符标识符包括:标号、变量名、子程序名和宏名等标识符的使用原则:由31个字母、数字及规定的特殊字符(?、$)等组成不区分标识符中字母的大小写不能以数字开头不能单独使用$或?不能是系统的保留字,如指令名、寄存器名和伪指令名等例如,_DATA1、LOP、STAR、count是合法的标识符ADD、EAX、MOV、6X是不合法的又如:FFFFH是标识符,0FFFFH是十六进制数值2021/3/2915变量【例4-2】操作数可以是数字常量或是数值表达式。X1DB10,0,10HX2DW?,100,5X3DD5*20+5,0ABCDEF68H2021/3/2
10、916变量【例4-3】操作数可以是字符常量或字符串常量:C1DBHELLO,$C2DBAC3DB“AB”C4DW“AB”;注意C3和C4的区别下图列出了本例在内存中的存储分配结构(P101图4-3,图4-4):2021/3/2917变量的属性变量具有三个属性:段属性变量的段属性是指变量所在段的段地址。偏移属性变量的偏移属性是指变量所在段的首地址到该变量的偏移量。例P100图4-2:X1和X2的偏移地址分别为0000H和0003H。类型属性变量的类型属性是指存取该变量中的数据所对应的字节数有字节(BYTE)、字(WORD)、双字(DWORD)等2021/3/2918变量定义时用到的操作符和表达式
11、当前位置计数器($)当前位置计数器($)表示当前的偏移值【例4-4】下列指令是在数据段中定义的,画出其内存中的存储结构,并计算出符号常量LEN1和LEN2的值。X1DB1,2,3,5LEN1EQU$-X1X2DW1234HLEN2EQU$-X2假设X1地址为2000H,LEN为符号常量,不占存储空间,X2为字变量,则X2的地址为2004H。LEN1的值是$-X1=2004H-2000H=0004H,数组X1的长度为4字节。LEN2的值是$-X2=2006H-2004H=0002H,变量X2的长度为2字节。2021/3/2919设置内存空间表达式(?)“?”表示没有为该存储空间赋初值,汇编后该存
12、储空间清零。例如:X3DB1,?,?,?,2X4DW?,1234H,?【例4-5】用一个完整的程序完成上述定义。MODELSMALL386STACKDATA;数据段X1DB1,2,3,5LEN1EQU$-X1X2DW1234HLEN2EQU$-X2X3DB1,?,?,?,2LEN3EQU$-X3X4DW?,1234H,?LEN4EQU$-X4CODE;代码段STARTUPMOVAX,LEN1MOVBX,LEN2MOVCX,LEN3MOVDX,LEN4EXITEND2021/3/2920重复定义操作符(DUP)用于定义重复的元素【例4-7】ARRAY1DB2DUP(1,2,2,?)ARRAY2D
13、B50DUP(?)如图4-8【例4-8】DUP可以嵌套ARRAY3DB2DUP(0,2DUP(1,2),3)ARRAY3的长度为12个字节,该伪指令的存储结构如图4-9所示图图4-94-9图图4-84-82021/3/2921使用地址表达式作为DW或DD的操作数地址包括:数据段中定义的变量名或数组名,代码段中的标号或子程序名【例4-9】设LOP为代码段的一个标号,MAX为代码段中的某一子程序名,则在数据段中有如下定义:X1DW1234H;定义字变量X1,并赋初值1234HX2DWX1;定义字变量X2,所赋初值是变量X1的偏移地址X3DDX1;定义双字变量X3,所赋初值是变量X1的逻辑地址X4D
14、WLOP;LOP偏移地址X5DDLOP;LOP逻辑地址X6DWMAX;MAX偏移地址X7DDMAX;MAX逻辑地址X8DW$;定义字变量X8,所赋初值是X8的偏移地址(当前地址)2021/3/2922练习给出如下程序中的数据定义,问PLENTH的值为多少?它表示什么意义?PARTNODW?PNAMEDB16DUP(?)COUNTDD?PLENTHEQU$-PARTNO答:PLENTH=22=16H,它表示变量PARTNO、PNAME、COUNT总共占用的存储单元数(字节数)2021/3/2923标号标号是用来说明可执行指令在汇编语言程序中的位置例如:LP1:MOVAX,XLOOPLP1;转移到
15、标号LP1处的指令2021/3/2924标号标号三个属性:标号的段属性标号的段属性是指标号定义所在段的段地址。标号的偏移属性标号的偏移属性是指标号所在段的首地址到该标号的定义语句的偏移量。标号的类型属性标号的类型属性是指标号距转移指令的距离,是转移到本段内的标号,还是转移到其它段的标号。(即是NEAR还是FAR).2021/3/2925运算符与表达式算术运算符逻辑运算符关系运算符数值回送操作符属性操作符(PTR、:、THIS、SHORT、HIGH、LOW)移位运算符运算符的优先级2021/3/2926算术运算符算术运算符包括:+、*、/、MOD(取余)。运算符MOD是作除法操作,取余数,如:1
16、0MOD3=1。需要注意的问题:算术运算符可以用于数值表达式或地址表达式中,参加运算的数和结果必须是整数,除法运算结果只有商无余数当算术运算符用于地址表达式时,常用方法是“地址常量”来描述指针的移动2021/3/2927【例4-10】把首地址为BLOCK的字数组的第5个字送到AX中:MOVAX,BLOCK+(51)*2【例4-11】将数组长度(双字数)存到CX中:ARRAYDD1,2,3,4,5,6,7COUNTDD?MOVCX,(COUNTARRAY)/4假设数组ARRAY的地址是2000H,则COUNT=201CH(COUNTARRAY)/4=(201CH2000H)/4=0007H202
17、1/3/2928逻辑运算符包括:AND(逻辑与)、OR(逻辑或)、XOR(逻辑异或)、NOT(逻辑非)。【例4-12】执行下列指令,计算其逻辑运算的值。MOVAL,88HAND0FH;AL=08HMOVBL,88HOR0FH;BL=8FHMOVCL,88HXOR0FH;CL=87HMOVDL,NOT88H;DL=77HANDAL,88HAND0FH;两个AND是有区别的。注意注意:逻辑运算符与逻辑指令的区别。逻辑运算符在汇编程序汇编逻辑运算符与逻辑指令的区别。逻辑运算符在汇编程序汇编时计算,而逻辑指令在程序运行时执行。时计算,而逻辑指令在程序运行时执行。2021/3/2929关系运算符包括:E
18、Q(等于)NE(不等于)LT(小于)LE(小于等于)GT(大于)GE(大于等于)关系运算符的使用格式:表达式1关系运算符表达式2计算结果:真为全1,假为全0。2021/3/2930关系运算符【例4-13】MOVAX,(XLT10)AND0F0FH)OR(XGE10)AND0505H)该指令说明:当X=10做MOVAX,0505H2021/3/2931数值回送操作符包括:SEG、OFFSET、TYPE、LENGTH、SIZESEG(取段地址)操作符格式:SEG变量名/标号操作符功能:取变量或标号的段基值(段地址)OFFSET(取偏移地址)操作符格式:OFFSET变量名/标号功能:取变量或标号的偏
19、移值(偏移地址)TYPE(取类型值)操作符格式:TYPE变量名/标号功能:取变量或标号的类型值。(字节=1、字=2、双字=4等,NEAR=-1,FAR=-2)2021/3/2932数值回送操作符LENGTH(取长度)操作符格式:LENGTH变量名功能:取分配给变量的字节、字、双字等的个数(说明:只有用DUP重复定义的变量才有意义,否则=1。)SIZE(取总字节数)操作符格式:SIZE变量名操作符功能:SIZE给出一个变量的总字节数(也就是LENGTH和TYPE的乘积),即:SIZE=LENGTHTYPE2021/3/2933【例4-17】用一个完整的程序完成TYPE、LENGTH、SIZE的应
20、用MODELSMALL386STACKDATA;数据段X1DW100DUP(2);共定义200个字节X2DD2DUP(8,3DUP(0);共定义32个字节X4DW4,5,6DUP(A);共定义16个字节CODE;代码段STARTUPMOVAX,TYPEX1;AX=2MOVAX,TYPEX2;AX=4MOVAX,TYPEX4;AX=2MOVAX,LENGTHX1;AX=100=64HMOVAX,LENGTHX2;AX=2MOVAX,LENGTHX4;AX=1MOVAX,SIZEX1;AX=2*100=200=0C8HMOVAX,SIZEX2;AX=4*2=8MOVAX,SIZEX4;AX=2*1
21、=2EXITEND2021/3/2934属性操作符包括:PTR、:、THIS、SHORT、HIGH、LOWPTR(改变变量或标号类型操作符)操作符格式:类型PTR地址表达式其中类型:BYTE、WORD、DWORD、FAR、NEAR。地址表达式:表示(变量或标号)地址的数值。变量:用变量名给出的有效地址。标号:指令的有效地址。操作符功能:临时指定变量或标号的操作类型2021/3/2935【例4-18】PTR操作符的应用。在数据段定义:XDBAYDW1234HZDD12345678H在代码段中:MOVAX,Y;类型匹配,正确此时AX=1234HMOVBL,BYTEPTRY;用PTR取出Y变量中的一
22、个字节,BL=34HM0VCL,BYTEPTRY+1;用PTR取出Y变量中的一个字节,CL=12HMOVDL,BYTEPTRZ+3;将Z+3所指的字节内容送DL中,DL=12H2021/3/2936【例4-19】PTR操作符的应用。在数据段定义:X2DW?;X2为字变量X1EQUBYTEPTRX2;将X2的地址赋给X1,X1为字节变量X3EQUBYTEPTR(X2+1);将X2+1的地址赋X3,X3为字节变量X3EQUX1+1;将X1+1的地址赋给X3,X3仍为字节变量内存中安排见P109图4-10。说明:同一个单元可有两个变量名,一个是字的属性(如说明:同一个单元可有两个变量名,一个是字的属
23、性(如X2),),另一个是字节的属性(如另一个是字节的属性(如X1)。可根据需要选用不同的变量。)。可根据需要选用不同的变量。2021/3/2937:(修改段操作符)操作符格式:段寄存器:变量/标号/地址表达式其中段寄存器:CS、DS、ES、SS。操作符功能:用段修改操作符来修改一个变量、标号或地址表达式的段属性(段超越)。2021/3/2938【例4-20】操作符的应用。MOVAX,ES:BX+SI;基址加变址寻址,隐含的段寄存器是DSMOVEAX,GS:DWORDPTRBX;寄存器间接寻址,隐含段寄存器是DS改为GS【例4-21】操作符的应用。DATAXDW?CODEMOVAX,CS:X2
24、021/3/2939THIS(指定类型操作符)操作符格式:变量名/标号/过程名THIS类型操作符功能:为某一个变量名指定一个类型(BYTE、WORD、DWORD、QWORD、FWORD、TWORD、)或为某一个标号或过程指定一种转移距离(NEAR,FAR)。同时指定该操作数地址与下一个存储单元地址相同。2021/3/2940【例4-22】THIS操作符的应用。VAR1EQUTHISBYTE;指定VAR1为字节常量VAR2DW?;VAR1为字节(BYTE)常量,VAR2为字(WORD)变量。经过上述定义后;MOVAL,VAR1MOVAX,VAR2【例4-23】THIS操作符的应用。CODELOP
25、1EQUTHISFARLOP1:DECCX2021/3/2941SHORT(短转移操作符)操作符格式:SHORT标号操作符功能:短转移操作符是用来指定JMP指令中转向地址为8位位移量,而不是在缺省时的16位位移量。标号为转移偏移值,该偏移值为-128+127字节,则JMP转移范围为IP+(-128+127)2021/3/2942HIGH(取高位字节)和LOW(取低位字节)操作符操作符格式:HIGH/LOW数值表达式/符号常量操作符功能:取数值表达式或符号常量的高位字节或低位字节,不能作用于内存操作数【例4-24】字节分离操作符的应用。CONSTEQU0ABCDHMOVAH,HIGHCONST;
26、AH=ABHMOVAL,LOWCONST;AL=CDH2021/3/2943移位运算符移位运算符SHL和SHR,是按位运算的,只用于数值表达式中。运算符格式:常量SHL/SHR位数运算符功能:将运算符左边的二进制数左移或右移运算符右边的所指定的移位位数,空出的位补0。当移位位数大于15,则结果为0。如:MOVAX,41HSHL2;将41H左移2位,结果送AX寄存器中,AX=104H。2021/3/2944运算符的优先级运算规则仍为先计算优先级高的运算符同级运算符自左向右进行计算优先级运算符1(最高)LENGTH、SIZE 、()、 (记录中)、(结构中)2PTR、OFFSET、SEG、TYPE
27、、THIS、段操作符:3HIGH、LOW(字节分离操作符)4*、 、MOD 、SHL、SHR5、6 EQ、NE、LT、LE、GT、GE7NOT8AND9OR、 XOR10(最低)SHORT2021/3/2945伪指令完整段定义伪指令(SEGMENT、ENDS、ASSUME)处理器选择伪指令简化段定义伪指令定位伪指令ORG赋值伪指令(EQU、=)LABEL伪指令对准伪指令(EVEN)标题伪指令2021/3/2946完整段定义伪指令(SEGMENT、ENDS、ASSUME)段定义伪指令(SEGMENT、ENDS)格式:段名SEGMENT对齐类型组合类型使用类型类别名段名ENDS功能:定义逻辑段,S
28、EGMENT表示某个逻辑段开始,ENDS表示该逻辑段结束。其中:段名自定义。4个选项可选可不选,有可选项时各项顺序不能错,可选项之间用空格隔开。2021/3/2947对齐类型表表示示当当前前段段的的起起始始边边界界要要求求。即即定定义义了了当当前前段段在在内内存存中中起起始始边边界界的的设设定定,说说明明了了段段与与段段之之间间的的空空隙隙。对对齐齐类类型型可可以以是是:PAGE(页页)、PARA(节节)、WORD(字字)、BYTE(字字节节)、DWORD(双字双字)。PAGE(页页)设设该该段段的的起起始始地地址址的的低低8位位为为”0”。该该地地址址是是可可以以被被256整整除除的的地地址
29、址,1页页为为256字字节节,当当对对齐齐类类型型为为PAGE时时,说说明明该该段段从从页页的的边边界界开开始始,该该段段与与下下一一段段的的最最大大存存储储空空间间为为256字字节节,假假如如在在该该段段中中只只放放一一个个字字节节的的数数据据,则则该段距下一个段的空隙为该段距下一个段的空隙为255个字节。个字节。PARA(节节)设设段段的的起起始始地地址址的的低低4位位为为”0”。该该地地址址是是可可以以被被16整整除除的的地地址址,1节节为为16字字节节,当当对对齐齐类类型型为为PARA时时,说说明明该该段段从从节节的的边边界界开开始始,该该段段与与下下一一段段的的最最大大存存储储空空间
30、间为为16字字节节,假假如如在在该该段段中中只只放放一一个个字字节节的的数数据据,则则该该段段距距下下一一个个段段的的空空隙隙为为15个个字字节节。对对齐齐类类型型缺缺省省时时,隐隐含含PARA(节的边界节的边界)。2021/3/2948对齐类型WORD(字)表示本段的起始地址(段基地址)以偶地址开始。段与段之间最大空间为1个字,最大空隙为1字节。BYTE(字节)表示本段的起始地址可以从字节地址开始(任意地址)。段与段之间最大空间为1字节,段与段之间无任何空隙。DWORD(双字)表示本段的起始地址是可以被4整除的地址。段与段之间最大空间为4个字,最大空隙为3字节。2021/3/2949组合类型
31、当程序有多个段时,用来说明段与段之间是怎样连接和定位的。共有六种组合类型:缺省PRIVATE:没有说明,汇编程序就认为本段不和别的段连接。PUBLIC:本段与同名段顺序连接,组成一个大的逻辑段,它们共用同一个段起始地址。COMMON:本段与同名段从同一地址开始重叠连接。段长是同名段中最长的段的长度,重叠部分的内容取决于排列在最后一段的内容。2021/3/2950组合类型STACK:表示该段是堆栈段的一部分。把所有相同类别名的具有STACK组合类型的段连接成一个连续段。将连续段首地址送SS,段内最大偏移地址送SP。当定义了STACK属性后,在主程序中可省略对SS和SP的初始化。MEMORY:表示
32、在N个互相连接的段中,本段的定位地址为最高地址,如果有多个MEMORY的段,则把第一个遇到的段当作MEMORY处理,其他均当作COMMON(重叠)处理。AT表达式:本段定位在表达式所表示的位置并且节对齐。如:S1SEGMENTPARAAT0A800H;表示本段段地址为0A800H并且节对齐2021/3/2951使用类型包括:USE16或USE32,用来说明使用16位寻址方式还是32位寻址方式,该使用类型用于386以上机型。缺省时隐含USE16在实模式下使用USE16,为16位寻址方式,则段长不超过64KB,其地址是由16位段地址和16位偏移地址组成2021/3/2952类别名在引号中给出相连接
33、的段名,完成把具有相同类名的段连接在一起。如:CODE1SEGMENTPARAPUBLICCODE;表示把所有的有CODE类别的段连接在一起。2021/3/2953指定段寄存器伪指令(指定段寄存器伪指令(ASSUME)格式:ASSUME段寄存器名:段名,段寄存器名:段名功能:告诉汇编程序,在运行期间通过哪个段寄存器才能找到所要的指令和数据。该指令放在程序的代码段中。如:ASSUMECS:CODE,ES:ESTRA,DS:DATA,SS:STACK说明:ASSUME仅明确段名与段寄存器的关系,但段寄存器中还没有段地址的数值,因此还必须用传送指令将段地址装入相应的段寄存器中。2021/3/2954
34、完整段定义源程序书写形式完整段定义源程序书写形式数据段名SEGMENT;数据段可有可无,也可多个用伪指令定义的数据空间数据段名ENDS堆栈段名SEGMENT;堆栈段可有可无,也可多个用伪指令定义的数据空间堆栈段名ENDS代码段名SEGMENT;代码段最少有一个ASSUME(定义寻址关系)起始标号:2021/3/2955完整段定义源程序书写形式完整段定义源程序书写形式MOVAX,数据段名MOVDS,AX;初始化DSMOVAX,堆栈段名MOVSS,AX;初始化SS过程名PROC过程名ENDP代码段名ENDSENDSTART;给出程序的起始地址说明:ASSUME仅明确段名与段寄存器的关系,但段寄存器
35、中还没有段地址的数值,因此还必须用传送指令将段地址装入相应的段寄存器中。2021/3/2956段寄存器的装入DS、ES 装入2021/3/2957【例4-25】设X为字节变量,是在数据段DATA1中定义的,Y是在另外一个数据段中定义的具有字节属性的符号地址,请将X变量的内容送Y数组的第6个元素中。DATA1SEGMENTXDB18HDATA1ENDSDATA2SEGMENTYDB10HDUP(?)DATA2ENDSCODESEGMENTASSUMECS:CODE,DS:DATA1,ES:DATA2START:MOVAX,DATA1MOVDS,AX;将DATA1段地址送DSMOVAX,DATA2
36、MOVES,AX;将DATA2段地址送ESMOVAL,X;AL=12HMOVES:Y5,AL;12HY+5单元中MOVAX,4C00H;返回DOS状态INT21HCODEENDSENDSTART2021/3/2958SS的装入(可省略,系统会自动分配一定的堆栈空间)方法1:STACK1SEGMENTPARASTACKDB50HDUP(?)STACK1ENDSCODESEGMENTASSUMECS:CODE,SS:STACK1当目标代码装入存储器后,SS中已自动装入STACK段的段基值,堆栈指针SP指向堆栈的底部+1的存储单元,则:SP=4FH+1=50H。2021/3/2959SS的装入方法2
37、:STACK1SEGMENTPARADW50HDUP(?)TOPLABELWORD;TOP属性为WORDSTACK1ENDSCODESEGMENTASSUMECS:CODE,SS:STACK1START:MOVAX,STACK1MOVSS,AX;堆栈段的段地址送SSMOVSP,OFFSETTOP;堆栈段的栈顶地址送SPTOP是该堆栈的初始栈顶部地址。2021/3/2960CS的装入对CS和IP的装入方法是利用END后的标号来完成的。因为该标号是可执行程序的起始地址。如:START:ENDSTART系统会自动将START所在段的段地址送CS寄存器,将START所在段内的偏移地址送IP寄存器202
38、1/3/2961操作系统下汇编程序的正常结束对于可执行文件(.EXE)在DOS提示符下正常结束可以用两种方法:方法1(此方法较常用,称DOS功能调用)MOVAX,4C00H;或MOVAH,4CHINT21H方法2:MAINPROCFARPUSHDS;保存原来的数据段段地址MOVAX,0H;0送AXPUSHAX;0压栈RET;返回DOSMAINENDP2021/3/2962结束伪指令(END)在完整段定义源程序的最后一条指令为结束伪指令END,后面的起始标号是告诉汇编器该程序的起始点为起始标号处。指令格式:END标号其中:标号可以是过程名或带“:”的标号。当标号缺省时表示该模块不是主程序模块。指
39、令功能:表示整个程序的结束。并指明该过程或程序的起始地址。2021/3/2963处理器选择伪指令需要注意的问题:处理器选择伪指令在2种程序框架中均可使用缺 省 时 为 选 择8088/8086微处理器指令系统处理器选择伪指令处理器选择伪指令指令功能指令功能8086选择选择8088/8086微处理器指令系统微处理器指令系统286选择选择80286微处理器指令系统微处理器指令系统386选择选择80386微处理器指令系统微处理器指令系统486选择选择80486微处理器指令系统微处理器指令系统586选择选择Pentium微处理器指令系统微处理器指令系统286P选择选择80286保护模式指令系统保护模式
40、指令系统386P选择选择80386保护模式指令系统保护模式指令系统486P选择选择80486保护模式指令系统保护模式指令系统586P选择选择Pentium保护模式指令系统保护模式指令系统2021/3/2964简化段定义伪指令常用的简化段定义伪指令简化段定义伪指令指令功能DATA定义数据段SATCKsize堆栈段,大小可指定,大小不指定时,则默认1KBCODEname代码段,段名可任选MODEL选择存储模型STARTUP在简化段定义框架中指示程序的开始EXIT在简化段定义框架中,使程序返回到DOS状态2021/3/2965简化段定义的存储模型MODEL指令格式:MODEL模型指令功能:定义存储器
41、模型模型功能Tiny所有数据和代码装入同一个代码段内。该模型程序产生MS-DOS的COM格式的文件。程序的起始偏移地址为0100H。一般用于小程序。用于MS-DOS。Small数据存放在一个64K字节的数据段,代码放在另外一个64K字节代码段。程序只有一个代码段和一个数据段。数据段和代码段均为近访问,是应用程序最常用的一种模型。用于MS-DOS和Windows。Medium数据装入一个64K字节的数据段中,而代码段可以是多于一个。数据是近访问的,而代码则可远访问。用于MS-DOS和Windows。Compact代码装入一个64K字节的数据段中,而数据段可以是多于一个。代码是近访问,数据则为远访
42、问。用于MS-DOS和Windows。Large代码和数据都可分别装入多于一个的代码段和多于一个的数据段中。数据和代码都可以远访问。用于MS-DOS和Windows。Huge与Large模型相同,不同的是允许数据段大于64K字节。用于MS-DOS和Windows。F1at所有数据和代码使用一个段,允许使用32位偏移量,DOS下不支持这种模型,用于WindowsNT,MASM60以上版本。2021/3/2966程序开始与结束伪指令(STARTUP、EXIT)STARTUP伪指令指令格式:STARTUP指令功能:用来设置程序的入口地址,并对DS、SS、SP初始化,当用STARTUP来设置程序的入口
43、地址时,程序的最后一条指令END后就不用加起始标号2021/3/2967程序开始与结束伪指令(STARTUP、EXIT)EXIT伪指令指令格式:EXIT返回值指令功能:退出程序,返回到操作系统状态。返回值一般用0。该条指令可以代替:MOVAX,4C00HINT21H2021/3/2968简化段定义框架来描述一般用下面的两种方法。方法1:(MASM5.0以上)MODELSMALL386STACK64H;定义堆栈段为64H个字节DATA;数据段CODE;代码段START:MOVAX,DATA;DATA表示数据段的段名MOVDS,AX;段地址送DS寄存器;程序MOVAX,4C00HINT21H;返回
44、操作系统ENDSTART;程序结束并指明执行程序的起始地址2021/3/2969方法2:(MASM6.0以上)MODELSMALL386STACK64H;定义堆栈段为64H个字节DATA;数据段CODE;代码段STARTUP;程序的开始,并对DS、SS、SP初始化;程序EXIT;返回操作系统END;程序结束2021/3/2970定位伪指令ORG指令格式:ORG常数表达式指令功能:使接下来的偏移地址为常数表达式的值。【例4-26】DATASEGMENTORG100HSTR1DBHELLO;STR1的偏移地址为0100HORG200HSTR2DBHELLO;STR2的偏移地址为0200HORG$+
45、4STR3DBHELLO;STR3的偏移地址为0209HDATAENDS2021/3/2971赋值伪指令(EQU、=)符号常量的定义就是用赋值伪指令EQU或“=”来定义的符号名。伪指令格式:标识符EQU/=表达式伪指令功能:用表达式来定义标识符,使表达式等同于标识符。表达式包括:常量表达式,地址表达式。XEQU3*4;表达式是常量表达式Y=3*4区别:“=”可以重复定义,EQU不可以.符号替换操作:P121例4-282021/3/2972LABEL伪指令伪指令格式:变量/标号LABEL类型伪指令功能:定义一个变量或标号,并指定其属性。类型为:变量(符号地址)时类型为BYTE、WORD、DWOR
46、D等。标号时类型为NEAR或FAR。【例4-29】利用LABEL伪指令来定义:TYPE-ARRAYLABELBYTEWORD-ARRAYDW50DUP(?)上述定义后,在代码段中有下列指令:MOVWORD-ARRAY+1,1234HMOVBYTE-ARRAY+1,0FFHTYPE-ARRAY和WORD-ARRAY指向同一个内储单元2021/3/2973对准伪指令(EVEN)对准伪指令要为下一条指令或数据定义开始于偶数字节地址。指令格式:EVEN指令功能:使接下来的地址为偶数字节地址。【例4-30】DATASEGMENTORG10HXDB10EVENARRAYDB3DUP(?);使数组ARRAY的偏移地址从偶地址开始DATAENDS2021/3/2974标题伪指令标题伪指令是为程序或模块取一个名字,以便进行模块管理和读程序方便。指令格式:TITLE标题名或NAME模块名指令功能:为程序或模块取一个名字。2021/3/2975章节重点汇编语言的基本结构常量、变量、表达式、操作符、运算符的读写常用伪指令的读写完整的汇编源程序作业:P123/1,7,8/(1)(2),9/(1)(2)(3)(4),112021/3/2976问题?2021/3/2977