汇编语言基础--8086汇编指令

汇编语言基础--8086汇编指令
汇编语言基础--8086汇编指令

微处理器指令系统

概述:一台计算机所能识别和执行的全部指令,称为该机器的指令系统,又称指令集。

一般指令分为:“告诉计算机干什么”的指令操作助记符,“指令操作对象”即操作数。寻址方式

概述:指定操作数或操作数存放位置的方法称为寻址方式。

8086的寻址方式有三类:立即寻址、寄存器寻址和存储器寻址;其中存储器寻址又分为直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址五种。

立即寻址:操作数直接写在指令中的寻址方式,因为这种操作数称为立即数,所以这种寻址方式也称为立即数寻址方式。立即数可以使8位;16位;32位;

例如:MOV AX,6789H ADD AX,1234H

寄存器寻址:指令所要的操作数事先已存储在某寄存器中,或把目标操作数存入寄存器中,或者源操作数和目标操作数都是寄存器。

例如:MOV AX,BX MOV AX,6789H(源操作数是立即数寻址,目的操作数是寄存器寻址)

存储器寻址:在存储器中查找操作数。

1·直接寻址方式:指令所要的操作数存放在内存中,在指令中直接给出操作数的段地址和有效地址,从而使8086的BIU部件能够利用地址加法器得到实际物理地址。

例如:MOV AX,DS:[2000H](mov 默认DS为存放数据的段,所以这个指令等价于MOV AX,[2000H])

MOV AX,ES:[2000H]

2·寄存器间接寻址方式:操作数在存储器中,操作数的有效地址用SI,DI,BX,BP 4个集训期之一来指定。若不使用段前缀,则规定若有效地址用SI,DI,BX等之一来指定,则默认的段寄存器是DS,若有效地址用BP来指定,则其默认的段寄存器位SS。

例如:MOV BX,[DI]

3·寄存器相对寻址方式:操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI、DI)的内容和指令中的8/16位偏移量之和。

例如:MOV BX,[SI+100H]

4·基址加变址寻址方式:操作数有效地址是一个基址寄存器(BX,BP)和一个变址寄存器(SI,DI)的内容之和。(不要混淆基址寄存器和变址寄存器)

例如:MOV BX,[BX,DI]

5·相对基址加变址寻址方式:操作数有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8/16位偏移量之和。

例如:MOV AX, [BX+DI+1234H]

32位地址的寻址方式

在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)都可以是地址偏移量的一个组成部分。

8086指令

概述:指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。

分类:数据传送指令,标志位操作指令,算术运算指令,逻辑运算指令,移位操作指令,比较运算指令,循环指令,转移指令,条件设置字节指令,字符串操作指令,ASCII-BCD 码运算调整指令,处理器指令。

基本格式:指令助记符[操作数1[,操作数2[,操作数3]]] (指令助记符体现该指令的功能,它对应一条二进制编码的机器指令)。

数据传送指令:

1·MOV:传送指令,这是使用最频繁的指令,它相对于高级语言的赋值语句。

格式:MOV Reg/Mem,Reg/Mem/Imm

(Reg---Register 寄存器,Mem---Memory 存储器,Imm---Immediate 立即数)

使用规定:1·两个操作数的数据类型要相同;2·两个操作数不能同时为段寄存器;3·代码段寄存器CS不能为目的操作数,但可作为源操作数;4·立即数不能直接传给段寄存器;5·立即数不能作为目的操作数;6·指令指针IP,不能作为MOV指令的操作数;7·两个操作数不能同时为存储单元。

2·XCHG:交换指令,是两个寄存器之间,寄存器和内存变量之间进行数据交换的指令,两个操作数的数据类型要相同。

格式:XCHG Reg/Mem,Reg/Mem

3·LEA:取有效地址指令,是把一个内存变量的有效地址送给指定的寄存器。

格式:LEA Reg,Mem

4·LDS/LES/LFS/LGS/LSS:装载段寄存器指令,把内存中地址的“低字”传送给指令中指定的16位寄存器,把随后的“高字”传给相应的寄存器(DS、ES、FS、GS、SS);

格式:LDS/LES/LFS/LGS/LSS Reg,Mem

5·PUSH/POP:堆栈操作指令,堆栈是一个重要的数据结构,具有“先进后出”的特点,通常用来保存程序的返回地址。

PUSH:进栈指令;

格式:PUSH Reg/Mem

POP:出栈指令

格式:POP Reg/Mem

6·标志寄存器传送指令

A·LAHF:标志送AH指令,FLAGS的低8位送AH。

格式:LAHF

B·SAHF:AH送标志寄存器指令,AH值送FLAGS的低8位

格式:SAHF

C·PUSHF/PUSHFD:标志寄存器进栈指令,把16/32位标志寄存器进栈

格式:SAHF

D·POPF/POPFD:标志寄存器出栈指令,把栈顶的16/32位数据出栈给标志寄存器。

7·XLAT:转换指令,把给出的指令中明确给出的内存地址或默认的BX值作为内存字节数组首地址、下标为AL的数组元素的值传送给AL。

这个指令可以给出一个内存地址作为操作数,也可以没有形式上的操作数,但有两个隐含操作数BX和AL。

格式:XLAT Mem或XLAT

