汇编语言(王爽)_第1页
汇编语言(王爽)_第2页
汇编语言(王爽)_第3页
汇编语言(王爽)_第4页
汇编语言(王爽)_第5页
已阅读5页,还剩310页未读 继续免费阅读

下载本文档

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

文档简介

1汇编语言清华大学出版社王慧软件12-12目录第1章基础知识第2章寄存器(CPU工作原理)第3章寄存器(内存访问)第4章第1个程序第5章[bx]和loop指令第6章包含多个段的程序第7章更灵活的定位内存地址的方法第8章数据处理的两个基本问题3第9章转移指令的原理第10章call和ret指令第11章标志寄存器第12章内中断第13章int指令第14章端口第15章外中断第16章直接定址表4本课程的内容与要求1、地位 计算机相关专业的必修基础课,与《微机原理》、《计算机组成原理》、《操作系统》等课程关系紧密,是一门重要的专业基础课。 先修知识:C语言或其它高级语言、二进制及十六进制的运算52、内容:各章主要知识点目的:掌握汇编语言的编辑、结构,充分获得底层编程的体验,深刻理解机器运行程序的机理。为相关课程的深入学习打好基础。3、要求:不缺课、不迟到,认真听课。独立完成作业、实验及各章节检测点。认真思考每章的问题和分析,自觉学习附注内容。循序渐进按每章的(1)知识点、(2)检测点、(3)问题和分析、(4)实验。四个步骤认真学习,遇到困难及时解决。64、考核:5、温故知新:6、推荐几个网站:7、教学进度安排:7第1章基础知识机器语言汇编语言的产生和组成存储器指令和数据存储单元CPU对存储器的读写三总线结构8一、机器语言机器指令:是一系例由二进制数(0或1)组成的代码构成的,机器唯一能正确执行的命令。机器语言:机器指令的集合。例书中第1、2页:特点:难记忆、可读性差、不易修改,直接面向机器,所以不同的微处理器可有不同的机器语言。但编写的程序占用内存小,运行速度快,能直接对硬件控制。注:本教材主要面向80X86CPU9二、汇编语言的产生汇编语言:是机器语言便于记忆的书写格式。例:操作;将寄存器BX中的内容送到AX中机器指令:1000100111011000汇编指令:MOV AX,BX特点:兼有机器语言的优点,比机器语言易记易学,但通用性差,随机而异。寄存器:是CPU中可以存储数据的器件。10机器语言由0、1组成的二进制代码:1000100111011000汇编语言是机器语言的助记格式:MOV AX,BX高级语言是更接近于生活用语的书写格式:C、BASIC、PASCAL、FORTRAN注:计算机只能执行机器指令,所以用非机器语言写出的程序都必须翻译成机器语言后才能被计算机执行。源程序:用高级语言(包括汇编)编写的程序。汇编:用汇编程序将源程序翻译成机器代码的过程。源程序编译器机器语言计算机11三、汇编语言的组成由以下几类组成:汇编指令(指令性语句):机器码的助记符,有对应的机器码。(例:MOVAX,BX)伪指令:没有对应的机器码,由编译器识别,没有对应的机器码。(例:SEGMENT…..)其它符号(运算符):+、-、*、/等,由编译器识别,没有对应的机器码。宏指令:注:汇编语言的核心是汇编指令,本书主讲80X86指令。数据传送指令:MOV、XCHG、LEA、PUSH、POP算术运算指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV逻辑运算和移位指令:AND、OR、XOR、SAL/SHL、SAR/SHR、ROL、ROR串操作指令:MOVS、CMPS、REP、LODS程序控制指令:JMP、CALL、RET、JNS、JNE、JL、JG、LOOP、INT输入输出指令:IN、OUT12四、存储器

存储器(内存)是计算机中仅次于CPU的核心部件,由它向CPU提供要运行和处理的数据。存储器外部存储器内部存储器(光盘、软盘、硬盘)(ROM、RAM)CPU数据数据结果注:CPU不能直接和磁盘交换数据,必须由内存来交换。13五、指令和数据指令:是告诉计算机做什么工作。数据:是计算机(CPU)要处理的对象。注:指令和数据在形式上完全相同,都是一组二进制信息,但应用上意义不同。例:数据89D8H——1000100111011000指令MOV AX,BX——100010011101100014六、存储单元

将存储器划分成若干个基本的存储单位,称为存储单元。给每个存储单元从0开始顺序编号,称为存储单元的地址。内存0123....127100111000110111111100011存储单元位(bit):计算机的最小信息单位,即一位二进制数(0或1)字节(Byte):1Byte=8bit

一个存储单元可以存储一个字节即8bit的信息。1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB15七、CPU对存储器的读写CPU可以从存储器中取出数据进行处理(读)CPU将处理后的数据放到存储器中保存(写)思考:CPU如何选择要读/写的对象(寄存器、ROM、RAM、接口)CPU如何找到要处理的数据。16CPU传送的三种信息存储单元的地址(地址信息)选择芯片、读或写的命令(控制信息)读或写内存的数据内容(数据信息)CPU2331089C3B12543210地址总线3数据总线控制总线0808读内存命令→机器码:101000000000001100000000汇编指令MOV AX,[3]17八、地址总线CPU地址总线内存数据总线控制总线访问地址为12的内存单元时,地址总线上传送的内容?一个CPU有N根地址线,则可说这个CPU的地址总线宽度为N。可寻址空间为2N个存储单元。思考:1个CPU的寻址空间为1KB,那么它的地址总线的宽度为多少?所能表示的地址范围为多少?18九、数据总线

