第4章汇编语言程序设计1.1_第1页
第4章汇编语言程序设计1.1_第2页
第4章汇编语言程序设计1.1_第3页
第4章汇编语言程序设计1.1_第4页
第4章汇编语言程序设计1.1_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、1mov ax,12hcall displayjmp 1234h2345源程序的编译程序源程序的编译程序汇编程序汇编程序汇编语言汇编语言源程序源程序机器语言机器语言目标程序目标程序6notepad等 等 等 等 目前都把上述的软件集成在统一的环境下,以方便用户使用。78堆栈段数据段代码段真指令90000:03ff环境与代码运行环境与代码运行ffff:0堆栈段堆栈段数据段数据段代码段代码段cs:ipdsss:sp系统起始运行程序系统起始运行程序中断向量区中断向量区(系统专用)(系统专用)栈底最多4个活动段分段结构分段结构es1011121314注释不能加程序的汇编,不生成目标程序,只为阅读方便。

2、15汇编语言的一个实例: hello.asm hello db hello, world!,0dh,0ah assume cs:prog,ds:datastart: mov ax,data mov ds,ax lea dx,hello;取字符串首地址 mov ah,9 int 21h;显示字符串 mov ah,4ch int 21h;退回dos名字标号1617如如 start : mov ax, data jmp/call start hello db 06h,45h,44hptr18如如 start : mov ax, dataptr1920注:变量要事先定义才能使用变量类型应与指令要求的操

3、作数类型相符。例:mov bl,v1; 要求v1应该是字节属性的变量。变量定义后,变量名只对应这个数据区的首地址,若有这个数据区有若干个数据项时,其地址要改变。指令中的操作数的段基地址不直接表示出来,是默认的。在使用变量时,其段属性应与其所指的段寄存器相符,若不相符,要加上段超越。21如如 start : mov ax, 22232425注意注意:seg、offset只能对符号地址操作只能对符号地址操作mov ax , seg bxmov bx , offset si26例:例:var dw 1,2,3,4,5 type 取取length 取所定义取所定义的长度的长度size 取所定义存储区的

4、字节数取所定义存储区的字节数 (=type * length)27length和和size运算符的具体运算规则是:如果变量运算符的具体运算规则是:如果变量是用重复操作符是用重复操作符dup定义的,那么运算符定义的,那么运算符length的运的运算结果是外层算结果是外层dup的给定值的给定值 (即外层重复次数),如(即外层重复次数),如果没有用果没有用dup定义的变量,运算结果总是定义的变量,运算结果总是1。 而运算符而运算符size是是length和和type两个运算结果的乘积。两个运算结果的乘积。 【例例】取出变量占存储单元个数。取出变量占存储单元个数。 datasegment a dbab

5、cdef bdw10dup(1,2dup(2) dataends mov ax,length a;1ax mov bx,lengthb;10bx 28 size a = length a*type a = 1 size b = length b*type b = 20若buffer存储区是用如下伪指令定义: buffer dw 200 dup(0) 则: type buffer 等于2 length buffer等于200 size buffer等于4002930317)其它运算符方括号“ ” 指令中用方括号表示存储器操作数,方括号的内容表示操作数的偏移地址例:mov ax,1000h段重设运

6、算符“:”它跟在段寄存器名之后,表示段重设,用来指定一个存储器操作数的段属性而不管其原来的隐含的段是什么。例:mov ax,es:di32333435n变量名为用户自定义标识符,表示操作数首元素的逻辑地址;用这个符号表示地址,常称为符号地址n变量名可以没有。这种情况,汇编程序将直接为初值表分配空间,无符号地址n设置变量名是为了方便存取它指示的存储单元变量名363738394005h10h00h01hfchffhfbhffh00h00h0ah41strhello注意注意: :下面两个定义的不同之处:dbab ;41h在低字节,42h在高字节(先a后b)dw ab ;42h在低字节,41h在高字节

7、(先b后a)48h45h4ch4ch4fh注意注意:3个及其以上的个及其以上的字符,只能用字符,只能用db定义定义42434445定义定义引用引用4647和48逻辑段从一个节节 (16个字节) 的边界开始。即段的起始地址应能被16整除, 或这说段起始物理地址应为0h。默认类型逻辑段从字节字节边界开始,即段可以从任何地址开始。逻辑段从字字边界开始。即段的起始地址必须是偶数。逻辑段从页页边界开始。256字节称为一页,故段的起始物理地址应为00h。也即:也即:page(页边界页边界) - 能被能被256除;除;para(段边界段边界) -能能被被16除除; word(字边界字边界) - (能被能被2

8、除除);byte (字节边界字节边界) 段名段名 segment 定位类型定位类型 组合类型组合类型 类别类别49 功能功能:用在具有多个模块的程序中用在具有多个模块的程序中,用于说明用于说明不同模块中不同模块中同名段同名段的组合方式,的组合方式,共共6种种: none : 本段与其它逻辑段不组合本段与其它逻辑段不组合 。 public: 所有此类型的同名段同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中,构成一个大的逻辑段。 stack : 专用于说明堆栈段,组合方式同public common : 所有此类型的同名段具有相同的起始地址(覆盖),各个逻辑段重叠在一起,共享相同

9、的存储区域。 memory :本逻辑段置于地址最高处,多个时取第一个,置于地址最高处,多个时取第一个,其余作为其余作为common at :使段地址是表达式所计算出来的16位值,cs除外。50【例例】有两个模块,各模块段定义如下有两个模块,各模块段定义如下模块模块1 1: data1data1segmentsegment para public para public data1data1m1m1db 45h dupdb 45h dup(0 0)data1data1endsendsdata2data2segment para common segment para common data2da