8·IN、OUT:I/.O指令,访问io端口的指令。

A·输入指令IN:从端口中读入一个字节或字,并保存在寄存器AL或AX中。

格式:IN AL/AX,Port/DX

B·输出指令OUT:把寄存器AL或AX的内容输出到指定端口。

格式:OUT Port/DX,AL/AX

加法指令

1·ADD:加法指令,把源操作数的值加到目的操作数中。

格式:ADD Reg/Mem,Reg/Mem

受影响的标志位:AF、CF、OF、PF、SF、ZF

2·ADC:带进位的加指令,把源操作数和进位标志位CF的值一起加到目的操作数中。

格式:ADC Reg/Mem,Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF、ZF

3·INC:加一指令,把源操作数的值加1

格式:INC Reg/Mem

受影响的标志位:AF、OF、PF、SF、ZF,不影响CF

减法指令

1·SUB:减法指令,从目的操作数中减去源操作数

格式:SUB Reg/Mem,Reg/Mem/Imm

受影响标志位:AF、CF、OF、PF、SF、ZF

2·SBB:带借位的减,把源操作数和标志位CF的值从目的操作数中一起减去格式:SBB Reg/Mem,Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF、ZF

3·DEC:减1指令,把源操作数减去1

格式:DEC Reg/Mem

受影响的标志位:AF、OF、PF、SF、ZF,不影响CF

4·NEG:求补指令,改变操作数的正负号

格式:NEG Reg/Mem

受影响的标志位:AF、CF、OF、PF、SF、ZF

5·CMP:比较指令,用第二个操作数减去第一个操作数,根据差设置有关标志位。

影响ZF标记位,比较的两者相同则ZF为1。

乘法指令

隐含的操作数是被乘数,乘数在指令中显示的写出来。CPU会根据乘数是8位、16位、还是32位操作数,来自动选用被乘数:AL、AX或EAX

1·MUL:无符号数乘法指令,把显示操作数和隐含操作数(都作为无符号数)想乘。

格式:MUL Reg/Mem

受影响的标志位:CF和OF(AF、PF、SF和ZF无定义);

2·IMUL:有符号数乘法指令,具有符号运算,其余和MUL相同

格式:IMUL Reg/Mem

除法指令

隐含的操作数是被除数,除数在指令中显示的写出来.CPU会根据除数是8位、16位还是32位,来自动选用被除数(AX、DX:AX,还是EDX:EAX);

功能:用显式的操作数去除隐含操作数,可得到商和余数。当商超过数据范围或除数为0,系统自动产生0中断。

1·DIV:无符号数除法指令,用显式操作数去除隐含操作数(都作为无符号数)。

指令对标志位的影响无定义。

格式:DIV Reg/Mem

2·IDIV:有符号数除法指令,用显式操作数去除隐含操作数(都作为有符号数)。

格式:IDIV Reg/Mem

数据类型转换指令

在有符号除法时,把短位数的被除数转换为位数更长的数据类型,以适应除法运算的要求。

1·CBW:字节转换为字指令,用AL的符号位去填充AH,即:当AL为正数,则AH=0,否则,AH=0FFH。指令不影响任何标志位。

格式:CBW

2·CWD:字转换为双字指令,该指令的隐含操作数为AX、DX,用AX的符号位去填充DX。指令不影响任何标志位。

格式:CWD

逻辑运算指令

主要有:逻辑与(AND)、逻辑或(OR)、逻辑非(NOT)、和异或指令(XOR)等

1·AND:逻辑与指令,将源操作数的每位二进制与目的操作数中的相应二进制按位进行逻辑“与操作”,操作数存入目的操作数中。

格式:AND Reg/Mem,Reg/Mem/Imm

受影响的标志位:CF(0),OF(0),PF,SF,ZF(AF无定义)

2·OR:逻辑或指令,把源操作数的每位二进制与目的操作数中的相应二进制按位进行逻辑“或操作”,操作数存入目的操作数中。

格式:OR Reg/Mem,Reg/Mem/Imm

受影响的标志位:CF(0),OF(0),PF,SF,ZF(AF无定义)

3·NOT:逻辑非指令,把源操作数的每位取反

格式:NOT Reg/Mem

指令不影响任何标志位。

4·XOR:逻辑异或指令,把源操作数的每位二进制与目的操作数中的相应二进制按位进行逻辑“异或操作”,操作数存入目的操作数中。

格式:XOR Reg/Mem,Reg/Mem/Imm

受影响的标志位:CF(0),OF(0),PF,SF和ZF

5·TEST:检测指令。其实是一个不保留结果,只影响标志位的逻辑“与”指令。

格式:TEST Reg/Mem,Reg/Mem/Imm

受影响的标志位:CF(0),OF(0),PF,SF,ZF

移位指令

包括:算术移位、逻辑移位、循环移位、带进位移位和双精度移位。

1·SAL:算术左移,向左逐位移动源操作数指定(CL/Imm)的次数,移位后,最低位用0补充,最高位移入CF。

格式:SAL Reg/Mem,CL/Imm

2·SAR:算术右移,向右逐位移动源操作数指定(CL/Imm)的次数,移动后,最高位用符号位补充,最低位移入CF。

格式:SAR Reg/Mem,CL/Imm