数据总线的宽度决定了CPU和外界的数据传送速度,N根数据线一次可以传送N个bit的数据。8088CPU数据总线内存地址总线控制总线19十、控制总线

CPU对外部器件的控制是通过控制总线进行的,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着,这个CPU提供了对外部器件的多少种控制,所以控制总线的宽度决定了CPU对外部器件的控制能力。20小结检测点1.121十一、内存地址空间(概述)

一个CPU可以寻到的内存单元的范围称为该CPU的内存地址空间。

例:8086CPU的地址总线为20根,所以其内存地址空间为00000H—FFFFFH,共有1MB。十二、主板十三、接口卡22十四、各类存储器芯片随机存储器(RAM) 用于存放供CPU使用的绝大部分程序和数据。装有BIOS的只读存储器(ROM)接口卡上的RAM十五、内存地址空间CPU在控制各类存储器时,把它们都当作内存来对待,把它们总的看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们这里所说的内存地址空间。23第二章 寄存器(CPU工作原理)运算器控制器寄存器信息处理控制各种器件进行工作信息存储总线内部总线外部总线连接CPU内部各器件的总线连接CPU与外部各器件的总线CPU248088/86微处理器的内部结构执行部分EU总线接口部分BIU返回25寄存器组AXBXCXDXSPBPSIDI8位8位AHALAXBHBLBXCHCLCXDHDLDX16位寄存器通用寄存器累加器基址计数器数据指针寄存器变址寄存器堆栈指针基数指针源变址目的变址26寄存器组IPPSWCSDSSSES控制寄存器段寄存器状态标志指令指针代码段数据段堆栈段附加段提供相应的段地址。27一、通用寄存器8086CPU的内部寄存器都是16位。将AX、BX、CX、DX四个寄存器称为通用寄存器。通用寄存器可分为两个独立的8位寄存器来用。AX寄存器的逻辑结构15141312111098765432100000000000010010MOVAX,18MOVAX,2000001001110001000002816位寄存器分成两个8位寄存器的使用情况AX寄存器的逻辑结构1514131211109876543210AX寄存器的逻辑结构15141312111098765432107654321076543210AHAL0100111000100000寄存器寄存器中的数据所表示的值AXAHAL010011100010000020000(4E20H)0100111078(4EH)0010000032(20H)一个8位寄存器所能存储的数据的最大值是多少?一个16位寄存器所能存储的最大值又是多少?29二、字在寄存器中的存储字节(Byte):由8个比特组成;可以存在8位寄存器中。字(word):由两个字节组成;这两个字节分别称为这个字的高位字节和低位字节。注:一个16位寄存器中的数据即可以看成一个字型数据,也可以看作两个字节型数据。例:可看成一个字型数据20000存在AX中,也可看成两个独立的字节型数据分为为78和32。0100111000100000010011100010000030三、几条汇编指令注:在汇编语言中英文字母不区分大小字。汇编指令控制CPU完成的操作用高级语言描述MOVAX,18将18送入寄存器AXAX=18MOVAH,78将78送入寄存器AHAH=78ADDAX,8将寄存器AX中的数值加上8AX=AX+8MOVAX,BX将寄存器BX中的数据送入AXAX=BXADDAX,BX将AX和BX中的数值相加,结果保存在AX中AX=AX+BX31程序段中的指令AX中的数据BX中的数据MOVAX,4E20HADDAX,1406HMOVBX,2000HADDAX,BXMOVBX,AXADDAX,BX设原AX=BX=0000H,分析下列指令执行后AX,BX中的数据为多少?4E20H0000H6226H0000H6226H2000H8226H2000H8226H8226H8226H+8226H=1044CH AX=?044CH8226H注:当所保存的数据位数大于寄存器的位数时,高位的数据会丢失,称为数据溢出。32程序段中的指令AX中的数据BX中的数据MOVAX,001AHMOVBX,0026HADDAL,BLADDAH,BLADDBH,ALMOVAH,0ADDAL,85HADDAL,93H001AH 0000H001AH 0026H0040H 0026H2640H 0026H2640H 4026H0040H 4026H00C5H 4026H0058H 4026H注:当通用寄存器作为8位寄存器使用时,低8位和高8位相当于两个独立的寄存器,它们之间没有直接关系,不能产生进位。ADDAX,85HAX=?ADDAX,93HAX=?33注意:

在进行数据传送或运算时,要注意指令的操作数的位数要匹配。例:数据位数不匹配的指令

MOV AX,BL MOV BH,AX MOV AL,20000 ADD AL,100H作业:18页检测点2.1(1)、(2)34四、物理地址

