微机原理-第三章-11_第1页
微机原理-第三章-11_第2页
微机原理-第三章-11_第3页
微机原理-第三章-11_第4页
微机原理-第三章-11_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

调用指令CALL①段内直接调用

格式

CALL符号地址;NEAR属性

执行

(SP)←(SP)-2

(SS:SP)←(下一条语句的IP)(IP)←符号地址的偏址

;转至符号地址处取指令入栈保存返回地址偏值②段间直接调用格式

CALL符号地址;FAR属性执行

(SP)←(SP)-2(SS:SP)←(CS)

(SP)←(SP)-2(SS:SP)←(IP)(IP)←符号地址的偏址(CS)←符号地址的段址入栈保存返回地址段值入栈保存返回地址偏值转至符号地址返回指令RET

②段间返回格式

RET或RETF

执行

(IP)←(SS:SP)(SP)←(SP)+2

(CS)←(SS:SP)(SP)←(SP)+2从堆栈取返回地址偏值从堆栈取返回地址偏值从堆栈取返回地址段值①段内返回格式

RET

执行(IP)←(SS:SP)(SP)←(SP)+2段内和段间返回指令的汇编语言格式均可用RET,但机器码不同,段内为C3H,段间为CBH,

汇编程序据过程类型确定返回类型。例1displayPROCNEAR

、、、、C3H

、、

RET;NEAR属性的过程对应段内返回

displayENDP例2displayPROCFAR

、、、、CBH

、、

RET;FAR属性的过程对应段间返回

displayENDP例段内直接调用

codeSEGMENT

、、、、、、

CALLsub2000:200H→

、、、、、、、、、、、、

subPROCNEAR2000:300H→

、、、、、、、、、

RETsubENDP

codeENDS0002A4501000:1004SS:SP

调用后(IP)=300H1000:1006SS:SP

返回后(IP)=200H0002A4501000:1006SS:SP

1000:1004SS:SP

堆栈的变化例段间直接调用

code1SEGMENT

、、、、、、

CALLsub2000:100H→

、、、、、、

code1ENDS

code2SEGMENT

、、、

subPROCFAR3000:200H→

、、、、、、、、、

RETsubENDP

code2ENDS

1000:1002SS:SP

调用后(IP)=200H(CS)=3000H1000:1006SS:SP

00010020A450

返回后(IP)=100H,(CS)=2000H1000:1002SS:SP

1000:1006SS:SP

00010020A450注意:在调用、返回指令中,利用堆栈保存、恢复返回地址。对堆栈的操作应有目的性,不乱用堆栈操作,不随意修改堆栈内容,否则易造成死机。中断:CPU暂停现行程序,转而处理随机到来的事件,待处理完后再回到被暂停的程序继续执行,这个过程就是中断。中断概念中断产生的情况下CPU运行程序的流程中断源

能够引发中断的事件被称为中断源。

外部中断源:由外部设备产生的中断,如输入/输出请求、定时时钟、掉电、设备故障等。内部中断源:由CPU内部执行指令过程中产生的中断,如溢出、单步运行、断点、中断指令INTN等。

4)中断调用、中断返回指令指令:INTN/IRET

共有256个类型号(0~FFH,即0~255)如:类型号0

处理除0错误的中断子程类型号9H

处理键盘操作的中断子程类型号21H

与DOS系统功能相关的中断子程中断向量表:存放256个中断向量的内存区域

4×256=1024=1K

中断向量表地址为0:0~0:03FFH

即0段前1K个内存单元,低端1K内存。类型号为N的中断向量存放在4个内存单元中

(0:N×4~0:N×4+3)

其中:(0:N×4~0:N×4+1)存放偏移地址

(0:N×4+2~0:N×4+3)存放段地址中断向量:中断子程序的入口地址,包括段地址、偏移地址类型FF中断向量类型0中断向量

、、段值类型0向量的偏值类型1向量的偏值

、、段值1020H3040H类型FF向量的偏值

、、段值类型1中断向量类型N中断向量0:00000:00040:N×40:03fc中断向量表0:0~3FF类型N的中断子程序从3040:1020H开始▲有的中断子程序在软、硬件条件满足时,CPU会自动去执行

例如:①除0时,CPU自动执行类型0的中断子程②按下某键,CPU自动执行类型9的中断子程

中断调用指令INT保存现场取中断子程入口地址入栈保存IP入栈保存CS入栈保存PSW清IF标志清TF标志格式

INTN;其中N=0~FFH即0~255

执行

(SP)←(SP)-2

(SS:SP)←(PSW)

IF←0TF←0

(SP)←(SP)-2

(SS:SP)←(CS)(SP)←(SP)-2

(SS:SP)←(IP)(IP)←(0:N×4)(CS)←(0:N×4+2)中断返回指令IRET

格式

IRET

执行