3·SHL:逻辑左移,在功能上和SAL完全相同

格式:SHL Reg/Mem,CL/Imm

4·SHR:逻辑右移,向右逐位移动源操作数指定(CL/Imm)的次数,移动后,最高位用0补充,最低位移入CF。

5·ROL:循环左移,对指定的寄存器或存储器操作数左移循环移动源操作数指定(CL/Imm)的次数,移动后,把最高位同时移入CF和操作数最低位。

格式:ROL Reg/Mem,CL/Imm

6·ROR:循环右移,对指定的寄存器或存储器操作数右移循环移动源操作数指定(CL/Imm)的次数,移动后,把最低位同时移入CF和操作数最高位。

格式:ROR Reg/Mem,Cl/Imm

7·RCL:带进位的循环左移,对指定的寄存器或存储器操作数,连同进位标志CF 左循环移动源操作数指定(CL/Imm)的次数,移动后,把操作数的最高位移入CF,而把CF原有内容移入源操作数的最高位。

格式:RCL Reg/Mem,CL/Imm

8·RCR:带进位的循环右移,对指定的寄存器或存储器操作数,连同进位标志CF 右循环移动源操作数(CL/Imm)的次数,移动后,把操作数的最高低位移入CF,而CF中原有内容移入操作数的最高位。

格式:RCR Reg/Mem,CL/Imm

循环指令

循环指令的循环次数都保存在计数器CX中,有的循环指令还可以由标志位ZF来决定是否结束循环;

1·循环指令

1·LOOP:循环指令。

格式:LOOP 标号

2·LOOPZ/LOOPE:相等或为零循环指令。

格式:LOOPZ/LOOPE 标号

3·LOOPNE/LOOPNZ:不等或不为零循环指令

格式:LOOPNE/LOOPNZ 标号

标号是在程序中的某个标记,表示符合条件时程序跳到标记处继续执行。

2·循环计数器为零转指令

一般用于循环的开始,先判断CX是否为0,在进入循环体执行,可以与循环指令配合,构成“当”型循环。

格式:JCXZ 标号若cx为0,则执行标记处程序

转移指令

1·JMP:无条件转移指令,是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是短转移【偏移量-128 ~ 127】、近转移【偏移量-32K ~ 32K】、远转移【在不同代码之间转移】

格式:JMP 标号/Reg/Mem

2·JXX 条件转移指令,它根据标志寄存器中一个(或多个)标志位来决定是否需要转移。

格式:JXX 标号/Reg/Mem

注意:条件转移指令的操作数必须是一个短标号,也就是所有条件转移指令都必须是2字节指令。条件转移指令对状态标记位没有影响。

条件转移指令有:

(单标志位)JE/JZ(等于、零),JNE/JNZ(不等于/不为零),JS(负---符号位位1),JNS (正---符号位位0),JP/JPE(偶),JNP/JPO(奇),JO(溢出),JNO(不溢出),JC(有进位/有进位),JNC(无进位/无借位)

(无符号数)JA/JNBE(高于、不低于也不等于),JAE/JNB(高于或等于不等于),JB/JNAE (低于、不高于也不等于),JBE/JNA(低于或等于、不高于)

(带符号数)JG/JNLE(大于、不小于也不等于),JGE/JNL(大于或等于/不下雨),JL/JNGE(小于、不大于也不等于),JLE/JNG(小于或等于、不大于)

字符串操作指令

指令的实质就是对一篇连续存储单元进行处理,存储单元的地址由隐含指针DS:SI或ES:DI来指定。指令可对内存单元按字节、字或双字记性处理。

1·LODS:取字符串数据指令,从由指针DS:SI所指向的内存单元开始,取一个字节、

字或双字进入AL、AX或EAX中,并根据标志位DF对寄存器SI作相应增减。

格式:LODS 地址表达式

该指令不影响任何标志位

2·STOS:置字符串数据指令,把寄存器AL、AX或EAX中的值存于以指针ES:DI 所指向内存单元为起始的一篇内存单元里,并根据标志位DF对寄存器DI作相应增减。

格式:STOS 地址表达式

该指令不影响任何标志位。

3·MOVS:字符串传送指针,把指针DS:SI所指向的字节、字或双字传送给指针ES:DI所指向内存单元,并根据标志位DF对寄存器DI和SI作相应的增减。

格式:MOVS 地址表达式1,地址表达式2

该指针不影响任何标志位。

4·CMPS:把指针DS:SI和ES:EI所指向的自己、字或双字的值相减,并用所得到的差来设置有关的标志位,同时变址寄存器SI和DI也将根据标志位DF的值作相应增减。

格式:CMPS 地址表达式1,地址表达式2

受影响的标志位:与CMP相同,会影响AF、CF、OF、PF、SF、ZF

5·SCAS:字符串扫描指令,用指针ES:DI所指向字节、字或双字的值与相应的AL、AX的值相减,用所得到的差来设置有关标志位,同时变址寄存器DI还将根据标志位DF 的值进行增减。

格式:SCAS 地址表达式1

受影响的标志位:AF、CF、OF、PF、SF、ZF

6·字符串操作重复前缀;之前的字符串操作指令都是针对单一的字符进行,为了对一个字符串重复使用操作指令,指令系统提供了一组重复前缀指令。