我们给每个存储单元给了唯一的一个编号,这个编号就是这个内存单元的物理地址。在8086/8088CPU中对外有20根地址线寻址,所以其系统中的内存单元物理地址为20位的地址编号。35五、16位结构的CPU16位机:运算器一次最多可以处理16位的数据。寄存器的最大宽度为16位;寄存器和运算器之间的通路为16位。36六、8086CPU给出物理地址的方法1)CPU中的段寄存器(CS)提供段地址,指令指针寄存器(IP)提供偏移地址;2)段地址和偏移地址通过内部总线送入地址加法器;3)地址加法器将两个16位地址合成一个20位的物理地址;4)地址加法器将20位的物理地址送输入输出控制电路;5)输入输出控制电路将20位物理地址送上外部地址总线;6)地址总线将20位物理地址送入内存,寻址。其他部件地址加法器输入输出控制电路偏移地址段地址16位物理20位内存20位物理地址16位数据总线16位控制总线CPU物理地址=段地址×16+偏移地址=段地址(左移4位)+偏移地址返回378088CPU访问内存单元工作过程

访问地址为123C8H的内存单元时,地址加法器的工作过程(数据皆为十六进制表示)CSIP寄存器组地址加法器1230H00C8H相关部件提供段地址和偏移地址段地址和偏移地址送入地址加法器123000C8段地址左移1位(×

16)1230000C812300+00C8123C8段地址+偏移地址形成20位物理地址输出20位物理地址123C8H地址加法器的工作过程38段地址:×16=左移4位(2进制)=左移1位(16进制)左移位数二进制十六进制十进制010B2H22×201100B4H42×2121000B8H82×22310000B10H162×234100000B20H322×24一个数据的二进制形式左移N位,相当于该数据乘以2N加法器左移4位相当于乘以24(16)39七、“段地址×16+偏移地址=物理地址”的本质含义

本质含义:CPU在访问内存时,用一个基础地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出了内存单元的物理地址。40八、段的概念

段是我们为了管理内存而引入的一个虚拟的概念,我们可以将内存地址连续、起始地址为16的倍数的一组内存单元看作一个段来管理,但事实上,内存并没有被真正划分成段。注:段地址×16必然是16的倍数,所以一个段的起始地址一定是16的倍数(即:XXXX0H);偏移地址为16位,所以一个段的长度最大为64KB。41思考:观察下面的地址物理地址 段地址 偏移地址21F60H 2000H 1F60H 2100H 0F60H 21F0H 0060H 21F6H 0000H 1F00H 2F60HCPU可以用不同的段地址和偏移地址形成同一个物理地址。42如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可定位多少内存单元?43九、段寄存器 在CPU中提供段地址的寄存器符号名称作用配合寄存器CS代码段提供(程序、指令)段地址IPDS数据段用于存放数据的存储器段的起始地址。(包含程序使用的大部分数据的存储区域)SS堆栈段定义堆栈的存储区SPES附加段存放附加存储器段的段地址。常用于存放数据或串操作中作目标数据段44十、CS和IPCS—代码段:提供当前要执行的指令的段地址。IP—指令指针寄存器:指向当前要执行的指令的偏移地址。 由CS和IP分别提供一个16位的段地址和偏移地址,经地址加法器合成一个20位的物理地址,该地址为当前要执行的指令所在的位置(CS:IP)。45AXBX其他部件CSIP指令缓冲器执行控制器地址加法器输入输出控制电路2000A20009D8200080120007D820006892000500200040320003BB2000201200012320000B8CPU内存地址总线数据总线Movax,0123HMovbx,0003HMovax,bxAddax,bx若当前CPU中的状态为:CS=2000,IP=00002000000020000200002000020000B82301B82301000100020003000320003B8230120003B823012000320003BB03000123BB0300000620006B9D8000800032000801D8000A00032000A000646AXBX其他部件CSIP指令缓冲器执行控制器地址加法器输入输出控制电路2000A20009D8200080120007D820006892000500200040320003BB2000201200012320000B8CPU内存地址总线数据总线Movax,0123HMovbx,0003HMovax,bxAddax,bx(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;IP+nN=所取指令的长度。(2)IP=IP+N,从而指向下一条指令;(3)执行和处理取到的指令,重复步骤(1)由CS:IP指向CPU将要执行的指令所在的物理地址,取到指令后,IP会自动增加N指向下一条指令所在的位置;从而使计算机能够自动连续的执行一个完整的程序。47十一、修改CS、IP的指令若想同时修改CS、IP的内容,可用jmp 段地址:偏移地址指令例:

jmp 2AE3:3则CS=2AE3H,IP=0003H若只修改IP的内容,可用

jmp某一合法寄存器 指令例:jmpAX则执行后IP=AX注意:CS和IP不充许直接赋值。MOVCS,1000HMOVCS,AXMOVIP,2000H48A6622B8E3FFD88B0000B80123B820005H20006H20004HJmp1000:320003H20009HMovcx,ax20008H20007H20002H20001HMovax,6622H20000H10009HJmpbx10008H10007HMovbx,ax10006H10005H10004HMovax,0000H10003H10002H10001HMovax,0123H10000H已知:CPU的初始状态:CS=2000H,IP=0000H,内存单元情况见右表,试分析指令执行序列。MOVAX,6622HJMP1000:3MOVAX,0000H2000:00002000:00031000:0003MOVBX,AX1000:0006JMPBX1000:0008AX=6622HBX=0000HAX=6622HBX=0000HAX=0000HBX=0000HAX=0000HBX=0000HAX=0000HBX=0000H1000:0000MOVAX,0123HAX=0123HBX=0000H1000:000349十二、代码段段:我们可以根据需要将内存中从XXXXH:0000H开始到XXXXH:YYYYH之间一段连续的内存空间做为一个段来使用。代码段:用来存放指令的段称为代码段,代码段由CS:IP来确定。50小结16位CPU的内部结构寄存器段地址、偏移地址、物理地址CPU执行指令的过程Debug调试程序的使用51寄存器是CPU中存储信息的器件8086CPU中的寄存器都为16位通用寄存器AX,BX,CX,DX都可分两个独立的8位寄存器来使用。段寄存器是CPU中提供段地址的寄存器。其中CS:IP始终指向CPU将执行指令的物理地址。返回52第三章寄存器(内存访问)AXBX其他部件CSIP指令缓冲器执行控制器地址加法器输入输出控制电路2000A20009D8200080120007D820006892000500200040320003BB2000201200012320000B8CPU内存地址总线数据总线Movax,0123HMovbx,0003HMovax,bxAddax,bx53一、内存中字的存储110001111111011000111001内存单元寄存器的逻辑结构1514131211109876543210字单元:即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。0110111110011100字单元54020H14EH212H300H45例:1)0地址单元中存放的字节型数据是多少?2)0地址字单元中存放的字型数据是多少?3)2地址单元中存放的字节型数据是多少?4)2地址字单元中存放的字型数据是多少?5)1地址字单元中存放的字型数据是多少?55二、DS和[address]DS—数据段寄存器:提供数据所在内存的段地址。[address]:表示一个偏移地址为address的内存单元。例:[1234H]指偏移地址为1234H的内存单元。

