您好,欢迎访问三七文档
汇编语言程序设计南京工业大学2017春任课教师:管昕洁1第四章汇编语言程序结构•汇编语言程序的基本结构•汇编语言的数据•运算符与表达式•伪指令2汇编语言程序的基本结构•汇编程序的基本框架•汇编语言的指令格式3汇编程序的基本框架•完整段定义框架•简化段定义框架4完整段定义框架STACKSEGMENT;定义堆栈段┇STACKENDSDATASEGMENT;定义数据段┇DATAENDSCODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACK;说明代码段的段地址放在CS中;数据段的段地址放在DS中;堆栈段的段地址放在SS中START:MOVAX,DATAMOVDS,AX;数据段段地址送DS中┇┇;程序MOVAX,4C00H;程序结束返回DOSINT21HCODEENDS;代码段结束ENDSTART5简化段定义框架·MODELSMALL·386·STACK┇;堆栈段·DATA┇;数据段·CODE;代码段·STARTUP┇;程序┇·EXIT;返回DOSEND6【例4-1】设X,Y,Z为16位带符号的字变量,计算(X+125-X*Y)/Z后将商存入X,余数存入Y中。STACKSEGMENT;定义堆栈段DW100HDUP(?)STACKENDSDATASEGMENT;定义数据段XDW3YDW4ZDW10DATAENDSCODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACK;START:MOVAX,DATAMOVDS,AX;数据段段地址送DS中MOVAX,X;乘数X→AXIMULY;X×Y→DX:AXMOVCX,AXMOVBX,DX;结果再存放到BX:CX中暂存MOVAX,X;X→AXADDAX,125;X+125→AXCWD;将AX转换成双字→DX:AXSUBAX,CX;低16位减法SBBDX,BX;高16位减法,X+125-X×Y→DX:AXIDIVZ;(X+125-X×Y)÷Z,商→AX,余数→DXMOVX,AX;商→XMOVY,DX;余数→YMOVAX,4C00H;程序结束返回DOSINT21HCODEENDS;代码段结束ENDSTART7·MODELSMALL;选择编程模式为小模式·386;选择80386指令系统·STACK;堆栈段DW100HDUP(?)·DATA;数据段XDW3YDW4ZDW10·CODE;代码段·STARTUPMOVAX,X;乘数X→AXIMULY;X×Y→DX:AXMOVCX,AX;MOVBX,DX;结果再存放到BX:CX中暂存MOVAX,X;X→AXADDAX,125;X+125→AXCWD;将AX转换成双字→DX:AXSUBAX,CX;低16位减法SBBDX,BX;高16位减法,X+125-X×Y→DX:AXIDIVZ;(X+125-X×Y)÷Z,商→AX,余数→DXMOVX,AX;商→XMOVY,DX;余数→Y·EXIT;返回DOSEND8汇编语言的指令格式•汇编语言程序中的指令可以分为指令、伪指令两种。•指令的格式[标号:]操作码[操作数]…[;注释]•[]—方括号中的内容根据程序或指令的要求可有可无。•标号—由26个大小写英文字母、0~9数字、—(下划线)、$、@、?等字符组成,数字不能出现在标号的第一个字符位置,后跟“:”。•操作码—汇编指令的助记符(关键字),一条汇编指令必须有唯一的操作码,指出该指令的操作内容。•操作数—为操作提供必要的数据信息。•注释—表示对该条指令的说明,可写可不写,如果有注释则必须在注释前加分号。9汇编语言的指令格式•伪指令格式[名字]伪指令助记符[操作数][;注释]•[]—方括号中的内容根据程序或指令的要求可有可无•名字—是该语句的符号地址,后不跟“:”•伪指令助记符(伪操作符)—给出该伪指令的操作内容•操作数—为操作提供必要的信息•名字:变量名、过程名、段名、常量名等•名字和标号都具有三个属性:段基址、偏移量和类型•标号的类型:NEAR型和FAR型•变量的类型:字节、字、双字、四字等10汇编语言的数据•常量•变量•标号•变量定义时用到的操作符和表达式11常量•汇编语言的常数主要包括整数、字符、字符串、符号常量与数值表达式等•整数•整数包括:二进制、八进制、十六进制、十进制表示的整数,如:011000101B、7654Q、0ABCDH、32768D(或32768)•在指令中把二进制、八进制、十六进制、十进制表示的整数叫做立即数•字符与字符串•字符与字符串必须用单引号或双引号括起来。例如:“A”为字符常量,“AAA”为字符串常量12常量•符号常量•符号常量是用赋值伪指令EQU定义的符号名•赋值伪指令的格式:常量名EQU表达式•例如:XEQU100;X为符号常量,在程序中X为100,X是一个常量。•数值表达式•以常数(立即数)或符号地址(变量、标号等)作为操作数的地方,均可使用数值表达式。13变量•变量的一般格式:[变量名]助记符[操作数][;注释]•其中:变量名-是一个非保留字的标识符,可有可无•助记符-指定变量的长度,如P99表4-1所示•操作数•可以是数字常量、字符常量、字符串常量、符号常量、数值表达式、地址表达式、?、[n]DUP[操作数]等•可以包含0个、一个或多个操作数,多个操作数之间以逗号(,)分隔14变量•标识符•标识符包括:标号、变量名、子程序名和宏名等•标识符的使用原则:•由31个字母、数字及规定的特殊字符(?、@、—、$)等组成•不区分标识符中字母的大小写•不能以数字开头•不能单独使用$或?•不能是系统的保留字,如指令名、寄存器名和伪指令名等•例如,_DATA1、LOP、STAR、count是合法的标识符•ADD、EAX、MOV、6X是不合法的•又如:FFFFH是标识符,0FFFFH是十六进制数值15变量【例4-2】操作数可以是数字常量或是数值表达式。X1DB10,0,10HX2DW?,100,-5X3DD5*20+5,0ABCDEF68H16变量【例4-3】操作数可以是字符常量或字符串常量:C1DB‘HELLO’,‘$’C2DB‘A’C3DB“AB”C4DW“AB”;注意C3和C4的区别下图列出了本例在内存中的存储分配结构(P101图4-3,图4-4):17变量的属性•变量具有三个属性:•段属性•变量的段属性是指变量所在段的段地址。•偏移属性•变量的偏移属性是指变量所在段的首地址到该变量的偏移量。•例P100图4-2:X1和X2的偏移地址分别为0000H和0003H。•类型属性•变量的类型属性是指存取该变量中的数据所对应的字节数•有字节(BYTE)、字(WORD)、双字(DWORD)等18变量定义时用到的操作符和表达式•当前位置计数器($)•当前位置计数器($)表示当前的偏移值【例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字节。19设置内存空间表达式(?)•“?”表示没有为该存储空间赋初值,汇编后该存储空间清零。•例如:X3DB1,?,?,?,2X4DW?,1234H,?【例4-5】用一个完整的程序完成上述定义。·MODELSMALL·386·STACK·DATA;数据段X1DB1,2,3,5LEN1EQU$-X1X2DW1234HLEN2EQU$-X2X3DB1,?,?,?,2LEN3EQU$-X3X4DW?,1234H,?LEN4EQU$-X420·CODE;代码段·STARTUPMOVAX,LEN1MOVBX,LEN2MOVCX,LEN3MOVDX,LEN4·EXITEND重复定义操作符(DUP)•用于定义重复的元素【例4-7】ARRAY1DB2DUP(1,2,2,?)ARRAY2DB50DUP(?)如图4-8【例4-8】DUP可以嵌套ARRAY3DB2DUP(0,2DUP(1,2),3)ARRAY3的长度为12个字节,该伪指令的存储结构如图4-9所示21图4-9图4-8使用地址表达式作为DW或DD的操作数•地址包括:数据段中定义的变量名或数组名,代码段中的标号或子程序名【例4-9】设LOP为代码段的一个标号,MAX为代码段中的某一子程序名,则在数据段中有如下定义:X1DW1234H;定义字变量X1,并赋初值1234HX2DWX1;定义字变量X2,所赋初值是变量X1的偏移地址X3DDX1;定义双字变量X3,所赋初值是变量X1的逻辑地址X4DWLOP;LOP偏移地址X5DDLOP;LOP逻辑地址X6DWMAX;MAX偏移地址X7DDMAX;MAX逻辑地址X8DW$;定义字变量X8,所赋初值是X8的偏移地址(当前地址)22练习•给出如下程序中的数据定义,问PLENTH的值为多少?它表示什么意义?PARTNODW?PNAMEDB16DUP(?)COUNTDD?PLENTHEQU$-PARTNO•答:PLENTH=22=16H,它表示变量PARTNO、PNAME、COUNT总共占用的存储单元数(字节数)23标号•标号是用来说明可执行指令在汇编语言程序中的位置•例如:…LP1:MOVAX,X…LOOPLP1;转移到标号LP1处的指令24标号•标号三个属性:•标号的段属性•标号的段属性是指标号定义所在段的段地址。•标号的偏移属性•标号的偏移属性是指标号所在段的首地址到该标号的定义语句的偏移量。•标号的类型属性•标号的类型属性是指标号距转移指令的距离,是转移到本段内的标号,还是转移到其它段的标号。(即是NEAR还是FAR).25运算符与表达式•算术运算符•逻辑运算符•关系运算符•数值回送操作符•属性操作符(PTR、:、THIS、SHORT、HIGH、LOW)•移位运算符•运算符的优先级26算术运算符•算术运算符包括:+、-、*、/、MOD(取余)。•运算符MOD是作除法操作,取余数,如:10MOD3=1。•需要注意的问题:•算术运算符可以用于数值表达式或地址表达式中,参加运算的数和结果必须是整数,除法运算结果只有商无余数•当算术运算符用于地址表达式时,常用方法是“地址±常量”来描述指针的移动27【例4-10】把首地址为BLOCK的字数组的第5个字送到AX中:MOVAX,BLOCK+(5-1)*2【例4-11】将数组长度(双字数)存到CX中:ARRAYDD1,2,3,4,5,6,7COUNTDD?┆MOVCX,(COUNT-ARRAY)/4┆假设数组ARRAY的地址是2000H,则COUNT=201CH(COUNT-ARRAY)/4=(201CH—2000H)/4=0007H28逻辑运算符•包括:AND(逻辑与)、OR(逻辑或)、XOR(逻辑异或)、NOT(逻辑非)。•【例4-12】执行下列指令,计算其逻辑运算的值。MOVAL,88HAND0FH;AL=08HMOVBL,88HOR0FH;BL=8FHMOVCL,88HXOR0FH;CL=87HMOVDL,NOT88H;DL=77HANDAL,88HAND0FH;两个AND是有区别的。•注意:逻辑运算符与逻辑指令的区别。逻辑运算符在汇编程序汇编时计算,而逻辑指令在程序运行时执行。29关系运算符•包括:EQ(等于)NE(不等于)LT(小于)LE(小于等于)GT(大于)GE(大于等于)•关系运算符的使用格式:表达式1关系运算符表达式2•计算结果:真为全1,假为全0。30关系运算符【例4-13】MOVAX,((XLT10)AND0F0FH)OR((XGE10)AND0505H)•该指令说明:•当X10做MOVAX,0F0FH•否则当X=10做MOVAX,0505H31数值回送操作符•包括:SEG、OFFSET、TYPE、LEN
本文标题:汇编语言-4
链接地址:https://www.777doc.com/doc-5102136 .html