A·重复前缀REP:重复其后的字符串操作指令,重复的次数由事先存放在CX中的值的变化来决定。

格式:REP LODS/LODSB/LODSW

B·条件重复前缀:和之前的REP功能类似,区别在与其重复次数不仅由CX决定,还会由标志位ZF来决定。

根据ZF所起的作用又分为:相等重复前缀指令REPE/REPZ和不等重复前缀指令REPE/REPZ。

①相等前缀指令

格式:REPE/REPZ SCAS/SCASB/SCASW/SCASD

REPE/REPZ CMPS/CMPSB/SMPSW/CMPSD

②不重复前缀指令

格式:REPNE/REPNZ SCAS/SCASB/SCASW/SCASD

REPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD

ASCII和BCD码调整指令

为了方便十进制数进行算术运算,指令系统专门提供一组十进制数调整指令。

1·AAA:加法的ASCII码调整指令

2·AAS:减法的ASCII码调整指令

3·AAM:乘法的ASCII码调整指令

4·AAD:除法的ASCII码调整指令

5·DAA:加法的十进制数调整指令

6·DAS:减法的十进制数调整指令

处理器指令

1·标志位操作指令

是一组对标志位置位、复位、保存和恢复等操作的指令,指令都没有形式上的操作数。

A·进位标志CF操作数指令

清进位指令:CLC ;CF<--0

置进位指令:STC ;CF<--1

进位取反指令:CMC ;CF<---not CF

B·方向控制位DF操作指令

清方向指令:CLD ;DF<-----0

置方向指令:STD ;DF<-----1

C·中断允许控制位IF操作指令

清中断允许位指令:CLI ;IF<-----0

该指令的功能是不允许可屏蔽的的外部中断来中断其后程序的执行。

置中断允许位指令:STI ;IF<------1

该指令的功能是恢复可屏蔽的外部中断相应功能。

2·NOP:空操作指令,主要起到延迟下一条指令的运行。延迟指令运行也可以用其他指令产生延时,如:“XCHG AX,AX”

格式:NOP

不影响任何标志位

3·W AIT:等待指令,使CPU处于等待状态,等待协处理器的运算,CPU不断检测TEST 引脚状态,知道协处理器完成运算,TEST引脚变为低为止。

格式:WAIT

指令不影响任何标志位

4·HLT:暂停指令,使CPU处于暂停工作状态,等到外中断的到来,此时CS:IP只想下一条要执行的指令。发生中断时,CPU把CS和IP压栈,并转入中断处理程序,在中断处理程序执行完后,中断返回弹出IP和CS,CPU自动退出暂停状态,执行HLT后面的指令。

5·LOCK:封锁数据指令,这是一个前缀指令,其后跟一个具体的操作指令。LCOK 指令可以保证在其后执行过程中,禁止协处理器修改数据总线上的数据,起到独占总线的作用。多任务时,可以用它来保证独占内存。

只有一下指令可以使用LOCK前缀:XCHG、ADD、INC、SUB、SBB、DEC、NEC、OR、AND、XOR、NOT、BT、BTS、BTR、BTC。

指令不影响任何标志位。

80286及以上型号CPU扩充的指令

80286及以上型号的CPU所能够执行的指令,在8086指令系统的基础上有了很大的扩充。主要表现在三个方面:数据类型的扩充;原有功能的扩充;完全新的指令

1·传送并扩展指令

把位数短的源操作数,传送给位数长的目的操作数,并且扩展填充满目的操作数。

A·MOVSX:传送并扩展符号位指令,把源操作数的内容送到目的操作数,并且用符号位扩展填充满目的操作数。

格式:MOVSX Reg/Mem,Reg/Mem/Imm

B·MOVZX:传送并扩展零指令,把源操作数的内容送到目的操作数,并用零填充目的操作数空出的高位。

格式:MOVZX Reg/Mem,Reg/Mem/Imm

2·堆栈指令

在80286及以上的系统中可以对双字类型的数据进行操作,并增加了一些实用的指令。

A·PUSH:进栈指令,可以单字进栈,也可以双字进栈,还可以是立即数进栈。根据进栈操作数的位数修改堆栈指针ESP。

格式:PUSH Imm

B·PUSHA:16位通用寄存器进栈指令,依次把寄存器AX、CX、BX、SP、BP、SI、DI等压栈。

格式:PUSHA

C·PUSHAD:32位通用寄存器进栈指令,把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI等压栈。

格式:PUSHAD

D·POP:出栈指令,根据操作数,弹出一个字或双字,对双字出栈。

格式:POP Reg/Mem

E·POPA:16位通用寄存器出栈指令,一次吧寄存器DI、SI、BP、SP、DX、CX、AX 等弹出栈。与PUSHA对称。

格式:POPA

F·POPAD:32位通用寄存器出栈指令,依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX等弹出栈,与PUSHAD对称。

格式:POPAD

3·数据类型转换指令(符号扩展指令)

A·CWDE:字转换为双字指令,指令隐含操作数AX,其功能是用AX的符号位填充EAX的高字位。

格式:CWDE

该指令不影响标志位

B·CDQ:双字转换为4字指令,隐含操作数EAX和EDX,用EAX的符号位填充EDX。

格式:CDQ