[AX]指偏移地址为(AX)的内存单元。10000H20H10001H4EH10002H12H10003H00H10004H10005HMOV BX,1000HMOV DS,BXMOV AL,[0000H]CPU要存取内存中的数据时,段地址默认在DS寄存器中,偏移地址在指令中给出。56通用寄存器AX、BX、CX、DX、BP、SP、SI、DI、AL、AH、BL、BH、CL、CH、DL、DH存储器立即数段寄存器CS、DSES、SSCS只能作源操作数MOV AX,1234HMOV BL,12HMOV CX,03HMOV [0],12HMOV [0200H],1234HMOV [AX],03HMOV AX,BXMOV DX,AXMOV BL,ALMOV AX,[0]MOV [0],AXMOV BL,[AX]MOV AX,DSMOV DS,AXMOV AX,CSMOV CS,AX

MOV DS,[0]MOV [1],ESMOV [AX],CS57判断下列指令是否正确,若错误,为什么?1、MOVCL,1000H2、MOV AL,[1000H]3、MOV[BX],[SI]4、MOVAH,BH5、MOVAX,[SI]6、MOV 1234H,BX7、MOVCL,AX8、MOVCS,AX9、MOV DS,CS58问题:试写几条指令,将AL中的数据保存到内存单元12345H中。 MOV BX,1000H MOV DS,BX MOV [2345H],AL59三、字的传送MOV BX,1000HMOV DS,BXMOV AX,[0] ;将1000:0处的字型数据送入AX中MOV [0],CX ;将CX中的16位数据送到1000:0处MOV BH,[0]

;将1000:0处的字节型数据送入BH当向内存单元中存取数据时,若操作的为字节型数据则一次读写一个内存单元,若为字型数据则按低地址为低8位,高地址为高8位的原则存取数据。60例:内存单元中的情况如图所示,写出下面指令执行后寄存器AX,BX,CX中的值。

MOV AX,1000H MOV DS,AX MOV AX,[0] MOV BX,[2] MOV CX,[1] ADD BX,[1] ADD CX,[2]10000H23H10001H11H10002H22H10003H66HAX=1000HDS=1000HAX=1123HBX=6622HCX=2211HBX=8833HCX=8833H61例:内存单元中的情况如图所示,写出下面指令执行后内存中的值。

MOV AX,1000H MOV DS,AX MOV AX,11316 MOV [0],AX MOV BX,[0] SUB BX,[2] MOV [2],BX10000H23H10001H11H10002H22H10003H11HAX=1000HDS=1000HAX=2C34HBX=2C34HBX=1B12H34H2CH12H1BH62四、 MOV、ADD、SUB指令一条指令包括如下内容:1)操作码:指令所执行的操作。2)操作数:指令操作的对象,包括操作数的来源,操作结果的去向。操作对象通常为存储器地址,寄存器或立即数。例:MOVAX,03HMOV操作码操作数AX,03H目的操作数AX源操作数03H63通用寄存器AX、BX、CX、DX、BP、SP、SI、DI、AL、AH、BL、BH、CL、CH、DL、DH存储器立即数段寄存器CS、DSES、SSMOV AX,8MOV AX,BXMOV AX,[0]MOV [0],AXMOV DS,AXCS只能作源操作数MOV AX,DSMOV AX,CSMOV [0],DSMOV [0],CSMOV DS,[0]MOV CS,AXADD DS,AXADD DS,[0]64五、 数据段XXXX001H12H23H34H45H56H67H78H89H9AHABH123B0H123B1H123B2H123B3H123B4H123B5H123B6H123B7H123B8H123B9H123BAHDS[address]地址加法器MOV AX,123BHMOV DS,AXMOV AL,0ADD AL,[0]ADD AL,[1]ADD AL,[2]65六、栈(堆栈)栈:是具有特殊的访问方式的存储空间。栈有两个基本操作:入栈;出栈。DCBADCBADCBA66七、CPU提供的栈机制、PUSH和POP指令堆栈指令PUSH堆栈压入指令格式:

PUSHOP(操作数)功能:将OP中的内容放入堆栈段中POP堆栈弹出指令格式:POPOP功能:将堆栈段中的内容弹出到OP。说明:OP可以是段寄存器(CS除外)、通用寄存器或内存的字单元。PUSH AXPUSH DSPUSH[0]POP AXPOP DSPOP[0]6710000H10009H1000AH1000BH1000CH1000DH1000EH1000FH设现有10000H—1000FH为一栈段MOV AX,0123HPUSHAX0123MOVBX,2266HPUSHBX2266MOVCX,1122HPUSHCX1122POPAXAX=1122HPOPBXBX=2266HPOPCXCX=0123HCPU如何知道堆栈段在哪里?执行PUSH、POP指令时,CPU如何找到要操作的位置?68CPU执行指令——CS:IPCPU读写内存数据—DS:[address]CPU进行堆栈操作—SS:SPSS—堆栈段寄存器:指定堆栈段的段地址SP—堆栈指针寄存器:指向栈顶的偏移地址任意时刻,SS:SP指向栈顶地址。69PUSH入栈过程10000H1000BH1000CH1000DH1000EH231000FH01当前:SS=1000H,SP=000EH,AX=2266HPUSHAX栈顶66栈顶1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶。222)将AX中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。70POP出栈过程10000H1000BH1000CH1000DH1000EH231000FH01POPAX栈顶66栈顶1)将SS:SP指向的内存单元处的数据送入AX中;222)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。当栈空时,栈顶的位置为多少?71八、栈顶超界的问题10000H1000BH1000CH1000DH1000EH1000FH10010H栈空间SS:SP768798235645342312当栈满时再执行PUSH指令入栈,或在栈空时执行POP指令出栈,都将发生栈顶超界的问题。在8086CPU中没有预防栈超界的机制,所以程序员必须自己考虑,防止栈超界。72九、PUSH、POP指令例:编程,将10000H—1000FH这段空间当作栈,初始状态栈是空的,将AX,BX,DS中的数据入栈。MOVAX,1000HMOVSS,AXMOVSP,0010HPUSHAXPUSHBXPUSHDS73例:编程:将10000H—1000FH这段空间当作栈,初始状态是空的;设置AX=001AH,BX=001BH;将AX,BX中的数据入栈;然后将AX、BX清零;从栈中恢复AX、BX原来的内容;MOVAX,1000MOVSS,AXMOVSP,0010HMOVAX,001AHMOVBX,001BHPUSHAXPUSHBXSUBAX,AXSUBBX,BXPOPBXPOPAX74例:编程将10000H—1000FH这段空间作栈,初始状态栈是空的;设置AX=002AH,BX=002BH;利用栈,交换AX和BX中的数据。MOVAX,1000HMOVSS,AXMOVSP,0010HMOVAX,002AHMOVBX,002BHPUSHAXPUSHBXPOPAXPOPBX75例:如果要将10000H处写入字型数据2266H,可以用以下指令完成:

MOVAX,1000H MOVDS,AX MOVAX,2266H MOV[0],AX补全下面的代码,使它能够完成同样的功能————————————————————————MOVAX,2266HPUSHAX76十、栈段分析:如果我们将10000H—1FFFFH这段空间作栈段,初始状态栈是空的,此时SS=1000H,SP=?一个栈段最大可以设为多少?作业:P52页检测点3.1(1)、(2)P66页检测点3.2(1)、(2)77第4章第1个程序一个源程序从写出到执行的过程程序加载并运行的原理程序执行过程的跟踪、调试78一、一个源程序从写出到执行的过程第一步:编写汇编源程序产生文本文件(.txt)第二步:对源程序编译产生目标文件(.obj)第三步:对目标文件连接产生可执行文件(.exe)第四步:执行可执行文件程序79二、源程序

汇编源程序:用汇编语言写出的程序代码ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND80汇编指令:告诉计算机如何处理数据的命令。例:MOVADDSUBJMPPUSHPOP注:每条汇编指令都有一一对应的机器代码,编译后产生对应的机器码,最终被CPU执行。1、伪指令:不要求CPU执行具体操作,汇编时不产生机器码,仅仅给汇编程序提供相应的汇编信息。(程序中段的信息、堆栈的大小、调用的数据库)81ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND汇编指令伪指令标号82(1)段定义伪指令SEGMENT和ENDS

