汇编复习大纲(2015秋季)_第1页
汇编复习大纲(2015秋季)_第2页
汇编复习大纲(2015秋季)_第3页
汇编复习大纲(2015秋季)_第4页
汇编复习大纲(2015秋季)_第5页
已阅读5页,还剩248页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言复习大纲(2015秋季学期)第2页基础知识章节目录第1章08x86计算机组织08x86的指令系统和寻址方式汇编语言程序格式第2章第3章第4章循环与分支程序设计第5章子程序结构第6章输入输出程序设计第8章BIOS和DOS中断第9章第1章基础知识

二进制和十六进制运算数的补码表示补码的加法和减法基本逻辑运算:"AND"、"OR"、"NOT"、"XOR"常用字符表示法第3页4X的真值与其原码、反码和补码X的真值符号位数值位不变X的原码符号位不变,数值位X的补码X的反码符号位不变,数值位5基本逻辑运算逻辑运算

ANDORNOTXOR操作方式:按二进制的位运算

例:

(7)10XOR(5)10=(2)10部分ASCII码6参见p.117二、八、十六和十进制数的对应关系8二进制(B)十六进制(H)把二进制数从右到左4位一撇

1位Hex10101010112AB001A2B0001101000101011十六进制数的每1位对应4位二进制数9任意进制间转换(100)H

(100000000)B(256)D(400)O(75)H

Bin1110101BDec7×161+5×160=117OctHBO 165OB:11111111D:128,64,32,16,8,4,2,1127第2章08x86计算机组织中央处理机CPU的组成80x86寄存器组存储单元地址和内容实模式存储器寻址保护模式寄存器寻址第10页11寄存器组分类与功能CPU由三部分组成:

算术逻辑部件ALU:用来进行算术和逻辑运算。控制逻辑:负责对全机的控制工作。 包括:取指、译指、取操作数,发执行指令、结果存入存储器、对总线和I/O传送的控制等。寄存器:相当于运算器中的一个存储单元可见寄存器不可见寄存器参见p.20128086/8088的寄存器组寄存器:可见寄存器、不可见寄存器可见寄存器:通用寄存器专用寄存器段寄存器可见寄存器组13参见p.211415数据寄存器AX:Accumulator,累加器算术运算主要寄存器;

在I/O时用AX与外部设备传送信息BX:Base在计算存储器地址时,作基址寄存器16数据寄存器CX:Count,计数器所有寄存器中,只有此寄存器不能用作间接寻址!DX:Data和AX组合存放双字长数,DX存放高字节;在I/O操作时,DX可用来存放I/O的端口地址。17变址(指针)寄存器SP:StackPoint堆栈指针寄存器指示栈顶的偏移地址BP:BasePoint基址指针寄存器作为堆栈区中的基地址以便访问的其他信息上海大学:A楼、计算机大楼、材料大楼etc.DI:DestinationIndex目的变址寄存器

SI:SourceIndex源变址寄存器这些只能以16位为单位使用,存放操作数。18关于SP、BP在存储器中的特殊区域SP始终指向栈顶,总是字操作指示栈顶的偏移地址;BP可作为堆栈区中的一个基地址以便访问堆栈中的其他信息堆栈地址由高向低增长(象一个倒放的有底的桶)存放断点或暂存数据19关于SP、BP堆栈地址由高向低增长20变址寄存器的用途在运算过程中存放操作数在段内寻址时提供偏移地址SP、BP都可以与SS寄存器联用来确定堆栈段中的某单元的地址通常SI、DI与DS联用用来确定数据中某一存储单元的地址;具备自动增减量的功能;在串处理指令中,SI和DI作为隐含的变址寄存器SI和DS联用:达到在数据段中寻址的目的DI和ES联用:达到在附加段中寻址的目的21专用寄存器8086/8088、80286:IP、SP、FLAGS—16位IP:指令指针寄存器存放代码段中的偏移地址,与CS寄存器联用确定下一条指令的物理地址,指向下一条指令的首地址。存储器IP地址信息控制器

需要执行的指令下一条指令首地址123422专用寄存器SP:堆栈指针寄存器存放栈顶偏移地址,与堆栈段寄存器(SS)联用确定堆栈段中的栈顶地址。FLAGS:标志寄存器也称程序状态字寄存器,ProgramStatusWord,PSW。存放条件码标志、控制标志、系统标志23标志寄存器条件码标志:

OF、SF、ZF、CF、AF、PF控制标志位:DF(DirectionFlag)系统标志位:TF(TrapFlag)、IF(InterruptFlag)IOPL(I/OPrivilegeLevel):(80286)

NT

OFDFIFTFSFZF

AF

PF

CFIOPL8X86的标志寄存器:151413121110987654321024控制标志位控制标志位:DF,DirectionFlag

方向标志,用于串处理指令处理DF位为1时,每次操作后使变址寄存器SI和DI减量,使串处理从高地址向低地址方向处理:当DF位为0时,则使SI和DI增量,使串处理从低地址向高地址方向处理:高地址低地址低地址高地址25系统标志位IF:中断标志。当IF=1时,允许中断;

IF=0时,关闭中断;TF:陷井标志(跟踪标志)。用于单步方式操作中断标志位IF