指令不影响标志位

4·移位指令

此组指令有:双精度左移SHLD和双精度右移SHRD,都具有三个操作数。

SHLD/SHRD Reg/Mem,Reg,CL/Imm

执行SHLD指令时,第一个操作数向左移n位,其“空出”的低位由第二个操作数的高n位来填补,但第二个操作数自己不移动、不改变。

执行SHRD指令时,第一个操作数向右移n位,其“空出”的高位由第二个操作数的低n位来填补,但第二个操作数自己不移动、不改变。

受影响的标志位:CF、OF、PF、SF、ZF

5·位操作指令

A·位扫描指令

格式:BSF/BSR Reg,Reg/Mem

指令在第二个操作数中寻找第一个“1”的位置。如果找到,则该“1”的位置保存在第一个操作数中,并置标志位ZF为1,否则,置标志位ZF为0。

受影响的标志位:ZF

B·位检测指令

格式:BT/BTC/BTR/BTS Reg/Mem,Reg/Mem

指令把第一个操作数中某一位的值传送给标志位CF,具体的哪一位由指令的第二个操作数来确定。

受影响的标志位:CF

6·CMPXCHG:比较交换指令,比较运算指令是先进行比较,再根据比较的结果决定是进行操作数的交换操作。

当两个操作数相等时,置标志位ZF为1;否则,把第一个操作数的值赋给第二个操作数,并置标志位ZF为0。

A·8位/16位/32位交换指令

格式:CMPXCHG Reg/Mem,AL/AX/EAX

受影响的标志位:AF、CF、OF、PF、SF、ZF

B·64位比较交换指令

该指令只有一个操作数,第二个操作数是隐含的EDX

格式:CMPXCHG*B Reg/Mem,

只影响ZF标志位。

7·SET:条件字节设置指令,条件字节设置指令时80386及其以后CPU所具有的一组指令。在测试条件方面条件转移是一致的,但在功能方面,他们不是转移,而是根据测试条件的值来设置其字节操作数的内容位1或0。

格式:SETxx Reg/Mem

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

8086汇编指令手册

8086汇编指令手册 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP 交换32位寄存器里字节的顺序 XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) XLAT 字节查表转换. —— BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即 0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL ) 2. 输入输出端口传送指令. IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器) 输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时, 其范围是0-65535. 3. 目的地址传送指令. LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI. LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI. LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI. LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI. 4. 标志传送指令. LAHF 标志寄存器传送,把标志装入AH. SAHF 标志寄存器传送,把AH内容装入标志寄存器.

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

8086汇编指令大全.