一个完整的源程序可由3个段组成:堆栈段、数据段、代码段。其中堆栈段和数据段可以没有,但代码段是必须的。SEGMENT:定义一个段开始。(注:一个段必须有一个名称来标识。)ENDS:说明一个段的结束,和SEGMENT成对使用。格式:

段名SEGMENT

段名ENDSASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND代码段(CODE)、数据段(DATA)、堆栈段(STACK)83(2)汇编结束伪指令END格式:

END[标号]功能:表示源程序到此结束。说明:一个源程序必须有且只能有一个END语句,一般放在源程序的最后一行。]。ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOVAX,4C00H INT21HCODESG ENDSEND84(3)ASSUME段分配伪指令格式:

ASSUME段寄存器:段名[,段寄存器:段名,…]

用于说明源程序中定义的段或组由哪个寄存器去寻址,即建立寄存器与段间的对应关系。例:

ASSUMECS:CODE,DS:DATA,SS:STACKCODESEGMENT MOVAX,1234H MOVDS,AXCODE ENDS一般放在源程序首行或代码段前ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOVAX,4C00H INT21HCODESG ENDSEND852、源程序中的“程序”ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOVAX,4C00H INT 21HCODESG ENDSEND描述信息B82301BB560403C303C0B8004CCD21编译连接MOVAX,0123HMOVBX,0456HADDAX,BXADDAX,AXMOV AX,4C00HINT 21H863、标号:代表某一存储单元地址的名字。字母:A~Z

数字:0~9

特殊字符:?.@_$例:BINASC:MOVAX,BX S2:MOVAX,BX BIG?:MOVAX,BX注意:数字不能作名称的第一个字符。圆点只能用作第一个字符,标号最长为31个字符。ASSUME CS:CODESGCODESG SEGMENTSTART:

MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOVAX,4C00H INT21HCODESG ENDSEND874、汇编语言源程序的结构

一般来说,一个完整的汇编源程序应由三个程序段组成,即代码段、数据段和堆栈段,每个段都以SEGMENT开始,以ENDS结束,代码段包含程序要执行的指令;堆栈段用来在内存中建立一个堆栈区;数据段用来在内存中建立一个适当容量的工作区,以存放程序中所需的数据。注意:一个源程序中,代码段是必须的,而数据段和堆栈段可以没有或有其中一个。段定义时一般最后定义代码段。ASSUME CS:CODE,DS:DATA,

ES:DATA,SS:STACKSTACK SEGMENT DB 500 DUP(0)STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENTMAIN: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX

CODE ENDS END MAIN定义堆栈段定义数据段定义代码段SEGMENTENDSSEGMENTENDSSEGMENTENDSEND MAINASSUME段分配段结束88例:编程运算23895、程序返回6、语法错误和逻辑错误语法错误:程序在编译时被编译器发现的错误。逻辑错误:源程序编译后运行时发生的错误。ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX

MOVAX,4C00H INT21HCODESG ENDSEND90一个源程序执行的过程91三、编写汇编源程序使用工具:可使用各种文本编辑工具(记事本、写字板、WORD等),我们使用DOS下的EDIT文本编辑器。功能:产生一个存储源程序的文本文件。使用方法:在DOS下运行EDIT.EXE程序。1、C:\EDIT2、输入汇编源程序并保存为.asm文件。92四、对源程序进行编译使用工具:使用MASM5.0编译器功能:使用编译器对源程序文件进行编译,生成包含机器代码的目标文件(.obj)。使用方法:在DOS下运行MASM.EXE程序。1、C:\MASM\MASM.EXE2、输入要进行编译的源程序文件路径及名称。3、输入进行编译后产生的目标文件保存的路径及名称。4、输入列表文件名:5、输入交叉文件名:93五、对目标文件进行连接使用工具:使用LINK.EXE连接器功能:对目标文件进行连接,从而得到一个可执行文件.EXE。使用方法:在DOS下运行LINK.EXE程序。1、C:\MASM\LINK.EXE2、输入要进行连接的目标文件路径及名称。3、输入进行连接后产生的可执行文件.Exe保存的路径及名称。4、输入映像文件名:5、输入库文件名:94连接的作用:当源程序较大时,编译器会将源程序文件分成多个部分来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接在一起,生成一个可执行文件。程序中调用了某个库文件中的内容时,需要将这个库文件和该程序生成的目标文件连接在一起。一个源程序编译后,得到了存有机器码的目标文件,目标文件中有的内容不能直接生成可执行文件,必须通过连接程序将这些内容处理为最终可执行的信息。95六、以简化的方式进行编译和连接忽略中间文件,将产生的目标文件和可执行文件保存在当前路径下。C:\MASM\MASMXXX;C:\MASM\LINKXXX;七、可执行文件.exe的执行96八、可执行文件中的程序装入内存并运行的原理CPU内存硬盘DATASEGMENTDATAENDSCODESEGMENTCODEENDScommand操作系统的外壳操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为外壳(shell)的程序,用户使用这个程序来操作计算机系统进行工作。DOS中有一个程序,在DOS中称为命令解释器,也就是DOS系统的外壳。DOS启动时,先完成其他重要的初始化工作,然后运行command,command运行后,在屏幕上显示出“C:\”,然后等待用户的输入。如果用户要执行一个程序,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序的入口。此后,command暂停运行,由CPU运行程序。程序运行结束后,返回到command中。97九、程序执行过程的跟踪使用工具:Debug使用方法:在DOS下运行DEBUG.EXE程序。