开中断:允许CPU响应外设的中断请求(IF=1)关中断:不允许CPU响应外设的中断请求(IF=0)两条指令:STI:设置中断允许位(IF=1)CLI:清除中断允许位(IF=0)2627条件码标志OF:OverflowFlag溢出标志运算时如操作数超出机器表示范围称为溢出。此时OF位置1;否则置0。SF:SignFlag符号标志记录运算结果的符号,结果为负时置1,否则置0。ZF:ZeroFlag零标志运算结果为0,置1;否则置0。

NT

OFDFIFTFSFZF

AF

PF

CFIOPL151413121110987654321028条件码标志AF:AuxiliaryCarryFlag辅助进位标志记录运算时第3位产生的进位值。如第3位有进位时置1,否则置0。PF:ParityFlag奇偶标志当结果操作数中1的个数为偶数时置1,否则置0。CF:CarryFlag进位标志记录从最高有效位产生的进位值最高有效位有进位时置1,否则置0。1514131211109876543210

NT

OFDFIFTFSFZF

AF

PF

CFIOPL29运算结果的溢出与进位条件标志位CF、OFCF位:(CarryFlag)表示无符号数的溢出有进位CF=l;无进位时CF=0OF位:(OverflowFlag)表示带符号数的溢出若两个操作数的符号相同,而结果的符号与之相反时,OF=1;否则OF=0。8位二进制数:无符号数为:0~255带符号数为:

-128~+12716位二进制数:无符号数为:0~65535带符号数为:

-32768~+3276730存储单元的内容存储单元的内容:一个存储单元存放的信息(0004)=1234H字存放方式:低位字节放低地址,高位字节放高地址。字单元的地址以其低地址表示同一个地址既可看作字节单元地址,又可看作字单元地址。地址内容31双字单元数据存放:与字单元类似低位字存入低地址区,高位字存入高地址区。地址由其最低字节的地址指定 (0004)=12345678H访问存储器都是以字为单位进行的,也就是说,以偶地址访问存储器。参见p.26存储单元的内容32地址和内容如果用X表示某存储单元的地址,则X单元的内容可以表示为(X)假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=((X))来表示Y单元的内容33地址和内容举例:(0004H)=5678H而(5678H)=2F1EH,也可记作((0004H))=2F1EH参见p.2634存储器地址的分段实模式下最大寻址能力1MB8086/8088地址总线宽为20,即有20条地址线。直接寻址能力为1MB,即为该机的最大存储容量。其他处理器:在实模式下只能访问前1MB的存储器地址

35存储器地址的分段分段,分成若干个不超过64K单元的段。16位段基址000016位偏移地址

20位物理地址+0000015015019151136物理地址(PA)

物理地址的构成:20位物理地址由16位段地址和16位偏移地址组成段地址:必须是小段首地址,其低4位一定是0。只取段起始地址的高16位值偏移地址:指段内相对于段起始地址的偏移值37物理地址的计算公式:物理地址=16d

段地址+偏移地址16位段基址000016位偏移地址

20位物理地址+00000150150191511将段地址左移4位后加上偏移地址值就是物理地址(在十六进制中表现为将段地址左移1位)实模式存储器寻址3839四个段寄存器8086CPU同时可管理四个段CS:程序DS:数据ES:附加数据SS:堆栈注意:这里都是“地址”之间发生关系!40端口地址端口(port)地址:又称端口号连接主机和外设寄存器的接口独立于内存储器的I/O地址空间8086/8088机:I/O地址空间可达64K端口地址的范围是0000FFFFH占用2个字节端口可为8位或16位端口操作常借助DX80386及后继:端口可有32位,但I/O地址空间不超过64KB0000000100020003…00100011…1000…FFFEFFFF~第3章指令系统和寻址方式数据传送指令算术运算指令-加法、减法、乘法、除法;逻辑运算和移位指令;控制转移指令;串处理指令;处理机控制指令。第41页参考:指令助记符表44操作数字段指令分类:(按操作数分)单操作数指令:(一地址指令)操作码目的操作数(OPRDEST)如,加1操作:INC

DX双操作数指令:(二地址指令)

OPRDEST,SRC

分为源操作数和目的操作数,运算结果存放到目的操作数的地址之中。如,加法操作:ADD

AX,BX

传送指令:MOVd,s45操作数字段指令分类:(按操作数分)三操作数指令:

OPRDEST,SRC,SRC1

除给出两个参加运算的操作数外,还给出运算结果存放地址。无操作数:OPR

(隐含操作数)如,字节转换为字CBW

46与数据有关的寻址方式8086/80286系列立即寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址80X86的寻址方式

指令中指定操作数或操作数存放位置的方法称为寻址方式。有七种基本的寻址方式:立即寻址寄存器寻址直接寻址(存储器)寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址段寄存器48立即寻址(immediateaddressing)立即数直接存放在指令中,紧跟在操作码之后,作为指令一部分存放在代码段里的操作数。16位的立即数,高位字节放在高地址中,低位字节放在低地址中。32位的立即数,高位字放在高地址中,低位字放在低地址中。49立即寻址(immediateaddressing)立即寻址方式用来表示常数用于给寄存器赋初值,且仅用作源操作数字段,不能用于目的操作数。如:

MOV

AL,5==>(AL)=05HMOV

AX,3064H==>(AX)=3064H

即(AX)=(AH,AL)=(30H,64H)MOV

EAX,12345678H==>(EAX)=12345678H50注意下列指令错MOVAH,500MOV50,AL不能直接给段寄存器和标志寄存器赋予立即数!下面的指令是错误的:

MOVDS,1250H51寄存器寻址(registeraddressing)指令指定寄存器号/名称,操作数在寄存器中。对16位操作数:寄存器用AX、BX、CX、DX、BP、SP、SI和DI。对8位操作数:寄存器用AL、AH、BL、BH、CL、CH、DL和DH。对32位操作数:寄存器用EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP寄存器号操作数从寄存器取寄存器52寄存器寻址举例设(AX)=3064H,(BX)=1234H,执行:

MOVAX,BX

==>(AX)=1234H,(BX)保持不变。设(ECX)=0123454H,(EBX)=12349876H,执行:

MOVECX,EBX

==>(ECX)=12349876H,(EBX)保持不变。53注意寄存器寻址时要弄清针对哪个寄存器而言源、目的寄存器分别是什么?MOVAL,BX对吗?MOVAX,BH对吗?MOVAL,AH对吗?源寄存器和目的寄存器的位数必须一致。关于有效地址有效地址的计算:EA=基址+(变址×比例因子)+位移量除比例因子外是固定值外,其他都可正可负。对于基址、变址以及位移量,如未给出其值,则默认为0。54P.3855直接寻址举例如右图,(DS)=3000H,执行: MOVAX,[2000H];位移量的值结果为: (AX)=3050H这里以实模式计算物理地址。直接寻址方式适用于处理单个变量56符号地址与段跨越前缀以下两指令等效MOVAX,VALUE;用符号地址代替数值地址

;VALUE存放操作单元的符号地址MOVAX,[VALUE]当VALUE在附加段中,应指定段跨越前缀:

MOVAX,ES:VALUE或MOVAX,ES:[VALUE]规定:双操作数指令除立即数方式外只能有一个操作数使用寄存器方式。(不能两个都是内存单元)

MOVVAL1,VAL2;错57有效地址存放在寄存器中指令中给出寄存器名称所需的操作数在存储器中操作数有效地址仅包含基址或变址寄存器内容的一种成分在16位寻址时可用寄存器为:BX、BP、SI和DI在32位寻址时可用寄存器为:EAX、EBX、ECX、EDX、ESP、EBP、ESI和EDI寄存器间接寻址EA操作数段基地址+存储器寄存器基址或变址寄存器指

令58例:MOVAX,[BX]如果(DS)=2000H,(BX)=1000H,执行 MOVAX,[BX]则因物理地址=20000+1000=21000H,结果为:(AX)=50A0H…A050…000010002000H:也可指定跨越前缀来取得其他段的数据MOVAX,ES:[BX];用ES代替DS进行“位移”59寄存器间接寻址物理地址16位寄存器:指令如MOVAX,[SI]指令中指定的寄存器BX、SI、DI,则操作数在现行数据段中,用段寄存器DS

,物理地址=16dx(DS)十(BX)或物理地址=16dx(DS)十(SI)或物理地址=16dx(DS)十(DI)指令中指定BP寄存器,操作数在堆栈段中,用段寄存器SS,物理地址=16d

(SS)十(BP)60寄存器相对寻址操作数有效地址是一个基址或变址寄存器的内容和指令中指定的位移量之和有效地址由两种成分组成所需的操作数在存储器中地址操作数段基地址+存储器寄存器+EA位移量基址或变址寄存器指令61例3.9MOVAX,COUNT[SI]下列两指令等价:MOVAX,COUNT[SI]MOVAX,[COUNT+SI];这里COUNT为16位位移量的符号地址。

设COUNT=3000H,(DS)=3000H,(SI)=2000H,对指令MOVAX,COUNT[SI]源操作数物理地址=30000+3000+2000=35000H执行结果是:(AX)=1234H(AX)=((DS)*16d+(COUNT+(SI)))62物理地址计算8086/8088:物理地址=16d×(DS)+(BX)+8位位移量

或(SI)或16位位移量

或(DI)物理地址=16d×(SS)+(BP)+8位位移量

或16位位移量物理地址=16d×(ES)+(BX)+8位位移量

或16位位移量63MOVEAX,TABLE[ESI];这里TABLE为32位位移量的符号地址,ESI内容指向表格中的一项。用于表格处理,表格首地址可设置为位移量。利用修改基址或变址寄存器内容取得表格中的值MOVDL,ES:STRING[SI]使用段跨越前缀用ES代替DS进行“位移”64基址变址寻址操作数有效地址是一个基址寄存器和一个变址寄存器的内容之和有效地址由两种成分组成两个寄存器均由段与寄存器间的默认关系确定所需的操作数在存储器中65基址变址寻址(图例)基址值操作数段基地址+存储器基址寄存器+EA变址寄存器基址寄存器指令变址值变寄存器默认段选择规则66凡使用BP,EBP,SP和ESP时,默认段为SS段。其他寄存器多数默认段为DS寄存器。67基址变址寻址例3.10:

MOVAX,[BX][DI](也可写成:MOVAX,[BX+DI])如,(DS)=2100H,(BX)=0158H,(DI)=10A5H则,EA=0158+10A5=11FDH

物理地址=21000+11FD=221FDH执行结果:(AX)=1234H

68MOVAX,[BX][DI]操作图MOVAX,[BX][DI](DS)=2100H,(BX)=0158H,(DI)=10A5H69相对基址变址寻址操作数有效地址是一个基址寄存器和一个变址寄存器的内容和一个位移量之和有效地址由三种成分组成70相对基址变址寻址(图例)基址值操作数段基地址+存储器基址寄存器+EA指令变址值变址寄存器变址寄存器基址寄存器位移量71相对基址变址寻址物理地址8086/8088:当基址寄存器为BX时,使用DS为段寄存器当基址寄存器为BP时,使用SS为段寄存器物理地址=16d