标志寄存器:9个有效位,分 6个状态寄存器和 3个控制寄存器 CF 当执行一个加法(减法使最高位产生进位(借位时 CF=1 否则 CF=0 PF 指令执行的结果低 8位有偶数个一时, CF=1 否则 CF=0 AF 当执行一个加法(减法使运算结果低 4位向高 4位有进位(借位时 AF=1 否则 AF+0 ZF 当前运算结果为零, ZF=1 否则 ZF=0 SF 符号标志位 OF 溢出标志位 DF 方向标志位 IF 中断允许位 IF=1时响应外部中断

TF 跟踪标志位 操作数:[目的操作数(OPD ,源操作数(OPS ] ;立即操作数,寄存器操作数,存储器操作数。寻址方式: 1 寄存器寻址例:INC AX ; MOV AX , BX 2 寄存器间接寻址 (寄存器只能是 BX , DI , SI , BP ; [PA=(BX 、 DI 、 SI +DS》 4 或 BP+SS》4] 3 寄存器相对寻址 4 基址变址寻址 5 相对基址变址寻址 6 直接寻址 7 立即数寻址 i. 立即数寻址立即数寻址不能用在单操作数指令中 ii. 在双操作数中,立即数寻址方式不能用于目的操作数字段 指令系统: 1 数据传送指令 mov 注意: 不允许在两个存储单元之间直接传送数据

不允许在两个段寄存器之间传送数据 不允许用立即数直接为段寄存器赋值 不影响标志位 不允许寄存器或存储单元到除 CS 外的段寄存器 2 入栈(出栈指令 PUSH (POP 注意: PUSH 操作数不能是“立即数” POP 操作数不能是段寄存器 CS 不影响标志位 先进后出 单操作符 3 交换指令 XCHG 注意:

汇编语言指令表

汇编语言指令表文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

伪指令 1、定位伪指令 ORG m 2、定义字节伪指令 DB X1,X2,X3,…,Xn 3、字定义伪指令 DW Y1,Y2,Y3,…,Yn 4、汇编结束伪指令 END 寻址方式 MCS-51单片机有五种寻址方式: 1、寄存器寻址 2、寄存器间接寻址 3、直接寻址 4、立即数寻址 5、基寄存器加变址寄存器间接寻址 6、相对寻址 7、位寻址 数据传送指令 一、以累加器A为目的操作数的指令(4条) MOV A,Rn ;(Rn)→A n=0~7 MOV A,direct ;( direct )→A MOV A,@Ri ;((Ri))→A i=0~1 MOV A,#data ; data →A 二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)→ Rn MOV Rn ,direct;( direct )→ Rn MOV Rn ,#data; data → Rn 三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)→direct MOV direct,Rn;(Rn)→direct MOV direct,direct ;(源direct)→目的direct MOV direct,@Ri;((Ri))→direct MOV direct,#data; data→direct 四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)→(Ri) MOV @Ri,direct;(direct)→(Ri) MOV @Ri,#data; data→(Ri) 五、十六位数据传送指令(1条) MOV DPTR,#data16;dataH→DPH,dataL →DPL

常用8086汇编指令(彩色版)

8086/8088指令系统 一、数据传送指令 1.通用数据传送指令 MOV(Move)传送 PUSH(Push onto the stack)进栈 POP(Pop from the stack)出栈 XCHG(Exchange)交换 .MOV指令 格式为:MOV DST,SRC 执行的操作:(DST)<-(SRC) .PUSH进栈指令 格式为:PUSH SRC 执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) .POP出栈指令 格式为:POP DST 执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 .XCHG交换指令 格式为:XCHG OPR1,OPR2 执行的操作:(OPR1)<-->(OPR2) 2.累加器专用传送指令 IN(Input)输入 OUT(Output)输出 XLAT(Translate)换码 这组指令只限于使用累加器AX或AL传送信息. .IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节) (AX)<-(PORT+1,PORT)(字) 短格式为:IN AL,DX(字节) IN AX,DX(字) 执行的操作:AL<-((DX))(字节) AX<-((DX)+1,DX)(字) .OUT输出指令 长格式为:OUT PORT,AL(字节) OUT PORT,AX(字)

执行的操作:(PORT)<-(AL)(字节) (PORT+1,PORT)<-(AX)(字) 短格式为:OUT DX,AL(字节) OUT DX,AX(字) 执行的操作:((DX))<-(AL)(字节) ((DX)+1,(DX))<-AX(字) 在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息. .XLAT换码指令 格式为:XLAT OPR 或:XLAT 执行的操作:(AL)<-((BX)+(AL)) 3.有效地址送寄存器指令 LEA(Load effective address)有效地址送寄存器 LDS(Load DS with Pointer)指针送寄存器和DS LES(Load ES with Pointer)指针送寄存器和ES .LEA有效地址送寄存器 格式为:LEA REG,SRC 执行的操作:(REG)<-SRC 指令把源操作数的有效地址送到指定的寄存器中. .LDS指针送寄存器和DS指令 格式为:LDS REG,SRC 执行的操作:(REG)<-(SRC) (DS)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器. .LES指针送寄存器和ES指令 格式为:LES REG,SRC 执行的操作:(REG)<-(SRC) (ES)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器. 4.标志寄存器传送指令 LAHF(Load AH with flags)标志送AH SAHF(store AH into flags)AH送标志寄存器 PUSHF(push the flags)标志进栈 POPF(pop the flags)标志出栈 .LAHF标志送AH

8086 汇编语言中断程序设计

汇编语言程序设计实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

LEA DX,FNAME MOV CX,0 ;语句1 INT 21H JC EXIT MOV FNUM,AX MOV BX,AX ;语句2 MOV CX,100 MOV AH,40H LEA DX ,BUF INT 21H MOV BX,FNUM MOV AH,3EH INT 21H EXIT: MOV AH,4CH INT 21H CODE ENDS END START 使用相应的文本编辑器建立文件LAB7.asm,内容如上所示。 2.汇编并运行此程序后,在当前目录建立的文件名是什么?其内容是什么? 1>汇编: C:\masm> masm lab7; 2>连接: C:\masm> link lab7; 3>运行: C:\masm> lab7 3.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别? 4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同?并简要说明此语句的作用. 5.若将语句2 改为mov bx,1,则运行结果会有什么不同?简要说明则语句的作用. 实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。源程序下: assume cs:code code segment start: mov ax,cs mov ds,ax

mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例程cld rep movsb mov word ptr es:[0],200h mov word ptr es:[2],0 ;设置中断向量表 mov dx,0ffffh mov bx,1 ;测试一下 div bx mov ax,4c00h int 21h do:jmp short dostart db 'divide error!' dostart: mov ax,0 mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,160*12+60 mov cx,13 s: mov al,ds:[si] mov ah,15 mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h doend:nop code ends end start

8086汇编指令表

8086汇编指令表

MOV MOV DST,SRC DST≠CS、IP和imm 不影响 标志位 MOV [9AF0H],AL MOVS MOVS mem, mem MOVSB/W 不影响 标志位 字符串传送ES:DI←(DS:SI) SI←(SI)(+/-)1 DI←(DI)(+/-)1 MOVS ES:BYTE PTR[DI], DS:[SI] MUL MUL r/m8 设置CF OF S Z A P无法预 测 无符号乘法:AX←AL*r/m8 MUL CL MUL r/m16 无符号乘法:DX:AX←AX*r/m16 MUL CX NEG NEG reg/mem CF OF SF ZF AF PF 求补:取反加一 0-(DST) NEG CL NOP NOP 不影响空操作NOP NOT NOT reg/mem 不影响按位取反NOT CL OR 同AND PF SF ZF CF=OF=0 逻辑或 OR AL,0FH (不变\置1) OUT OUT imm8,AL/AX/EAX 不影响 标志位 将AL/AX/EAX输出到imm8指定端 口 OUT 0FFH,AL OUT DX,AL/AX/EAX 将AL/AX/EAX输出到DX指定的端口OUT DX,AL POP POP DST DST!=imm & CS 不影响 标志位 DST←((SP)+1,(SP)) SP←(SP)+2 POP WORD Ptr [87EAH] POPF POPF 设置所有标志位从堆栈中弹出16位标志寄存器POPF PUSH PUSH SRC 8086 SRC!=imm 不影响 标志位 SP<--(SP)-2 ((SP)+1,(SP))←(SRC) [SP循 环] PUSH WORD Ptr [87EAH] PUSHF PUSHF 不影响压栈16位标志寄存器PUSHF RCL 同SHL 同ROL 带进位循环左移 RCL AL,1 RCR 同SHL 同ROL 带进位循环右移 RCR AL,1 ROL 同SHL 移一位后符号位 改变则OF=1 循环左移: ROL AL,1 ROR 同SHL 同ROL 循环右移: ROR AL,1 REP REP String operation 不影响 标志位 CX=0则终止---CX←(CX)-1 ---串操作---SI/DI增量 REPZ REPE REPE String operation AF CF OF PF SF ZF CX=0||ZF=0则终止 ---CX←(CX)-1 ---串比较---SI/DI增量 REPNZ REPNE REPNE String operation AF CF OF PF SF ZF CX=0||ZF=1则终止--- CX←(CX)-1 ---串比较---SI/DI增量 RET RET 恢复压栈标志位 POP IP[CS] 子过程返回(Near)/(Far) RET RET imm16 子过程返回后SP←(SP)+imm16 RET 08

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

8086汇编语言上机调试步骤

8086汇编语言上机调试步骤 1、在网络课堂-微机原理与接口技术-实验指导-汇编工具下载,下载汇编工具并解压,文件夹名为“masm”。 2、用鼠标点击“masm”文件夹。进入该文件夹后将看到 MASM.EXE, LINK.EXE , DEBUG.EXE3个文件进行复制操作。 3、用鼠标点击“我的电脑”再点击D: 盘,并在 D: 盘上建立新的“ MASM”文件夹,最后将上面的3个文件全部复制到该文件夹中。(注意实验所有的文件都放在该文件夹内) 4、用文本编辑软件UltraEdit-32、WINDOWS 中的记事本或其它的文本编辑器输入汇编语言程序, 注意在最后一行的 END输入完后要按一次回车键,保存的源 文件的扩展各一定要是“.asm”如: example.asm 。(建议用记事本输入源程序,另存时,保持类型选择“所有文件”如图所示) 5、进入MS-DOS方式 ( 从开始>程序>附件>命令提示符) 或者(从程序 > 运行输入“cmd”回车,进入MS-DOS环境。

6、进入D:>MASM文件夹 7、显示MASM文件夹内所有文件“dir”命令 8、在 DOS 提示符下进行汇编、连接、动态调试等操作。 例如: 对源文件 example.asm 进行的操作

D:\MASM\MASM example.asm;汇编源程序操作 D:\MASM\LINK example.dbj;连接并生成扩展名为 .EXE 的可执行文件 D:\MASM\DEBUG example.exe;对可执行文件进行调试 9、要求掌握的调试命令(在 DEBUG 中使用的命令) a: U - 反汇编命令 用法: -U 代码段地址:起始偏移地址如:-U CS:100 b: D - 显示内存中的数据命令 用法: -D 数据段地址:存放数据的偏移地址如:-D DS:00 20 c: T - 单步执行程序命令 用法: -T 要执行的指令条数如:-T 3 d: G - 连续执行程序命令 用法: -G=代码段地址:指令的起始偏移地址指令的结束偏移地址如: -G=CS:100 106 注意: 结束地址一定要是操作码的所在地址 e: R - 查看和修改寄存器数据命令 用法: -R 回车如:-R AX f: F - 对内存单元填充数据命令 用法: -F 数据段地址:偏移首地址偏移未地址填入的数据 如: -F DS:100 120 ff g: Q - 退出”DEBUG“应用程序命令 10、应用例子 ;二进制到BCD转换(a.asm) ;将给定的一个二进制数,转换成二十进制(BCD)码 DATA SEGMENT RESULT DB 3 DUP(?) DATA ENDS CODE SEGMENT

8086汇编语言程序设计实验指导书.

汇编语言上机实验指导书 一、概述 上机实验总学时为16学时,其中综合性实验为2学时。实验共有6项暂定为8次,每次2学时。 1.实验辅导的主要内容 实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。开始的实验介绍较细,后面的实验简要介绍。 2.实验的软硬件要求 关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG程序和EDIT.EXE编辑软件(其它编辑软件也可以)。 3.加强实践能力的培养 实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。其中包括: 实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等; 开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。 对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或自己编制程序加以实现。 实验一汇编语言运行环境及方法、简单程序设计(2学时、验证性) 1.实验目的: (1) 熟悉汇编语言运行环境和方法 (2)了解如何使用汇编语言编制程序 (3) 熟悉DEBUG有关命令的使用方法 (4) 利用DEBUG掌握有关指令的功能 (5) 利用DEBUG运行简单的程序段 2.实验内容 (1)学会输入、编辑汇编语言程序 (2)学会对汇编语言程序进行汇编、连接和运行 (3)进入和退出DEBUG程序 (4)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。 3.实验准备 (1)仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。 (2)准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。 (3) 编写一个程序:比较2个字符串所含的字符是否相同。若相同则显示’Match.’,否则显示’No match!’;(1)仔细阅读有关DEBUG 命令的内容,对有关命令,都要事先准备好使用的例子。 4.实验步骤 (1)在DOS提示符下,进入MASM目录。 (2)在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。 ①调用edit输入、编辑源程序并保存在指定的目录中;例:edit abc.asm ②用汇编程序masm对源程序汇编产生目标文件obj。例:masm abc 不断修改错误,直至汇编通过为止。 ③用连接程序link产生执行文件exe.例:link abc ④执行程序 可直接从DOS执行程序,即在DOS环境中,输入文件名即可。 (3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。 5.实验报告要求 (1)源程序清单。 (2) 如何启动和退出EDIT程序。 (3) 如何对源程序进行汇编及编辑。

汇编指令大全

ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令 L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少) INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用 S001C: RRC A ;累加器A的内容带进位位右移(设A=11H,C=0 ;单步执行后查A和C内容为多少) DEC A ;A的内容减1 DEC 01H ;直接地址(01H)内容减1 DEC @R0 ;R0间址减1,即R0的内容为地址,该地址的内容减1 DEC @R1 ; R1间址减1 DEC R0 ; R0内容减1 DEC R1 ; R1内容减1 DEC R2 ; R2内容减1 DEC R3 ; R3内容减1 DEC R4 ; R4内容减1 DEC R5 ; R5内容减1 DEC R6 ; R6内容减1 DEC R7 ; R7内容减1 JB 20H,L002D;如果位(20H,即24H的0位)为1则转移 L002D: AJMP L0017 ;绝对转移 RET ;子程序返回指令 RL A ;A左移 ADD A,#01H ;A的内容与立即数(01H)相加 ADD A,01H ; A的内容与直接地址(01H内容)相加 ADD A,@R0 ; A的内容与寄存器R0的间址内容相加 ADD A,@R1 ; A的内容与寄存器R1的间址内容相加

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。 XCHG交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。 LEA 16位寄存器存储器操作数传送有效地址指令:必须是一个16位寄存器和存储器操作数。 LDS 16位寄存器存储器操作数传送存储器操作数32位地址,它的16位偏移地址送16位寄存器,16位段基值送入DS中。 LES :同上,只是16位段基址送ES中。 堆栈操作指令 PUSH 操作数,操作数不能使用立即数, POP 操作数,操作数不能是CS和立即数 标志操作指令 LAHF:把标志寄存器低8位,符号SF,零ZF,辅助进位AF,奇偶PF,进位CF传送到AH 指定的位。不影响标志位。 SAHF:与上相反,把AH中的标志位传送回标志寄存器。 PUSHF:把标志寄存器内容压入栈顶。 POPF:把栈顶的一个字节传送到标志寄存器中。 CLC:进位位清零。 STC:进位位为1。 CMC:进位位取反。 CLD:使方向标志DF为零,在执行串操作中,使地址按递增方式变化。 STD:DF为1。 CLI:清中断允许标志IF。Cpu不相应来自外部装置的可屏蔽中断。 STI:IF为1。 加减运算指令

注意:对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。 ADD。 ADC:把进位CF中的数值加上去。 INC:加1指令 SUB。 SBB:把进位CF中数值减去。 DEC:减1指令。 NEG 操作数:取补指令,即用0减去操作数再送回操作数。 CMP:比较指令,完成操作数1减去操作数2,结果不送操作数1,但影响标志位。可根据ZF(零)是否被置1判断相等;如果两者是无符号数,可根据CF判断大小;如果两者是有符号数,要根据SF和OF判断大小。 乘除运算指令 MUL 操作数:无符号数乘法指令。操作数不能是立即数。操作数是字节与AL中的无符号数相乘,16位结果送AX中。若字节,则与AX乘,结果高16送DX,低16送AX。如乘积高半部分不为零,则CF、OF为1,否则为0。所以CF和OF表示AH或DX中含有结果的有效数。IMUL 操作数:有符号数乘法指令。基本与MUL相同。 DIV 操作数:被除数是在AX(除数8位)或者DX和AX(除数16位),操作数不能是立即数。如果除数是0,或者在8(16)位除数时商超过8(16)位,则认为是溢出,引起0号中断。IDIV:有符号除法指令,当除数为0,活着商太大,太小(字节超过127,-127字超过32767,-32767)时,引起0号中断。 符号扩展指令 CBW,CWD:把AL中的符号扩展到寄存器AH中,不影响各标志位。CWD则把AX中的符号扩展到DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用XOR 清高8位或高16位。 逻辑运算指令与位移指令 注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。 NOT:取反,不影响标志位。 AND 操作数1 操作数2:操作结果送错作数1,标志CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志) SF(符号)反映运算结果,AF(辅助进位)未定义。自己与自己AND值不变,她主要用于将操作数中与1相与的位保持不变,与0相与清0。(都为1时为1)OR 操作数1 操作数2:自己与自己OR值不变,CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志)SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置1:

相关文档
最新文档