1、C:\DEBUGxxx.EXE98在DOS中可执行文件.EXE中程序加载的过程内存xxxx:0000PSPxxxx+10h:0000程序1、找到一段起始地址为xxxx:0000的容量足够的空闲内存区。2、在这段内存区的前256个字节中,创建一个称为程序段前缀(PSP)的数据区,DOS要利用PSP来和被加载的程序进行通信;3、从xxxx+10H:0开始,将程序装入,程序的地址被设为xxxx+10H:04、将该内存区的段地址存入DS中,初始化其他相关寄存器后,设置CS:IP指向程序入口。注意:PSP区和程序区虽然物理地址连续,但为更好的区分,DOS将它们划分到不同的段中。程序加载后,ds=xxxx为程序加载的段地址。数据区堆栈区代码区99第5章[BX]和Loop指令Loop指令的用法[BX]定位内存单元的用法Loop指令和[BX]的联合应用段前缀的使用100几个约定[BX]:指偏移地址为(BX)的内存单元。例:MOVAX,[BX]MOVAL,[2000H]LOOP循环指令():指内容。例:若AX=1234H则(AX)=1234H,(AL)=34H(20000H)用idata表示常量(立即数)例:movax,[idata]movax,[0] movax,idatamovax,1234h

例:用()描述下列指令的功能MOVAX,[2](AX)=(DS:2)MOV[2],AX

(DS:2)=(AX)ADDAX,2

(AX)=(AX)+2ADDAX,BX

(AX)=(AX)+(BX)ADDAX,[2]

(AX)=(AX)+(DS:2)PUSHAX

(SP)=(SP)-2(SS:SP)=(AX)POPAX(AX)=(SS:SP)(SP)=(SP)+2101一、[BX]EA:偏移地址;SA:段地址;PA:物理地址;例1:

MOVAX,[BX]EA=(BX)SA=(DS)PA=((DS):(BX))5.2

我们常用[BX]来提供内存单元的偏移地址,通过修改BX的值,可由DS:[BX]来寻址不同地址的内存单元。102程序和内存中的情况如下图,写出程序执行后,21000H—21007H单元中的内容。Mov ax,2000hMov ds,axMov bx,1000hMov ax,[bx]Inc bxInc bxMov [bx],axInc bxInc bxMov [bx],axInc bxMov [bx],alInc bxMov [bx],al内存情况BE21000H0021001H21002H21003H21004H21005H21006H21007HAx=2000hDs=2000hBx=1000hAx=00BEHBX=1001HBX=1002H(21002H)=00BEHBE00BX=1003HBX=1004H(21004H)=00BEHBx=1005H(21005H)=BEHBE00BEBx=1006H(21006H)=BEHBE103二、循环控制指令LOOP

用CX作计数器控制程序的循环。格式:LOOP标号;CX≠0循环功能:当CX≠0时,(CX)=(CX)-1;转移到标号处循环执行。

CX和LOOP指令配合实现循环功能的三个要点:1、在CX中存放循环次数2、LOOP指令中的标号所标识地址要在前面3、要循环执行的程序段写在标号和LOOP指令之间。利用LOOP指令编程计算212ASSUME CS:CODECODE SEGMENT MOVAX,2 MOVCX,11S: ADDAX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND例2:编程,用加法计算123×236,结果存在AX中。104三、在DEBUG中跟踪用LOOP指令实现的循环程序ASSUME CS:CODECODE SEGMENT MOVAX,0FFFFH MOVDS,AX MOVBX,6 MOVAL,[BX] MOVAH,0 MOVDX,0 MOVCX,3S: ADDDX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND在汇编源程序中,数据不能以字母开头。ASSUME CS:CODECODE SEGMENT MOVAX,0FFFFH MOVDS,AX MOVBX,6 MOVAL,[BX] MOVAH,0 MOVDX,0

MOVCX,123S: ADDDX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND使用P命令可以将循环指令一次执行结束。也可用“GXXXX”命令来执行到循环结束。105四、DEBUG和汇编编译器MASM对指令的不同处理在DEBUG中我们可以使用下面指令来读写内存:MOV AX,[0]MOV AL,[2]MOV BX,[1234H]但在汇编程序中只能使用[寄存器]来寻址内存:例:MOV AX,[BX]在汇编编译器处理中,MOVAX,[1234H]=MOV AX,1234H106五、LOOP和[BX]的联合使用 计算:FFFF:0—FFFF:B单元中的数据的和,结果保存在DX中XXFFFF0HXXFFFF1HXXFFFF2HXXFFFF3HXXFFFF4HXXFFFF5HXXFFFF6HXXFFFF7HXXFFFF8HXXFFFF9HXXFFFFAHXXFFFFBH运算结果是否会超出DX能否将数据直接加到DX中能否将数据直接加到DL中办法:将内存单元中的8位数据赋到一个16位寄存器AX中,再将AX加到DX上。 movax,0ffffh movds,ax movdx,0

