版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2021/3/291汇编语言程序设计南京工业大学 2017春任课教师:管昕洁2021/3/292第四章 汇编语言程序结构汇编语言程序的基本结构汇编语言的数据运算符与表达式 伪指令 2021/3/293汇编语言程序的基本结构汇编程序的基本框架汇编语言的指令格式2021/3/294汇编程序的基本框架完整段定义框架简化段定义框架2021/3/295完整段定义框架完整段定义框架STACK SEGMENT ;定义堆栈段 STACK ENDSDATA SEGMENT ;定义数据段 DATA ENDSCODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK ;说
2、明代码段的段地址放在CS中 ;数据段的段地址放在DS中 ;堆栈段的段地址放在SS中START:MOV AX,DATA MOV DS,AX ;数据段段地址送DS中 ;程序 MOV AX,4C00H ;程序结束返回DOS INT 21HCODE ENDS ;代码段结束 END START2021/3/296简化段定义框架MODEL SMALL 386 STACK ;堆栈段 DATA ;数据段 CODE ;代码段STARTUP ;程序 EXIT ;返回DOS END 2021/3/297【例例4-14-1】设设 X X,Y Y,Z Z为为1616位带符号的字变量,计算位带符号的字变量,计算(X+12
3、5-X(X+125-X* *Y)/ZY)/Z后将商存入后将商存入X X ,余数存入,余数存入Y Y中。中。STACK SEGMENT STACK SEGMENT ;定义堆栈段;定义堆栈段 DW 100H DUPDW 100H DUP(?)(?)STACK ENDSSTACK ENDSDATA SEGMENT DATA SEGMENT ;定义数据段;定义数据段 X DW 3 X DW 3 Y DW 4 Y DW 4 Z DW 10 Z DW 10DATA ENDSDATA ENDSCODE SEGMENT CODE SEGMENT ;定义代码段;定义代码段 ASSUME CSASSUME CS:
4、CODECODE,DSDS:DATADATA,SSSS:STACK STACK ; STARTSTART: MOV AXMOV AX, DATADATA MOV DS MOV DS, AXAX ;数据段段地址送;数据段段地址送DSDS中中 MOV AXMOV AX,X X ;乘数;乘数XAXXAX IMUL Y IMUL Y ;X XYDXYDX:AXAX MOV CX MOV CX,AX AX MOV BX MOV BX,DX DX ;结果再存放到;结果再存放到BXBX:CXCX中暂存中暂存 MOV AXMOV AX,X X ;XAXXAX ADD AX ADD AX,125 125 ;X+
5、125AXX+125AX CWD CWD ;将;将AXAX转换成双字转换成双字DXDX:AXAX SUB AX SUB AX,CX CX ;低;低1616位减法位减法 SBB DXSBB DX,BX BX ;高;高1616位减法,位减法,X+125-XX+125-XYDXYDX:AXAX IDIV Z IDIV Z ;(;(X+125-XX+125-XY Y)Z Z,商,商AXAX,余数,余数DXDX MOV X MOV X, AX AX ;商;商X X MOV Y MOV Y, DX DX ;余数;余数Y Y MOV AXMOV AX,4C00H 4C00H ;程序结束返回;程序结束返回DO
6、SDOS INT 21H INT 21HCODE ENDS CODE ENDS ;代码段结束;代码段结束 END END STARTSTART 2021/3/298MODEL SMALL MODEL SMALL ;选择编程模式为小模式;选择编程模式为小模式386 386 ;选择;选择8038680386指令系统指令系统STACK STACK ;堆栈段;堆栈段DW 100H DUPDW 100H DUP(?)(?) DATA DATA ;数据段;数据段X DW 3X DW 3Y DW 4Y DW 4Z DW 10Z DW 10CODE CODE ;代码段;代码段STARTUPSTARTUP MO
7、V AX MOV AX,X X ;乘数;乘数XAXXAX IMUL Y IMUL Y ;X XYDXYDX:AXAX MOV CX MOV CX,AX AX ; MOV BXMOV BX,DX DX ;结果再存放到;结果再存放到BXBX:CXCX中暂存中暂存 MOV AXMOV AX,X X ;XAXXAX ADD AX ADD AX,125 125 ;X+125AXX+125AX CWD CWD ;将;将AXAX转换成双字转换成双字DXDX:AXAX SUB AX SUB AX,CX CX ;低;低1616位减法位减法 SBB DXSBB DX,BX BX ;高;高1616位减法,位减法,X
8、+125-XX+125-XYDXYDX:AXAX IDIV Z IDIV Z ;(;(X+125-XX+125-XY Y)Z Z,商,商AXAX,余数,余数DXDX MOV X MOV X, AX AX ;商;商X X MOV Y MOV Y, DX DX ;余数;余数Y YEXIT EXIT ;返回;返回DOSDOSEND END 2021/3/299汇编语言的指令格式 汇编语言程序中的指令可以分为指令、伪指令两种。 指令的格式 标号: 操作码 操作数 ;注释 方括号中的内容根据程序或指令的要求可有可无。 标号 由26个大小写英文字母、09数字、(下划线)、$、?等字 符组成,数字不能出现在
9、标号的第一个字符位置,后跟“:”。 操作码 汇编指令的助记符(关键字),一条汇编指令必须有唯一的操作码,指出该指令的操作内容。 操作数 为操作提供必要的数据信息。 注释 表示对该条指令的说明,可写可不写,如果有注释则必须在注释前加分号。2021/3/2910汇编语言的指令格式 伪指令格式 名字名字 伪指令助记符伪指令助记符 操作数操作数 ;注释;注释 方括号中的内容根据程序或指令的要求可有可无 名字 是该语句的符号地址,后不跟后不跟“:”:” 伪指令助记符(伪操作符) 给出该伪指令的操作内容 操作数 为操作提供必要的信息 名字:变量名、过程名、段名、常量名等 名字和标号都具有三个属性:段基址、
10、偏移量和类型 标号的类型:NEAR型和FAR型 变量的类型:字节、字、双字、四字等2021/3/2911汇编语言的数据 常量 变量 标号 变量定义时用到的操作符和表达式2021/3/2912常量 汇编语言的常数主要包括整数、字符、字符串、符号常量与数值表达式等 整数 整数包括:二进制、八进制、十六进制、十进制表示的整数,如:011000101B 、7654Q、0ABCDH、32768D(或32768) 在指令中把二进制、八进制、十六进制、十进制表示的整数叫做立即数 字符与字符串 字符与字符串必须用单引号或双引号括起来。例如:“A”为字符常量,“AAA”为字符串常量2021/3/2913常量 符
11、号常量 符号常量是用赋值伪指令EQU定义的符号名 赋值伪指令的格式: 常量名 EQU 表达式 例如:X EQU 100;X为符号常量,在程序中X为100,X是一个常量。 数值表达式 以常数(立即数)或符号地址(变量、标号等)作为操作数的地方,均可使用数值表达式。2021/3/2914变量 变量的一般格式: 变量名 助记符 操作数 ;注释 其中 :变量名 是一个非保留字的标识符,可有可无 助记符 指定变量的长度,如P99表4-1所示 操作数 可以是数字常量、字符常量、字符串常量、符号常量、数值表达式、地址表达式、?、n DUP 操作数等 可以包含0个、一个或多个操作数,多个操作数之间以逗号(,)
12、分隔2021/3/2915变量 标识符 标识符包括:标号、变量名、子程序名和宏名等 标识符的使用原则: 由31个字母、数字及规定的特殊字符(?、$)等组成 不区分标识符中字母的大小写 不能以数字开头 不能单独使用$或? 不能是系统的保留字,如指令名、寄存器名和伪指令名等 例如,_DATA1、LOP、STAR、count是合法的标识符 ADD、EAX、MOV、6X是不合法的 又如:FFFFH是标识符,0FFFFH是十六进制数值2021/3/2916变量【例4-2】操作数可以是数字常量或是数值表达式。 X1 DB 10,0,10H X2 DW ?,100,5 X3 DD 5*20+5 ,0ABCD
13、EF68H2021/3/2917变量【例4-3】操作数可以是字符常量或字符串常量: C1 DB HELLO,$ C2 DB A C3 DB “AB” C4 DW “AB” ;注意C3和C4的区别下图列出了本例在内存中的存储分配结构(P101图4-3,图4-4):2021/3/2918变量的属性 变量具有三个属性 : 段属性 变量的段属性是指变量所在段的段地址。 偏移属性 变量的偏移属性是指变量所在段的首地址到该变量的偏移量。 例P100图4-2:X1和X2的偏移地址分别为0000H和0003H。 类型属性 变量的类型属性是指存取该变量中的数据所对应的字节数 有字节(BYTE)、字(WORD)、
14、双字(DWORD)等2021/3/2919变量定义时用到的操作符和表达式 当前位置计数器($) 当前位置计数器($)表示当前的偏移值【例4-4】下列指令是在数据段中定义的,画出其内存中的存储结构,并计算出符号常量LEN1和LEN2的值。 X1 DB 1,2,3,5 LEN1 EQU $-X1 X2 DW 1234H LEN2 EQU $-X2 假设X1地址为2000H,LEN为符号常量,不占存储空间,X2为字变量,则X2的地址为2004H。LEN1的值是$-X1=2004H-2000H=0004H,数组X1的长度为4字节。LEN2的值是$-X2=2006H-2004H=0002H,变量X2的长
15、度为2字节。2021/3/2920设置内存空间表达式(?) “?”表示没有为该存储空间赋初值,汇编后该存储空间清零。 例如: X3 DB 1,?,?,?,2 X4 DW ?,1234H,? 【例4-5】用一个完整的程序完成上述定义。 MODEL SMALL 386 STACK DATA ;数据段 X1 DB 1,2,3,5 LEN1 EQU $-X1 X2 DW 1234H LEN2 EQU $-X2 X3 DB 1,?,?,?,2 LEN3 EQU $-X3 X4 DW ?,1234H,? LEN4 EQU $-X4 CODE ;代码段STARTUPMOV AX,LEN1MOV BX,LEN
16、2MOV CX,LEN3MOV DX,LEN4EXITEND2021/3/2921重复定义操作符(DUP) 用于定义重复的元素【例4-7】 ARRAY1 DB 2 DUP(1,2,2,?) ARRAY2 DB 50 DUP(?)如图4-8【例4-8】 DUP可以嵌套 ARRAY3 DB 2DUP(0,2DUP(1,2),3) ARRAY3的长度为12个字节,该伪指令的存储结构如图4-9所示2021/3/2922使用地址表达式作为DW或DD的操作数 地址包括:数据段中定义的变量名或数组名,代码段中的标号或子程序名【例4-9】设LOP为代码段的一个标号,MAX为代码段中的某一子程序名,则在数据段中
17、有如下定义: X1 DW 1234H ;定义字变量X1,并赋初值1234H X2 DW X1 ;定义字变量X2,所赋初值是变量X1的偏移地址 X3 DD X1 ;定义双字变量X3,所赋初值是变量X1的逻辑地址 X4 DW LOP ;LOP偏移地址 X5 DD LOP ;LOP逻辑地址 X6 DW MAX ;MAX偏移地址 X7 DD MAX ;MAX逻辑地址 X8 DW $ ;定义字变量X8,所赋初值是X8的偏移地址(当前地址)2021/3/2923练习 给出如下程序中的数据定义,问PLENTH的值为多少?它表示什么意义?PARTNO DW ?PNAME DB 16 DUP (?)COUNT
18、DD ?PLENTH EQU $-PARTNO 答:PLENTH=22=16H,它表示变量PARTNO、PNAME、COUNT总共占用的存储单元数(字节数)2021/3/2924标号 标号是用来说明可执行指令在汇编语言程序中的位置 例如: LP1:MOV AX,X LOOP LP1 ;转移到标号LP1处的指令2021/3/2925标号 标号三个属性: 标号的段属性 标号的段属性是指标号定义所在段的段地址。 标号的偏移属性 标号的偏移属性是指标号所在段的首地址到该标号的定义语句的偏移量。 标号的类型属性 标号的类型属性是指标号距转移指令的距离,是转移到本段内的标号,还是转移到其它段的标号。(即是
19、NEAR还是FAR).2021/3/2926运算符与表达式 算术运算符 逻辑运算符 关系运算符 数值回送操作符 属性操作符(PTR、: 、THIS、SHORT、HIGH、LOW) 移位运算符 运算符的优先级2021/3/2927算术运算符 算术运算符包括:+、*、 /、MOD(取余)。 运算符MOD是作除法操作,取余数,如:10 MOD 3 =1。 需要注意的问题: 算术运算符可以用于数值表达式或地址表达式中,参加运算的数和结果必须是整数,除法运算结果只有商无余数 当算术运算符用于地址表达式时,常用方法是“地址常量”来描述指针的移动2021/3/2928【例4-10】把首地址为BLOCK的字数
20、组的第5个字送到AX中: MOV AX,BLOCK +(51)*2 【例4-11】将数组长度(双字数)存到CX中: ARRAY DD 1,2,3,4,5,6,7 COUNT DD ? MOV CX,(COUNTARRAY)/4 假设数组ARRAY的地址是2000H,则COUNT=201CH (COUNTARRAY)/4=(201CH 2000H )/4=0007H2021/3/2929逻辑运算符 包括:AND(逻辑与) 、OR(逻辑或)、 XOR(逻辑异或)、 NOT(逻辑非)。 【例4-12】执行下列指令,计算其逻辑运算的值。 MOV AL, 88H AND 0FH ;AL=08H MOV
21、BL, 88H OR 0FH ;BL=8FH MOV CL, 88H XOR 0FH ;CL=87HMOV DL , NOT 88H ;DL=77HAND AL,88H AND 0FH ;两个AND是有区别的。 注意注意: :逻辑运算符与逻辑指令的区别。逻辑运算符在汇编程序汇逻辑运算符与逻辑指令的区别。逻辑运算符在汇编程序汇编时计算,而逻辑指令在程序运行时执行。编时计算,而逻辑指令在程序运行时执行。2021/3/2930关系运算符 包括:EQ (等于) NE(不等于) LT(小于) LE(小于等于) GT(大于) GE(大于等于) 关系运算符的使用格式: 表达式1 关系运算符 表达式2 计算结
22、果:真为全1,假为全0。2021/3/2931关系运算符【例4-13】MOV AX,( X LT 10)AND 0F0FH)OR (X GE 10)AND 0505H) 该指令说明: 当 X = 10 做 MOV AX,0505H2021/3/2932数值回送操作符 包括:SEG、OFFSET、TYPE、LENGTH、SIZE SEG(取段地址) 操作符格式: SEG 变量名/标号 操作符功能:取变量或标号的段基值(段地址) OFFSET(取偏移地址) 操作符格式: OFFSET 变量名/标号 功能:取变量或标号的偏移值(偏移地址) TYPE (取类型值) 操作符格式: TYPE 变量名/ 标
23、号 功能:取变量或标号的类型值。(字节=1、字=2、双字=4等,NEAR=-1,FAR=-2)2021/3/2933数值回送操作符 LENGTH (取长度) 操作符格式: LENGTH 变量名 功能:取分配给变量的字节、字、双字等的个数(说明:只有用DUP重复定义的变量才有意义,否则=1。) SIZE (取总字节数) 操作符格式: SIZE 变量名 操作符功能:SIZE 给出一个变量的总字节数(也就是LENGTH 和TYPE的乘积),即:SIZE=LENGTH TYPE2021/3/2934【例4-17】用一个完整的程序完成TYPE、LENGTH、SIZE的应用 MODEL SMALL 386
24、 STACK DATA ;数据段 X1 DW 100 DUP(2) ;共定义200个字节 X2 DD 2 DUP(8,3 DUP(0) ;共定义32个字节 X4 DW 4,5,6 DUP(A) ;共定义16个字节 CODE ;代码段 STARTUP MOV AX,TYPE X1 ;AX=2 MOV AX,TYPE X2 ;AX =4 MOV AX,TYPE X4 ;AX =2 MOV AX,LENGTH X1 ;AX =100=64H MOV AX,LENGTH X2 ;AX =2 MOV AX,LENGTH X4 ;AX =1 MOV AX,SIZE X1 ;AX =2*100=200=0C
25、8H MOV AX,SIZE X2 ;AX =4*2=8 MOV AX,SIZE X4 ;AX =2*1=2 EXIT END 2021/3/2935属性操作符包括:PTR、: 、THIS、SHORT、HIGH、LOWPTR(改变变量或标号类型操作符)操作符格式: 类型 PTR 地址表达式其中 类型:BYTE、 WORD、 DWORD、 FAR、 NEAR。 地址表达式:表示(变量或标号)地址的数值。 变量:用变量名给出的有效地址。 标号:指令的有效地址。 操作符功能:临时指定变量或标号的操作类型2021/3/2936【例4-18】PTR操作符的应用。在数据段定义:X DB AY DW 123
26、4HZ DD 12345678H 在代码段中:MOV AX,Y ;类型匹配,正确此时AX=1234HMOV BL, BYTE PTR Y ;用PTR取出Y变量中的一个字节,BL=34HM0V CL, BYTE PTR Y+1;用PTR取出Y变量中的一个字节,CL=12HMOV DL,BYTE PTR Z+3 ;将Z+3所指的字节内容送DL中,DL=12H2021/3/2937 【例4-19】PTR操作符的应用。 在数据段定义:X2 DW ? ;X2为字变量X1 EQU BYTE PTR X2 ;将X2的地址赋给X1,X1为字节变量X3 EQU BYTE PTR(X2+1);将X2+1的地址赋X
27、3,X3为字节变量X3 EQU X1+1 ;将X1+1的地址赋给X3,X3仍为字节变量 内存中安排见P109图4-10。 说明:同一个单元可有两个变量名,一个是字的属性(如说明:同一个单元可有两个变量名,一个是字的属性(如X2X2),),另一个是字节的属性(如另一个是字节的属性(如X1X1)。可根据需要选用不同的变量。)。可根据需要选用不同的变量。2021/3/2938:(修改段操作符)操作符格式: 段寄存器 :变量/标号/地址表达式其中段寄存器:CS、DS、ES、SS。操作符功能:用段修改操作符来修改一个变量、标号或地址表达式的段属性(段超越)。2021/3/2939【例4-20】操作符的应
28、用。MOV AX , ES:BX+SI ;基址加变址寻址,隐含的段寄存器是DS MOV EAX , GS:DWORD PTRBX ;寄存器间接寻址,隐含段寄存器是 DS改为GS 【例4-21】操作符的应用。 DATA X DW ? CODE MOV AX , CS: X 2021/3/2940THIS (指定类型操作符)操作符格式: 变量名/标号/过程名 THIS 类型操作符功能:为某一个变量名指定一个类型(BYTE、WORD、DWORD、QWORD、FWORD、TWORD、)或为某一个标号或过程指定一种转移距离(NEAR,FAR)。同时指定该操作数地址与下一个存储单元地址相同。2021/3/
29、2941【例4-22】THIS操作符的应用。 VAR1 EQU THIS BYTE ;指定VAR1为字节常量 VAR2 DW ? ;VAR1为字节(BYTE)常量, VAR2为字(WORD)变量。 经过上述定义后; MOV AL,VAR1 MOV AX,VAR2 【例4-23】THIS操作符的应用。 CODE LOP1 EQU THIS FAR LOP1: DEC CX 2021/3/2942SHORT (短转移操作符)操作符格式: SHORT 标号 操作符功能:短转移操作符是用来指定JMP指令中转向地址为8位位移量,而不是在缺省时的16位位移量。标号为转移偏移值,该偏移值 为 - 128 +
30、127字节,则JMP 转移范围为IP+(-128 +127)2021/3/2943HIGH(取高位字节) 和LOW(取低位字节)操作符 操作符格式: HIGH/LOW 数值表达式/符号常量 操作符功能:取数值表达式或符号常量的高位字节或低位字节,不能作用于内存操作数【例4-24】字节分离操作符的应用。 CONST EQU 0ABCDH MOV AH , HIGH CONST ;AH=ABH MOV AL , LOW CONST ;AL=CDH2021/3/2944移位运算符移位运算符SHL和 SHR, 是按位运算的,只用于数值表达式中。运算符格式: 常量 SHL/ SHR 位数运算符功能:将运
31、算符左边的二进制数左移或右移运算符右边的所指定的移位位数,空出的位补0。当移位位数大于15,则结果为0。如:MOV AX,41H SHL 2;将41H左移2位,结果送AX寄存器中,AX=104H。2021/3/2945运算符的优先级 运算规则仍为先计算优先级高的运算符同级运算符自左向右进行计算优先级运算符1(最高)LENGTH、SIZE 、()、 (记录中)、(结构中)2PTR、OFFSET、SEG、TYPE、THIS、段操作符:3HIGH、LOW(字节分离操作符)4*、 、MOD 、SHL、SHR5、6 EQ、NE、LT、LE、GT、GE7NOT8AND9OR、 XOR10(最低)SHORT
32、2021/3/2946伪指令 完整段定义伪指令(SEGMENT、ENDS、ASSUME) 处理器选择伪指令 简化段定义伪指令 定位伪指令 ORG 赋值伪指令(EQU、= ) LABEL伪指令 对准伪指令(EVEN) 标题伪指令2021/3/2947完整段定义伪指令(SEGMENT、ENDS、ASSUME)段定义伪指令(SEGMENT、ENDS)格式: 段名 SEGMENT 对齐类型 组合类型 使用类型类别名 段名 ENDS 功能:定义逻辑段,SEGMENT表示某个逻辑段开始,ENDS表示该逻辑段结束。其中:段名自定义。4个选项可选可不选,有可选项时各项顺序不能错,可选项之间用空格隔开。2021
33、/3/2948对齐类型 表示当前段的起始边界要求。即定义了当前段在内存中表示当前段的起始边界要求。即定义了当前段在内存中起始边界的设定起始边界的设定, ,说明了段与段之间的空隙。对齐类型可说明了段与段之间的空隙。对齐类型可以是:以是: PAGE(PAGE(页页) )、 PARA(PARA(节节) )、WORD(WORD(字字) )、BYTE(BYTE(字节字节) )、DWORD(DWORD(双字双字) )。 PAGE (PAGE (页页) ) 设该段的起始地址的低设该段的起始地址的低8 8位为位为”0”0”。该地址是可以被。该地址是可以被256256整除的地址,整除的地址,1 1页为页为256
34、256字节字节, ,当对齐类型为当对齐类型为PAGEPAGE时时, ,说明该段从页的边界开始说明该段从页的边界开始, ,该段与下一段的最大存储空该段与下一段的最大存储空间为间为256256字节字节, ,假如在该段中只放一个字节的数据假如在该段中只放一个字节的数据, ,则该则该段距下一个段的空隙为段距下一个段的空隙为255255个字节。个字节。 PARA(PARA(节节) ) 设段的起始地址的低设段的起始地址的低4 4位为位为”0”0”。 该地址是可以被该地址是可以被1616整除的地址,整除的地址,1 1节为节为1616字节字节, ,当对齐类型为当对齐类型为PARAPARA时时, ,说明说明该段
35、从节的边界开始该段从节的边界开始, ,该段与下一段的最大存储空间为该段与下一段的最大存储空间为1616字节字节, ,假如在该段中只放一个字节的数据假如在该段中只放一个字节的数据, ,则该段距则该段距下一个段的空隙为下一个段的空隙为1515个字节。对齐类型个字节。对齐类型缺省时缺省时, ,隐含隐含PARA(PARA(节的边界节的边界) )。2021/3/2949对齐类型 WORD(字) 表示本段的起始地址(段基地址)以偶地址开始。段与段之间最大空间为1个字,最大空隙为1字节。 BYTE(字节) 表示本段的起始地址可以从字节地址开始(任意地址)。段与段之间最大空间为1字节,段与段之间无任何空隙。
36、DWORD(双字) 表示本段的起始地址是可以被4整除的地址。段与段之间最大空间为4个字,最大空隙为3字节。2021/3/2950组合类型 当程序有多个段时,用来说明段与段之间是怎样连接和定位的。 共有六种组合类型: 缺省 PRIVATE: 没有说明,汇编程序就认为本段不和别的段连接。 PUBLIC:本段与同名段顺序连接,组成一个大的逻辑段,它们共用同一个段起始地址。 COMMON:本段与同名段从同一地址开始重叠连接。段长是同名段中最长的段的长度,重叠部分的内容取决于排列在最后一段的内容。2021/3/2951组合类型 STACK:表示该段是堆栈段的一部分。把所有相同类别名的具有STACK组合类
37、型的段连接成一个连续段。将连续段首地址送SS,段内最大偏移地址送SP。当定义了STACK属性后,在主程序中可省略对SS和SP的初始化。 MEMORY:表示在N个互相连接的段中,本段的定位地址为最高地址,如果有多个MEMORY的段,则把第一个遇到的段当作MEMORY处理,其他均当作COMMON(重叠)处理。 AT表达式:本段定位在表达式所表示的位置并且节对齐。 如:S1 SEGMENT PARA AT 0A800H;表示本段段地址为0A800H并且节对齐2021/3/2952使用类型 包括: USE16或USE32,用来说明使用16位寻址方式还是32位寻址方式,该使用类型用于386以上机型。 缺
38、省时隐含USE16 在实模式下使用USE16,为16位寻址方式,则段长不超过64KB,其地址是由16位段地址和16位偏移地址组成2021/3/2953类别名 在引号中给出相连接的段名,完成把具有相同类名的段连接在一起。 如:CODE1 SEGMENT PARA PUBLIC CODE;表示把所有的有CODE类别的段连接在一起。2021/3/2954指定段寄存器伪指令(指定段寄存器伪指令(ASSUMEASSUME)格式: ASSUME 段寄存器名:段名,段寄存器名:段名功能:告诉汇编程序,在运行期间通过哪个段寄存器才能找到所要的指令和数据。该指令放在程序的代码段中。 如:ASSUME CS:CO
39、DE,ES:ESTRA,DS:DATA,SS:STACK说明:ASSUME仅明确段名与段寄存器的关系,但段寄存器中还没有段地址的数值,因此还必须用传送指令将段地址装入相应的段寄存器中。2021/3/2955完整段定义源程序书写形式完整段定义源程序书写形式数据段名 SEGMENT ;数据段可有可无,也可多个用伪指令定义的数据空间 数据段名 ENDS 堆栈段名 SEGMENT ;堆栈段可有可无,也可多个用伪指令定义的数据空间 堆栈段名 ENDS代码段名 SEGMENT ;代码段最少有一个 ASSUME(定义寻址关系)起始标号:2021/3/2956完整段定义源程序书写形式完整段定义源程序书写形式
40、MOV AX,数据段名 MOV DS,AX ;初始化DS MOV AX,堆栈段名 MOV SS,AX ;初始化SS 过程名 PROC 过程名 ENDP 代码段名 ENDS END START;给出程序的起始地址 说明:ASSUME仅明确段名与段寄存器的关系,但段寄存器中还没有段地址的数值,因此还必须用传送指令将段地址装入相应的段寄存器中。2021/3/2957段寄存器的装入 DS、ES 装入2021/3/2958【例4-25】设X为字节变量,是在数据段DATA1中定义的,Y是在另外一个数据段中定义的具有字节属性的符号地址,请将X变量的内容送Y数组的第6个元素中。 DATA1 SEGMENT X
41、 DB 18H DATA1 ENDS DATA2 SEGMENT Y DB 10H DUP(?) DATA2 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA1,ES:DATA2 START:MOV AX, DATA1 MOV DS, AX ;将DATA1段地址送DS MOV AX,DATA2 MOV ES, AX ;将DATA2段地址送ES MOV AL, X ; AL=12H MOV ESES:Y5, AL ; 12HY+5单元中 MOV AX ,4C00H ; 返回DOS状态 INT 21H CODE ENDS END START2021/3/2959SS
42、的装入(可省略,系统会自动分配一定的堆栈空间) 方法1: STACK1 SEGMENT PARA STACK DB 50H DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK1 当目标代码装入存储器后,SS中已自动装入STACK段的段基值,堆栈指针SP指向堆栈的底部+1的存储单元,则:SP=4FH+1=50H。2021/3/2960SS的装入方法2: STACK1 SEGMENT PARA DW 50H DUP(?) TOP LABEL WORD ;TOP属性为WORD STACK1 ENDS CODE SEGMENT ASSUME
43、 CS:CODE, SS:STACK1 START: MOV AX , STACK1 MOV SS, AX ;堆栈段的段地址送SS MOV SP , OFFSET TOP;堆栈段的栈顶地址送SP TOP 是该堆栈的初始栈顶部地址。2021/3/2961CS的装入对CS和IP的装入方法是利用END后的标号来完成的。因为该标号是可执行程序的起始地址。如:START : END START系统会自动将START 所在段的段地址送CS寄存器,将START 所在段内的偏移地址送IP寄存器2021/3/2962操作系统下汇编程序的正常结束 对于可执行文件(.EXE)在DOS提示符下正常结束可以用两种方法:
44、 方法1 (此方法较常用,称DOS功能调用) MOV AX ,4C00H;或MOV AH,4CH INT 21H 方法2: MAIN PROC FAR PUSH DS ;保存原来的数据段段地址 MOV AX, 0H ;0送AX PUSH AX ;0压栈 RET ;返回DOS MAIN ENDP2021/3/2963结束伪指令(END)在完整段定义源程序的最后一条指令为结束伪指令END,后面的起始标号是告诉汇编器该程序的起始点为起始标号处。指令格式: END 标号 其中:标号可以是过程名或 带“:”的标号。当标号缺省时表示该模块不是主程序模块。指令功能:表示整个程序的结束。并指明该过程或程序的起
45、始地址。2021/3/2964处理器选择伪指令 需要注意的问题: 处理器选择伪指令在2种程序框架中均可使用 缺省时为选择8088/8086微处理器指令系统处理器选择伪指令处理器选择伪指令指令功能指令功能80868086选择选择8088/80868088/8086微处理器指令系统微处理器指令系统286286选择选择8028680286微处理器指令系统微处理器指令系统386386选择选择8038680386微处理器指令系统微处理器指令系统486486选择选择8048680486微处理器指令系统微处理器指令系统586586选择选择PentiumPentium微处理器指令系统微处理器指令系统286P2
46、86P选择选择8028680286保护模式指令系统保护模式指令系统386P386P选择选择8038680386保护模式指令系统保护模式指令系统486P486P选择选择8048680486保护模式指令系统保护模式指令系统586P586P选择选择PentiumPentium保护模式指令系统保护模式指令系统2021/3/2965简化段定义伪指令常用的简化段定义伪指令简化段定义伪指令指令功能DATA定义数据段SATCKsize堆栈段,大小可指定,大小不指定时,则默认1KBCODEname代码段,段名可任选MODEL选择存储模型STARTUP在简化段定义框架中指示程序的开始EXIT在简化段定义框架中,使
47、程序返回到DOS状态2021/3/2966简化段定义的存储模型MODEL指令格式: MODEL 模型指令功能:定义存储器模型模型功能Tiny 所有数据和代码装入同一个代码段内。该模型程序产生MS-DOS的COM 格式的文件。程序的起始偏移地址为0100H。一般用于小程序。用于MS-DOS。Small 数据存放在一个64K字节的数据段,代码放在另外一个64K字节代码段。程序只有一个代码段和一个数据段。数据段和代码段均为近访问,是应用程序最常用的一种模型。用于MS-DOS和Windows。Medium 数据装入一个64K字节的数据段中,而代码段可以是多于一个。数据是近访问的,而代码则可远访问。用于
48、MS-DOS和Windows。Compact 代码装入一个64K字节的数据段中,而数据段可以是多于一个。代码是近访问,数据则为远访问。用于MS-DOS和Windows。Large 代码和数据都可分别装入多于一个的代码段和多于一个的数据段中。数据和代码都可以远访问。用于MS-DOS和Windows。Huge 与Large模型相同,不同的是允许数据段大于64K字节。用于MS-DOS和Windows。 F1at 所有数据和代码使用一个段,允许使用32位偏移量 ,DOS下不支持这种模型,用于Windows NT,MASM60以上版本。2021/3/2967程序开始与结束伪指令(STARTUP、EXIT)STARTUP伪指令指令格式: STARTU
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广告公司租赁解除:关键步骤
- 新能源合同验收要点复习知识点
- 篮球场建设与体育俱乐部合作合同
- 环保技术研发项目审批表
- 环保工程供电管沟施工合同
- 林业科研单位护林员聘用协议
- 医用耗材市场细分与定位
- 船舶公司人事经理聘用合同
- 智能制造班组管理新策略
- 棋牌室窗帘选购招标标书
- 广东省广州市四校2024-2025学年九年级上学期11月期中化学试题(含答案)
- 浙江省杭州市2023-2024学年高二上学期期末学业水平测试政治试题 含解析
- 科技公司研发项目风险防控制度
- 【课件】Unit+4+Section+B+1a-1d+课件人教版英语七年级上册
- 海南省申论真题2022年(C类行政执法)
- 大数据行业分析报告
- (5篇)国开2024年秋形策大作业:中华民族现代文明有哪些鲜明特质?建设中华民族现代文明的路径是什么
- 错牙合畸形的早期矫治(口腔正畸学课件)
- 江苏省徐州市沛县第五中学2024-2025学年九年级上学期11月期中考试数学试题
- 2024年中国酶免试剂市场调查研究报告
- GB/T 44578-2024热塑性塑料隔膜阀
评论
0/150
提交评论