(DS)+(BX)+(SI)+8位位移量

或(DI)或16位位移量或物理地址=16d

(SS)+(BP)+(SI)+8位位移量

或(DI)或16位位移量

72例3.11MOVAX,MASK[BX][SI]设(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H,立即寻址方式寄存器寻址方式直接寻址方式(存储器)80X86的寻址方式例:

MOVAH,80H

MOVECX,12345678H

MOVAX,4576H

; 以上指令中的第二操作数都是立即数注:立即数不能作为指令中的第一操作数例:MOVEAX,EBX

ADDAX,DX

ADDAX,1234H

例:MOVBX,[1234H]

;缺省使用段寄存器DSMOVES:[1000H],AX

;指定用段寄存器ES寄存器间接寻址方式寄存器相对寻址方式80X86的寻址方式例:MOVBX,[DI] ;EA=(DI), ;PA=(DS)*16+EA若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。指令中给出的8位/16位偏移量用补码表示。计算有效地址时,若偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。例:MOVBX,[SI+100H]

;EA=(SI)+100H ;PA=(DS)*16+EA80X86的寻址方式基址变址寻址方式相对基址变址寻址方式例:

MOVBX,[BX+SI]

或写成:MOVBX,[BX][SI]例:

MOVAX,[BX+SI+200H]或写成:MOVAX,200H[BX][SI]

;EA=(BX)+(SI)+200H;PA=(DS)*16+EA

若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS。;EA=(BX)+(SI);PA=(DS)*16+EA

3.1.2与转移地址有关的寻址方式段内直接寻址段内间接寻址段间直接寻址段间间接寻址注:这几组指令主要是关于指令的跳转,变动的是IP和CS

确定一条指令的地址转移分类转移分类:条件转移、无条件转移条件转移:均为段内转移;无条件转移:段内与段间转移都可以;段内转移:同一代码段范围内转移,只需改变IP内容,CS不变。段间转移:转移到另一代码段去执行程序,IP、CS均变。条件控制转移指令基于单个标志位的条件转移指令(JumpsBasedonSpecialArithmetic)指令格式转移条件功能描述JE/JZoprZF=1JumpEqualorJumpZeroJNE/JNZoprZF=0JumpNotEqualorJumpNotZeroJCoprCF=1JumpCarryJNCoprCF=0JumpNotCarryJOoprOF=1JumpOverflowJNOoprOF=0JumpNotOverflowJP/JPEoprPF=1JumpParityorJumpParityEvenJNP/JPOoprPF=0JumpNotParityorJumpParityOddJSoprSF=1JumpSign(negative)JNSoprSF=0JumpNotSign(positive)条件控制转移指令无符号数的条件转移指令(JumpsBasedonUnsigned/LogicData)指令格式检测的转移条件功能描述JA/JNBEoprCF=0andZF=0JumpAboveorJumpNotBeloworEqualJAE/JNBoprCF=0JumpAboveorEqualorJumpNotBelowJB/JNAEoprCF=1JumpBeloworJumpNotAboveorEqualJBE/JNAoprCF=1orZF=1JumpBeloworEqualorJumpNotAbove指令格式检测的转移条件功能描述JG/JNLEoprZF=0andSF=OFJumpGreaterorJumpNotLessorEqualJGE/JNLoprSF=OFJumpGreaterorEqualorJumpNotLessJL/JNGEoprSF≠OFJumpLessorJumpNotGreaterorEqualJLE/JNGoprZF=1orSF≠OFJumpLessorEqualorJumpNotGreater有符号数的条件转移指令(JumpsBasedonSigned/ArithmeticData)基于计数的条件转移指令JCXZ/JECXZ(JumpifCX/ECXisZero)指令格式:

JCXZ label ;若CX=0,则转移到label说明:

label相对位移量必须在-128~127之间,即只能短转移,所有80x86CPU都一样。短跳转、近跳转段内直接短转移(短跳转):位移量8位加操作符SHORT只能用作段内直接寻址的条件转移指令段内直接近转移(近跳转):位移量16位加操作符NEARPTR其中,NEARPTR可缺省。通常,默认的东西使用比较广泛。JMP

SHORTNEW_ADDR如当前(IP)=3000H,NEW_ADDR=3050H则经编译后确定位移量=50H,指令中给出转向的有效地址=3050H短跳转条件转移指令只能使用段内直接寻址的8位位移量

JMP

SHORTNEW_ADDR如当前(IP)=3000H,NEW_ADDR=3050H则经编译后确定位移量=50H,指令中给出转向的有效地址=3050H短跳转“JMPSHORT标号”功能:(IP)=(IP)+8位移量1个字节近跳转例:JMP

NEAR

PTR

NEW_ADDR位移量计算同前注:80386-代码段的偏移地址放在EIP中NEAR表示在同一段内转移,位移量在:-32768~32767字节范围这种寻址方式对于条件转移或无条件转移指令都适用。近跳转中,NEARPTR可缺省。

近跳转例:JMP

NEAR

PTR

NEW_ADDR位移量计算同前注:80386-代码段的偏移地址放在EIP中NEARPTR表示在同一段内转移,位移量在:-32768~32767字节范围这种寻址方式对于条件转移或无条件转移指令都适用。近跳转中,NEARPTR可缺省。

“JMPNEARPTR标号”功能:(IP)=(IP)+16位移量

2个字节段内间接寻址转向的有效地址(EA)是一个寄存器或是一个存储单元的内容,用该值来取代IP寄存器的内容。段内间接寻址段内间接寻址转移指令:

JMPBX

JMP

WORD

PTR[BP+TABLE]注:WORDPTR说明所取得的转向地址是一个字(16位)有效地址。直接把求得的转向有效地址送到IP寄存器转移的物理地址计算公式:

物理地址=16d

(DS)+EA例:假设(DS)=2000H,(BX)=1256H,(SI)=528FH;位移量TABLE的内容=20A1H,(232F7H)=3280H,(264E5H)=2450H,对指令

JMPBX;(IP)=1256H

JMPWORDPTR[TABLE+BX] ;(IP)=3280H

JMP[BX][SI] ;(IP)=2450H

JMP

SHORTTABLE ;(IP)=20A1H

求各指令转向的(IP)=?段间直接寻址

(intersegmentdirectaddrESsing)目标地址在指令中指令中直接提供了转向段地址和偏移地址28偏移地址段地址IP寄存器CS寄存器指令例:JMP

FARPTRNEW_ROUTINENEW_ROUTINE为转向的符号地址FARPTR表示段间转移偏移地址取代IP寄存器内容段地址取代CS寄存器内容段间直接转移操作方法段间转移,CS和IP都要更新,新CS和新IP由指令操作码之后的连续两个字提供OPIPCS用段间转移的操作符FARPTRFAR表示:转移距离超过±32K字节,或在不同段之间转移。段间间接寻址

(intersegmentindirectaddressing)目标地址存放在存储器中指令形式:

JMPDWORDPTR[SI]

CALL

DWORDPTRarray[BX+SI] CALL

DWORDPTR[INTERS+BX]其中,[INTERS+BX]说明寻址方式为直接变址寻址方式,DWORDPTR为双字操作符,说明转向地址需取双字为段间转移指令。转移方法用存储器中的第一个字的内容取代(IP)用存储器中的第二个字的内容取代(CS)偏移地址段地址IP寄存器CS寄存器存储器求物理地址用存储器中两个相继字的内容取代IP和CS寄存器中的原始内容,以达到转移的目的。例子段间间接寻址用双字操作符DWORDPTRR,段间转移转向地址需取双字例:JMP

DWORDPTRTABLE[SI]例:JMP

DWORDPTRES:TABLE[SI]例:JMP

DWORDPTR[SP]例:JMP

DWORDPTRARRAY注意:与JMP

FARPTRARRAY的区别跳转小结:JMPAddress;无条件转移跳转的几个例子JMP

SHORTADDR1 ;段内直接寻址

;跳8位JMP

NEARPTRADDR2

;段内直接寻址 ;跳16位JMPTABLE[BX];段内间接寻址JMP

FARPTRADDR3;段间直接寻址跳转的几个例子JMP

DWORDPTR[AGAIN+BX];段间间接寻址JMP

BX

;段内间接寻址JMP[BX+DI];段内间接寻址3.3指令系统指令系统可分为6组:数据传送指令算术指令-乘法与除法逻辑指令控制转移指令串处理指令处理机控制指令3.3.1数据传送指令通用数据传送指令累加器专用传送指令

地址传送指令标志寄存器传送指令类型转换指令数据传送指令一、通用数据传送指令1.MOV(来自Move):传送指令一般形式:

MOV dst,src

;(dst)←(src),将源操作数src复制到目的操作 数dst,src不变。说明:两个操作数的数据类型要相同,要同为8位、16位或32位;两个操作数中必须有一个寄存器,但不能同时为段寄存器;代码段寄存器CS不能为目的操作数,但可作为源操作数;指令指针IP不能作为MOV指令的操作数;立即数不能作为目的操作数;立即数不能直接传给段寄存器;两个操作数不能同时为存储单元对标志位无影响8位通用寄存器8个:AL、AH、BL、BH、CL、CH、DL、DH。16位通用寄存器8个:AX、BX、CX、DX、SI、DI、BP、SP。32位通用寄存器8个:EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。数据传送指令100MOV指令传送方式101注意错误指令MOVDS,32543DMOVDS,DATA ;这里的DATA为段名

;注意:如DATA为变量名或标号地址,则指令MOVDS,DATA是正确的MOVCS,AXMOVSS,DSMOV[SI],TABLE关于方括号[]汇编指令中,方括号[]的含义

:表示一种间接的取操作数方式寄存器能加方括号的只有4个:SI,DI,BX,BP常数、变量名也可以加方括号,比如[020H]常数加方括号表示地址,而不加,则表示立即数。但,变量名是否加方括号情况一样,都是间接寻址。102关于方括号[]如:ADDAL,[SI]与AL中内容相加的数,不是SI寄存器的内容,而是以SI的内容作为地址指针的内存操作数。103关于方括号[]方括号内,可以不同表达方式。

SI是寄存器寻址

[SI]是寄存器间接寻址[SI+2]是相对寄存器间接寻址又称直接变址寻址,也可以写成2[SI]形式。[BX+SI]是基址变址寻址也可写成[BX][SI][BX+SI+20H]是相对基址变址寻址可以写成20H[BX][SI]之类的形式将20H换成变量名也可以。104例1:MOVAX,DATA_SEGMOVDS,AX;段地址必须通过寄存器送到DS寄存器例2:MOVAL,'E';将立即数(字符E的ASCII码)送入AL寄存器105例3:MOVBX,OFFSETTABLE;把TABLE的偏移地址送入BX寄存器;这里OFFSET为属性操作符,表示将其后的符号地址值(不是内容)作为操作数。例4:MOVAX,Y[BP][SI];有效地址EA=(BP)+(SI)+位移量Y106107PUSH/POP字操作,针对栈(Stack)操作,先进后出(FILO)16位操作数(8086)通用寄存器段寄存器(CS不能用于POP)存储器SP指向栈顶底部高地址/顶部低地址数据传送指令进栈指令(入栈)PUSH(Pushontothestack)一般形式:

PUSH

reg/mem/seg/imm

操作数可以是:寄存器、存储器、段寄存器以及立即数功能描述:PUSH16位操作数时:

SP=SP-2 SS:[SP]指向16位操作数PUSH32位操作数时:

SP=SP-4 SS:[SP]指向32位操作数

以上指令均对标志位无影响。可以使用所有的寻址方式,但8086不允许PUSH使用立即数。286及后继机型允许使用立即数。109PUSH进栈指令

格式为PUSHSRC执行操作:16位:(SP)

(SP)-2

((SP)+1,(SP))

(SRC)32位:

(ESP)

(ESP)-4

((ESP)+3,(ESP)+2,(ESP)+1,(ESP))

(SRC)例3.29 PUSHAX110数据传送指令出栈指令

POP(Popfromthestack)一般形式: POPreg/mem/seg功能描述:

POP16位操作数时:

16位操作数←SS:[SP],

SP=SP+2 POP32位操作数时:

32位操作数←SS:[SP],

SP=SP+4

以上指令均对标志位无影响。不允许使用立即数!112POP出栈指令格式为POPDST执行操作16位:(DST)

((SP)+1,(SP))

(SP)

(SP)+232位:

(DST)

((SP)+3,(SP)+2,(SP)+1,(SP))(SP)

(SP)+4例3.30 POPAX113数据传送指令例1:设SP=100H,EBX=12345678H,给出下列指令依次执行后的结果。

PUSH BX ;SS:[00FFH]=56H

;SS:[00FEH]=78H,SP=0FEH POP AX ;AX=5678H,SP=100H PUSH EBX ;SS:[00FFH]=12H

;SS:[00FEH]=34H

;SS:[00FDH]=56H

;SS:[00FCH]=78H,SP=0FCH POP AX ;AX=5678H,SP=0FEH POP DX ;DX=1234H,SP=100H

例2:利用进栈和出栈指令交换AX与CX的值。

PUSH AX PUSH CX POP AX POP CX115注意SP的内容在任何时候都指向当前的栈顶

堆栈的存取必须以字为单位(16位机),用SP;或以双字为单位(32位机),用ESP。这两条堆栈指令不影响标志位POP指令不允许用CS寄存器,POPCS错堆栈的特点80x86系统的堆栈具有如下特点:堆栈是在内存中专门指定的某一段为堆栈段,具有“先进后出”的特点。堆栈只有一个出入口,即当前栈顶(SP)。当堆栈为空时,栈顶和栈底指向同一内存单元。堆栈有两个基本操作:PUSH(进栈)操作:使栈顶向低地址方向移动POP(出栈)操作:使栈顶向高地址方向移动堆栈操作只能以字或双字为单位。堆栈指针SP/ESP(地址长度为32位时使用ESP作为堆栈指针)总是指向栈顶。数据传送指令XCHG(eXCHanGe)交换指令一般形式:

XCHG oprd1,oprd2

;交换oprd1与oprd2的内容功能说明:对标志位无影响。

oprd1与oprd2不能都是内存操作数。

oprd1与oprd2类型必须匹配。118XCHG交换指令格式为XCHGOPRl,OPR2执行操作:(OPRG1)←→(OPR2)8位/16位操作数交换:寄存器←→寄存器;寄存器←→存储器段寄存器不能参与OPRl、OPR2至少一个是寄存器数据传送指令例: 已知EBX=12345678H,EDX=11223344H

执行指令 XCHG EBX,EDX后 得EBX=11223344H,EDX=12345678H

已知单元2300H和2301H内容为30H和40H,DX=5678H

执行指令 XCHG [2300H],DX后 得2300H和2301H内容为78H和56H,DX=4030H120练习分析下面程序段,回答指定问题

MOVAX,0123HMOVBX,0321HPUSHAXPUSHBXPOPAXPOPBX问AX=

,BX=

。121例假设(DS)=1000H,(SS)=4000H,(SP)=100H,(BX)=2100H,(12100)=00A8H,指出连续执行下列各条指令后,出现的有关寄存器、存储单元以及堆栈的情况。

PUSH

DS

PUSH

BX

PUSH

[BX]

POP

DI

POP

WORDPTR[DI+2]

POP

DS122XCHG的使用举例例已知(AX)=6634H,(BX)=0F24H,(SI)=0012H,(DS)=1200H,(12F36H)=2500H,写出下列指令执行的结果。

XCHG

AX,[BX+SI];执行前:(AX)=6634H,(12F36H)=2500H

;执行后:(AX)=2500H,(12F36H)=6634H123累加器(AX,AH,AL)专用传送指令IN:输入(I/O

CPU)OUT:输出(CPU

I/O)XLAT:换码所有I/O端口与CPU之间的通信都由IN和OUT指令来完成IN:输入,I/O端口==>CPUOUT:输出,CPU==>I/O端口只限于使用累加器EAX、AX或AL传送信息例:INAX,28HOUT5,EAXIN、OUT:I/O端口与CPU之间的通信数据传送指令累加器专用传送指令

如果某输入设备的端口地址在0~255(00~FFH)范围之内,称为长格式,可在指令中直接给出Port,否则称为短格式,而且要把该端口地址先存入寄存器DX中,然后再用IN或OUT指令来传送信息。这里的端口号和DX的内容均为地址。以上指令均对标志位无影响。

IN

(Input)输入指令一般形式: IN

AL/AX/EAX,Port/DX功能说明:

从端口读入一个字节、字或双字,并保存在寄存器AL或AX或EAX中。OUT(Output)输出指令一般形式: OUT

Port/DX,AL/AX/EAX功能说明:把寄存器AL或AX或EAX的内容输出到指定端口。IN输入指令格式

长格式为:INAL,PORT(字节)

INAX,PORT(字)

INEAX,PORT(双字)

执行的操作:(AL)←(PORT)(字节)

(AX)←(PORT+1,PORT)(字)(EAX)←(PORT+3,PORT+2,PORT+1,PORT)确定是否为字节、字、双字的依据是源操作数

例:INEAX,45H

PORT号至多8为位,即:0~255或00H~FFH

例:INAX,45HINAL,DX(字节);通过DX进行数据过渡

INAX,DX(字)

INEAX,DX(双字)执行的操作:(AL)←((DX))(字节)(AX)←((DX)+1,(DX))(字)(EAX)←((DX)+3,(DX)+2,(DX)+1,(DX))(双字)例:MOVDX,28HINAX,DX或如INEAX,DX短格式数据传送指令累加器专用传送指令例:

INAL,20H ;从端口20读入1个字节的内容,传送到累加器AL。

INAL,DX ;DX需预先赋值,从指定端口传送一个字节到AL。

OUT28H,AX ;从AX输出一个字的内容到端口28H和29H。OUT输出指令长格式为:OUTPORT,AL(字节)OUTPORT,AX(字)OUTPORT,EAX(双字)短格式为:OUTDX,AL(字节)OUTDX,AX(字)OUTDX,EAX(双字)

执行情况与IN相反例:OUT5,AL;设(DX)=345H,OUTDX,EAX小结IN与OUT*

不影响标志位*前256个端口号00H~FFH可直接在指令中指定(长格式)*如果端口号

256,必须端口号

DX(短格式)例:INAX,28H;MOVDX,28H;INAX,DX例:测试某状态寄存器(端口号27H)的第2位是否为1INAL,27HTESTAL,00000100BJNZERROR;若第2位为1,转到ERROR处理数据传送指令地址传送指令:LEA(LoadEffectiveAddress)有效地址装入指令 一般形式:

LEA reg,mem ;reg←mem的有效地址

功能说明:把一个内存变量的有效地址送给指定的寄存器(此处reg不能使用段寄存器)。当reg长度大于地址长度时,将地址零扩展后存入reg; 当reg长度小于地址长度时,截取地址的低16位存入reg。通常用来对指针或变址寄存器BX、DI或SI等置初值之用。对标志位无影响。LEA有效地址送寄存器功能:地址传送主存按源地址SRC的寻址方式计算出偏移地址,再送入指定寄存器执行的操作:(register)←SRC的地址数据传送指令地址传送指令:例:设BX=5678H,EAX=00002345H,

EDX=00001111H。

LEA SI,2[BX] ;执行后,SI=567AH

LEA SI,2[EAX][EDX] ;执行后,SI=3458H134类型转换指令CBW字节转换为字指令CWD/CWDE字转换为双字指令CDQ双字转换为4字指令BSWAP字节交换指令3.3.2算术指令算术运算指令:加减乘除算术指令:加法指令ADD

(AddBinaryNumbers)加法指令指令格式:

ADD

Reg/Mem,Reg/Mem/Imm

;(dst)←(dst)+(src)指令功能:把源操作数的值加到目的操作数中。受影响标志位:CF、PF、AF、ZF、SF和OF。ADC(AddWithCarry)带进位加指令指令格式:

ADC

Reg/Mem,Reg/Mem/Imm ;(dst)←(dst)+(src)+CF

指令功能:把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中。受影响标志位:CF、PF、AF、ZF、SF和OF。INC(Incrementby1)加1指令指令格式:

INC

Reg/Mem ;(dst)←(dst)+1指令功能:把操作数的值加1。受影响标志位:PF、AF、ZF、SF和OF,不影响CF。算术指令:加法指令算术指令方法1:用16位寄存器编写程序MOVAX,wordptrd1;由于d1是双字类型,必须使用强制类型说明符MOVDX,wordptrd1+2;(DX,AX)构成一个32位数据ADDAX,wordptrd2;低字相加ADCDX,wordptrd2+2;高字相加。在低字相加时,有可能会产生“进位”MOVwordptrd1,AX;低字送给d1的低字MOVwordptrd1+2,DX;高字送给d1的高字方法2:用32位寄存器编写程序MOVEAX,d1ADDEAX,d2MOVd1,EAX例: 已知有二个32位数d1和d2(预先定义过),编写程序片段把d2的 值加到d1中。

d1DD12345678H d2DD22221111H139条件标志位最主要:CF、ZF、SF、OF四位CF位:有进位,CF=l;无进位时CF=0OF位:若两个操作数的符号相同,而结果的符号与之相反时OF=1;否则OF=0CF位可表示无符号数的溢出OF位表示带符号数的溢出8位二进制数:无符号数为0~255,带符号数为-128~+12716位二进制数:无符号数为0~65535,带符号数为-32768~+32767140练习:求数据区中若干个十进制数的和Datareasegmentarrdb12,34,56,0a9H,45Hsumdb?datareaendsCODEsegment;定义代码段

assumeCS:CODE,DS:datareastart:MOVAX,datareaMOVDS,AXMOVBL,0MOVSI,0 MOVCL,sum-arrAgain:ADDBL,arr[SI] INCSI DECCL

JNZAgain

MOVsum,BLMOVAH,4CHINT21HCODEENDSENDSTART算术指令:减法类指令

SUB(SubtractBinaryVALues)减法指令指令格式:

SUB

Reg/Mem,Reg/Mem/Imm;(dst)←(dst)-(src)指令功能:从目的操作数中减去源操作数。受影响标志位:CF、PF、AF、ZF、SF和OF。

SBB(SubtractwithBorrow)带借位减指令指令格式:

SBB

Reg/Mem,Reg/Mem/Imm;(dst)←(dst)-(src)-CF

指令功能:把源操作数和标志位CF的值从目的操作数中一起 减去。受影响标志位:CF、PF、AF、ZF、SF和OF。

DEC(Decrementby1)减1指令指令格式:

DEC

Reg/Mem

指令功能:把操作数的值减去1。受影响标志位:PF、AF、ZF、SF和OF,不影响CF。

NEG(Negate)求补指令指令格式:

NEG

Reg/Mem

指令功能:操作数=0-操作数,即改变操作数的正负号。受影响标志位:CF、PF、AF、ZF、SF和OF。算术指令:减法类指令62A0 01100010101000009D60 + 1001110101100000 0000000000000000

CF←

1算术指令:减法类指令例1:已知AX=62A0H,BX=9D60H,

ADDAX,BX ;AX=0000H ZF=1,SF=0,OF=0 例2:已知CX=4AE0,DX=0EA04H SUBDX,CX ;DX=9F24H ZF=0,SF=1,OF=0注意减法设置CF的规则:有借位CF为1,无借位CF为0。二进制补码运算时,加出结果的进位要取反: 有进位CF=0,无进位CF=1。 EA04 11101010000001004AE0-0100101011100000

↓ 1001111100100100

CF←0 EA04 1110101000000100+[-4AE0]补+1011010100100000 1001111100100100

CF←0←1

借位←进位取反算术指令:减法类指令--数值比较指令

CMP(Compare)比较指令指令格式:CMP

Reg/Mem,Reg/Mem/Imm指令功能:用第一个操作数减第二个操作数,并根据所得的差设置有关 标志位。与SUB的区别在于不将减法结果存入dst。受影响标志位:CF、PF、AF、ZF、SF和OF。145减法指令SUB:减法,(DST)←(DST)-(SRC)SBB:带借位减法,(DST)←(DST)-(SRC)-CFDEC:DECOPR减1NEG:NEGOPR求补, (OPR)←0FFFFH-(OPR)+l

CMP:CMPOPR1,OPR2比较CMPXCHG:比较并交换146例3.48SUB[SI+14H],0136H指令执行前(DS)=3000H,(SI)=0040H,(30054H)=4336H则指令执行后

43360100001100110110-0136=>-0000000100110110↓0100001100110110+111111101100101001000010000000001↙有进位时CF=0

所以,(30054H)=4200H,SF=0,ZF=0,CF=0,OF=0147例3.49SUBDH,[BP+4]如指令执行前(DH)=41H,(SS)=0000H,(BP)=00E4H,(000E8)=5AH则指令执行后

410100000101000001-5A=>-01011010=>+1010011011100111所以,(DH)=0E7H,SF=1,ZF=0,CF=1,OF=0148例3.50设X,Y,Z均为双精度数,分别放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中。下列指令实现:W←X+Y+24-Z,用W、W+2单元放运算结果。MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2ADDAX,24ADCDX,0;+24SUBAX,Z ;CF不参与运算,但受其影响。SBBDX,Z+2;-Z;SBB需要在SUB基础上再减去CF值MOVW,AXMOVW+2,DX;结果存入W,W+2149指令与程序初步举例输入与输出:从键盘输入2个字符,存放于字节变量A、B中,然后从屏幕输出这2字符。DatareasegmentADB?BDB?datareaendsCODEsegment

;定义代码段

assumeCS:CODE,DS:datareastart:

MOVAX,datareaMOVDS,AXMOVAH,1INT21HMOVA,ALMOVAH,1INT21HMOVB,ALMOVAH,2MOVDL,AINT21HMOVDL,BINT21H

MOVAH,4CHINT21HCODEENDSENDstart键盘输入键盘输入显示DL值显示DL值150示例:字符串打印-汇编实现datareasegmentstrDB'Shanghai$'ADW5134H,9798HdatareaendsCODEsegment

;定义代码段

assumeC

温馨提示

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

评论

0/150

提交评论