moval,ds:[0] movah,0 adddx,ax moval,ds:[1] movah,0 adddx,ax moval,ds:[2] movah,0 adddx,ax . . moval,ds:[0bh] movah,0 adddx,axAssumecs:codeCode segment movax,0ffffh movds,ax movdx,0107六、段前缀

在访问内存单元的指令中,用于显式地指明内存单元的段地址的“段寄存器:”,在汇编语言中称为段前缀。例:

MOV AX,DS:[BX]MOV AX,CS:[BX]MOV AX,ES:[BX]MOV AX,SS:[0]MOV AL,CS:[1234H]注意:当指令中给出段前缀时,该数据的段地址由指定的段寄存器提供。例:MOVAX,CS:[BX]PA=((CS):(BX))108七、一段安全的空间 汇编语言程序直接面向机器,如果我们要向内存空间写入数据时,要保证所写入的内存中没有重要的数据,否则会影响系统的正常运行,在一般的PC机中都不使用0:200—0:300这段内存空间,所以我们可以放心使用这段安全的空间。109八、段前缀的使用 编程将内存FFFF:0—FFFF:B单元中的数据拷贝到0:200—0:20B单元中。FFFF0HFFFF1HFFFF2HFFFF3HFFFF4HFFFF5HFFFF6HFFFF7HFFFF8HFFFF9HFFFFAHFFFFBH00200H00201H00202H00203H00204H00205H00206H00207H00208H00209H0020AH0020BH movbx,0 movcx,12S: movax,0ffffh movds,ax movdl,[bx]

movax,0020h mov ds,ax mov[bx],dl inc bx loops movax,4c00h int 21h movbx,0 movcx,12

movax,0ffffh movds,ax movax,0020h moves,axS: movdl,[bx] moves:[bx],dl inc bx loops movax,4c00h int 21h 110第6章包含多个段的程序掌握在程序中同时使用数据段、堆栈段和代码段。理解内存中不同段的分配原理。111补全下面程序将内存0:300H—0:31FH处的数据复制到0:200H处。XX00300HXX00301HXX00302HXX00303HXX00304HXX00305HXX00306H.........XX0031EHXX0031FH00200H00201H00202H00203H00204H00205H00206H...0021EH0021FHAssume cs:codeCode segment movax,

movds,ax movax,0020h moves,ax movbx,0 movcx,

S: moval,[bx] moves:[bx],al incbx loops movax,4c00h int21hCode endsend0030h0020h112补全下面程序将“movax,4c00h”之前的指令复制到内存0:200H处。XXXXXXXXXXXXXX......XXXX00200H00201H00202H00203H00204H00205H00206H...0021EH0021FHAssume cs:codeCode segment movax,

movds,ax movax,0020h moves,ax movbx,0 movcx,

S: moval,[bx] moves:[bx],al incbx loops movax,4c00h int21hCode endsendCS23PSPCS:0DS:0DS:FF113一、在代码段中使用数据(将数据定义在代码段中)例:计算以下8个数据的和,结果保存在AX中:0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H。思路1:MOVAX,0ADDAX,0123HADDAX,0456HADDAX,0789H . . .ADDAX,0CBAHADDAX,0987H思路2:

MOVAX,XXXXHMOVDS,AXMOVBX,0MOVCX,nMOVAX,0S:ADDAX,[BX]ADDBX,2LOOPS23XXXX0156048907..09114将数据定义在代码段中ASSUME CS:CODECODE SEGMENT DW 0123H,0456H,0789H,

0ABCH,0DEFH,

0FEDH,0CBAH,0987H MOV BX,0 MOV AX,0 MOV CX,8S: ADD AX,CS:[BX] ADD BX,2 LOOP S MOV AX,4C00H INT 21HCODE ENDSEND 定义数据伪指令:DW—字型数据DB—字节型数据DD—双字数据格式:DW(DB)数据1,数据2,数据3,……23015604..BA0C8709BB0000B80000..CS:0CS:0F115ASSUME CS:CODECODE SEGMENT DW0123H,0456H,0789H,0ABCH,

0DEFH,0FEDH,0CBAH,0987HSTART: MOV BX,0 MOV AX,0 MOV CX,0S: ADD AX,CS:[BX] ADD BX,2 LOOP S MOV AX,4C00H INT 21HCODE ENDSEND START

END 标号标号—为程序中第一条要执行的指令的标号。在编译中向编译器提供程序的入口地址和结束地址。116二、在代码段中使用栈利用堆栈,编程将程序中定义的数据逆序存放。Assume cs:codeCode segmentDw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hCode endsend23015604..数据BA0C8709..CS:0CS:0FDw 0,0,0,0,0,0,0,00000……0000CS:10CS:1F栈段Start: movax,cs movss,ax movsp,

movbx,0 movcx,8S: pushcs:[bx] addbx,2 loops movbx,0 movcx,8S0: popcs:[bx] addbx,2 loops0 movax,4c00h int21h Code endsEnd start20h117检测点6.1

补全程序,使下面

温馨提示

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

评论

0/150

提交评论