(IP)←(SS:SP)(SP)←(SP)+2

(CS)←(SS:SP)(SP)←(SP)+2

(PSW)←(SS:SP)(SP)←(SP)+2从堆栈取返回地址,并恢复现场

CS:IP转至主程被中断处取指令执行IRET后SS:SP(PSW)(CS)(IP)执行IRET前SS:SP

、、、、、、、、、、、、、、、、、、、、、内存

0000:0000→、、、、0:1C×4=70h→FF53H

中断向量表0:1C×4+2=72h→F000H(1K字节)

、、

0:03FFH→、、、、、、

INT1CH

中断调用

1271:0102H→、、、、、、、、、、

F000:FF53H→、、、、中断子程、、

IRET

中断返回

、、、、

F000:FFFFH→、、(PSW)=0300HIF=1,TF=12000:0106SS:SP

INT1C执行前

IF=1,TF=1

(PSW)=0300H

(CS))=1271H

2000:0100SS:SP

127100

03

0102INT1C执行后

(IP)=0102H

(PSW)=0000HIF=0,TF=0IRET执行后

2000:0106SS:SP

(CS)=F000,(IP)=FF53、、、、了解INT指令调用中断子程序

IRET指令中断返回过程

D:\TEACH\DEBUG-A;汇编一条中断指令

2F68:0100INT1C2F68:0102

-R;查看执行指令前各寄存器内容

AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0F68ES=0F68SS=0F68CS=2F68IP=2100NVUPEIPLNZNAPONC0F68:0100CD1CINT1C-T;T单步执行INT

1CAX=0000BX=0000CX=0000DX=0000

SP=FFE8BP=0000SI=0000DI=0000DS=0F68ES=0F68SS=0F68CS=F000IP=FF53NVUPDIPLNZNAPONCF000:FF53CFIRET-DSS:FFE8L08;查看执行完后堆栈内容

0F68:FFE00201682F

02F20000..h.....-D0:70L10;查看中断向量表0:70–0:730000:007053FF

00F0A4F000F0-22050000355800C0........"...5X..-UF000:FF53;查看1C类型的中断子程

F000:FF53CFIRET

...利用DEBUG学习INT指令:▲清IF目的:进入中断子程序后,禁止可屏蔽中断清TF目的:进入中断子程序后不单步执行中断子程▲不随意修改中断向量表的内容,否则易造成死机▲不随意修改堆栈内容

6.处理机控制指令1)标志处理指令

CLC,STC,CMC,CLD,STD,CLI,STI2)处理机控制指令HLT,NOP,WAIT,ESC,LOCK1)标志处理指令▲设置和清除标志的指令,只影响指令指定的标志2)处理机控制指令②空操作指令NOP

格式

NOP

指令不执行任何操作7、输入输出指令1.输入指令ININAL,n ;n是端口地址,n<0FFH

INAX,nINAL,DX;n>0FFHINAX,DX2.输出指令OUTOUTn,AL/AX;

OUTDX,AL/AX;说明:1、可传送一个字节或字

2、只能通过AL或者AX传送直接的输入输出指令指令中直接给出端口地址(地址<0FFH):INAL,50H ;将50H端口的字节读入ALINAX,70H ;分别将70H、71H端口的内容读入 ;AL、AHOUT44H,AL ;将AL中的内容输出到44H端口OUT80H,AX ;将AL、AH中的内容分别输出到 ;80H、81H两端口

INAL,DX ;从DX所指的端口中读取

INAX,DX ;从DX和DX+1所指出的两个端口;中读取

OUTDX,AL ;将AL中的字节输出到DX所指的;端口中

OUTDX,AX ;将AL中的字节输出到DX所指的;端口中,同时将AH中的字节输;出到DX+1所指的端口中间接的输入输出指令(>0FFH):注意:①只能用累加器AX作为执行输入输出的机构,间接输出指令的端口只能用DX②寻址范围: 直接输入输出指令为0~255

间接输入输出指令为0~65535作业1.普通移位指令和循环移位指令(带CF的和不带CF的两类)在执行操作时,有什么差别?在编制乘除法程序时,为什么常用移位指令来代替乘除法指令?试编写一个程序段,实现将BX中的数除以10,结果仍放在BX中。2.找出下列指令中所有对的指令,写出题号,错误的请说明原因。

(1)SHR

AX,3 (2)

AND

0FH,AL

(3)SAL

[BX],CX (4)

CBW

BH

(5)

LEA

BX,1000H

(6)DIV

0010H

(7)

MOV

AX,

[BX+BP]

(8)CMP

[BX],[SI]

(9)JMP

FAR[BX十SI]

3.用循环控制指令设计程序段,从60H个元素中寻找一个最大值,结果放在AL中。4.比较AX,BX,CX中有符号数的大小,将最大的数放在AX中,请编程。第三章Intel处理器指令系统和汇编语言§3.116位处理器指令系统§3.232位处理器指令系统§3.3汇编语言与汇编程序§3.4汇编语言与高级语言的接口3.3.1汇编语言的语句格式