10、ta2n1 db 102h dupn1 db 102h dup(0 0)data2data2endsendsend end 模块模块2 2:data1data1segment para public segment para public data1data1m2m2db 104h dupdb 104h dup(11h11h)data1data1endsendsdata2data2segment para common segment para common data2data2n2n2db 105h dupdb 105h dup(0 0)data2data2endsendsdata3data

11、3segmentsegmentt1t1db 50 dupdb 50 dup(20h20h)data3data3endsendsendend51该段的定位组合方式示意图如图所示。该段的定位组合方式示意图如图所示。 5253例例: data1segment adb 1,2,3 data1ends code segment code ends5455 段定义伪操作:段定义伪操作:完整的段定义格式举例完整的段定义格式举例 data segment ; 定义数据段定义数据段 data ends;-extra segment ; 定义附加段定义附加段 extra ends;-code segment ;

12、定义代码段定义代码段 assume cs:code, ds:data, es:extrastart: mov ax, data mov ds, ax ; 段地址段地址 段寄存器段寄存器 code ends end start注注:汇编时汇编时,系统自动将代系统自动将代码段的段地址装入码段的段地址装入cs,不不用在程序中初始化用在程序中初始化,其它其它的段则要用指令把其初的段则要用指令把其初始化始化.56结论:结论:1. assume语句只起指示作用语句只起指示作用, 没有赋值作用没有赋值作用2. 程序中用到内存操作数时,程序中用到内存操作数时, 应按操作数的寻址方式应按操作数的寻址方式, 给相

13、应的段寄存器赋值给相应的段寄存器赋值。57若为近调用,则类型可省58程序经汇编、连接及装入内存后程序经汇编、连接及装入内存后, 过程名为一具体的过程名为一具体的内存地址内存地址,指示子程序入口。,指示子程序入口。过程名常用作过程名常用作call调用指令的操作数调用指令的操作数,子程的最后安排子程的最后安排ret返回指令,使执行完子程后能返回调用处。返回指令,使执行完子程后能返回调用处。59例例1 display proc ret ;near 属性的过程对应段内返回属性的过程对应段内返回 display endp例例2 display proc far ret ;far属性的过程对应段间返回属性

14、的过程对应段间返回 display endp60宏指令:宏指令:是源程序中具有独立功能的一段程序代码,是源程序中具有独立功能的一段程序代码,程序员事先根据需要自定义的程序员事先根据需要自定义的“指令指令“。此后在宏指令。此后在宏指令出现的地方,汇编程序自动把它们替换成相应的语句序出现的地方,汇编程序自动把它们替换成相应的语句序列。宏指令的使用过程为宏定义、宏调用。列。宏指令的使用过程为宏定义、宏调用。 1、宏定义、宏定义 格式:格式:宏指令名宏指令名 macro 形参形参,形参,形参 endm 61说明:说明: 宏指令名是为该宏定义所起的名字,可以象指宏指令名是为该宏定义所起的名字,可以象指令

15、助记符一样出现在源程序中;令助记符一样出现在源程序中; 形参间用逗号隔开,在宏指令调用时,形参被形参间用逗号隔开,在宏指令调用时,形参被实参依次取代,形参为可选项;实参依次取代,形参为可选项; macro表示宏定义开始,表示宏定义开始,endm表示宏定义结表示宏定义结束,二者之间的程序段称为宏体。束,二者之间的程序段称为宏体。 6263 上面宏定义中,x、y、z是形式参数。 调用宏dadd时可写为: dadd data1,data2,sum 上面宏调用中,data1,data2,sum是实际参数,由它们替换定义中的x、y、z,即形实结合形实结合。64call retcall call 相同=或

16、主程序+过程(子程序)主程序+宏定义宏扩展宏调用 与 过程(子程序)调用 异同点示意图65 宏调用 与 过程(子程序)调用 异同点相同点: 都是一次定义,多次调用。不同点: 执行形式执行形式:宏命令伪指令由宏汇编程序在汇编过程中进行处理;而call、ret则是由cpu执行的指令。 汇编结果汇编结果:宏命令伪指令汇编后被展开。 执行速度执行速度:宏命令执行速度较快(因无调用转移) 占用内存占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元; 使用过程可以节省代码(源程序和目标程序)占用的内存空间。666768(1) name 伪指令伪指令 格式:格式: name 模块名模块名在源

17、程序开始可用在源程序开始可用 name 模块命名模块命名,模块名的模块名的作用是指示给作用是指示给。 源程序中可无模块定义,此时源文件名作为模块名。源程序中可无模块定义,此时源文件名作为模块名。4.2.8模块定义和连接伪指令模块定义和连接伪指令69(2)模块间通信伪指令)模块间通信伪指令 在编写规模较大的汇编语言源程序时,可以将整个程序在编写规模较大的汇编语言源程序时,可以将整个程序划分为几个独立的源程序,称之为模块。划分为几个独立的源程序,称之为模块。 将各模块分别进行汇编,生成各自的目标程序,最后将将各模块分别进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。它们连接成为一个完整的可执行程序。 各模块之间可以相互进行符号访问。各模块之间可以相互进行符号访问。 为了进行模块之间连接和实现相互的符号访问,以便进为了进行模块之间连接和实现相互的符号访问,以便进行变量传送,通常使用以下

温馨提示

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

评论

0/150

提交评论