dataSEGMENT;数据段varDB?dataENDScodeSEGMENT;代码段

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDS

ENDstart[标号]

[:

]

助记符

[操作数,]

[;注释]名称

助记符项

操作数项

注释项1.标号

段名、变量名、标号、过程名等。dataSEGMENT;数据段varDB?dataENDScodeSEGMENT;代码段

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDS

ENDstart[标号]

[:

]

助记符

[操作数,]

[;注释]名称

助记符项

操作数项

注释项标号的命名规定:①

由字符A~Z,a~z,0~9及符号@、$、下划线_等组成,最长31个字符,超出部分忽略。②

不能用数字打头,以免与十六进制数相混。③

尽量不使用汇编程序中的保留字。(如指令的助记符等)④

对定义的符号不区分大小写。汇编语言中的保留字保留字(ReservedWord)是汇编程序已经利用的标识符(也称为关键字),主要有:指令助记符——例如:MOV、ADD伪指令助记符——例如:DB、DW操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS预定义符号——例如:@data

汇编语言大小写不敏感2.助记符项指令、伪指令对于指令,汇编程序将其翻译成机器语言指令。

MOVAX,100→B80001对于伪指令,汇编程序据其要求的功能进行处理。

dataSEGMENT

→data与一段值对应

stringDB‘Tsinghua’→string与一内存地址对应[标号]

[:

]

助记符

[操作数,]

[;注释]名称

助记符项

操作数项

注释项3.操作数项操作数多于一个时,用逗号分开。操作数可以是常数、寄存器、存储器操作数、标号名、过程名或表达式等。[标号]

[:

]

助记符

[操作数,]

[;注释]名称

助记符项

操作数项

注释项常数给出具体的数据,可以是数字常量或字符常量。◢◢

数字默认十进制,也可加D表示十进制数。如

1234D,1234◢

数字后加B表示二进制数。如

1010B◢

数字后加H表示十六进制数。如1234H◢

字符常量,用单引号表示。如‘1234’

汇编时,用字符对应的ASCII表示。如

31H,32H,33H,34H例

data1DB12,34,56;十进制

data2DB12H,34H,56H;十六进制

MOVAL,‘G’;字符

stringDB‘1234’;字符串

A、B、C、D、E、F开头的十六进制数前面加0,与H结尾的标识符区别。如寄存器名AH、BH、CH、

DH

变量名abcdH

等例

movAL,0AH

movAL,AH

movBX,0abcdH4.注释项用分号间隔,用来说明语句或程序的功能。汇编程序对分号后的内容不做处理。作用:①注释程序,增强程序可读性。

②可放在语句最前,暂时注释某语句,调试程序用例

、、、

;MOVAH,2;显示提示信息

;MOVDL,’A’

;INT21H

、、、[标号]

[:

]

助记符

[操作数,]

[;注释]名称

助记符项

操作数项

注释项指示性语句与指令性语句:指令性语句是用指令系统中的指令构成的语句。

MOVAX,BX指示性语句是指示汇编程序进行汇编的操作。

MOVAX,4+8中的+codeSEGMENT中的SEGMENTMOVBX,OFFSETstring中的OFFSET3.3.3伪指令

指示性语句与指令性语句指令(Instruction)——使CPU产生动作、并在程序执行时才处理的指令伪指令(Directive)——不产生CPU动作、在程序执行前由汇编程序处理的说明性指令

伪指令与具体的处理器类型无关,但与汇编程序有关。不同版本的汇编程序支持不同的伪指令指示性语句与指令性语句区别一个程序经汇编,连接和装入内存后,在执行程序之前:

◢指示性语句的功能已经完成,故又称伪操作。

◢而指令性语句的功能尚未完成,需控制CPU去执行,才能完成。aa

SEGMENT;数据段1

str1DB'Hello!’aa

ENDSbbSEGMENT;数据段2

str2DB6dup(?)bbENDSccSEGMENT;代码段

ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aa

MOVDS,AXLEASI,str1MOVAX,bb

MOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstart

D:\masm>DEBUGhello2.exe-U:查看代码段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,[0000]12A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,[0000]12A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、、、-D129E:0L10;查看数据段1的内容129E:000048656C6C6F210000-0000000000000000Hello!..........-D129F:0L10;查看数据段2的内容129F:00000000000000000000-0000000000000000................-数据传送源程序hello2.asm程序经汇编、连接后,装入内存的情况如下:1.定义数据伪指令DB/DW/DD

变量名类型助记符操作数[,操作数,...]

用来定义程序中所用的内存操作数。其中变量名指示内存操

温馨提示

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

评论

0/150

提交评论