文档库 最新最全的文档下载
当前位置:文档库 › 8086汇编指令大全

8086汇编指令大全

8086汇编指令大全
8086汇编指令大全

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

注意:

只允许寄存器与存储单元之间的交换

不影响标志位

4) 换码指令XLAT

5) 地址传送指令LEA(load effective address):偏移地址()

6) 数据段指针送寄存器LDS :低地址的字送指定的通用寄存器(SI)、高地址的字送DS

7) 附加段指针送寄存器指令LES :与LDS相似,低地址的字送通用寄存器(DI)、高地址送ES

上三指令不影响标志位

8) 标志寄存器传送指令

LAHF :标志寄存器低八位送AH

SAHF :AH送标志寄存器低八位

PUSHF:标志寄存器压入堆栈

POPF :栈顶内容送标志寄存器

9) 加法指令ADD

目的操作数只能是寄存器或存储单元

对CF,OF,SF,PF,ZF,AF有影响

10) 加1指令INC

对OF,SF,PF,ZF,AF有影响

11) 带位加法指令ADC

在进行单精度运算时用ADD指令,在高精度低位运算时用ADD、高位用ADC

OPD=OPD+OPS+CF

12) 减法指令SUB

对CF,OF,SF,PF,ZF,AF有影响

13) 带借位减法指令SBB

OPD=OPD—OPS—CF对CF,OF,SF,PF,ZF,AF有影响对CF,OF,SF,PF,ZF,AF有影响

14) 减1指令DEC

15) 比较指令CMP

16) 求补指令NEG

17) 无符号乘法指令MUL

字节操作:AX=AL*OPS

字操作:DX,AX=AX*OPS

18) 有符号乘法指令IMUL

19) 无符号除法指令DIV

字节的操作:AL=AX/(OPS)的商

AH=AX/(OPS)的余数

字的操作:

20) 有符号除法IDIV

21) 字节转换为字指令CBW

把AL中的符号位扩展到AH中,如果AL的最高位为0,则AH=00H,如果最高位为1,则AH=FFH

22) 字转换为双字指令CWD

23) 压缩的BCD码调整指令

DAA 加法的十进制调整指令

DAS 减法的十进制调整指令

24) 非压缩的BCD码调整指令

AAA 加法的ASCII调整指令

AAS 减法的ASCII调整指令

AAM 乘法的ASCII调整指令

AAD 除法的ASCII调整指令

25) 逻辑与运算指令

ADD

OR

NOT

TEST(OPD和OPS的内容不变)

26) 移位指令

逻辑左移与算术左移SHL、SAL(低位补0)

算术右移SAR(高位不变、CF为最后移入的值)

逻辑右移SHR(高位补0、CF为最后移入的值)

27) 循环移位

左移ROL (CF为最后移入的值)

右移ROR (CF为最后移入的值)

带进位循环左移RCL(CF+OPD 一起左循环)

带进位循环右移RCR(OPD+CF 一起右循环)

28) 无条件转移指令下JMP

JMP SHORT OPD(IP=IP+8位位移量)

JMP NEAR PTR OPD(IP=IP+16位位移量)

上二条指令目的地址是IP=OPD+IP

JMP WORD PTR OPD(IP=EA)

JMP FAR PTR OPD(IP=OPD的段内偏移地址

CS=OPD段地址)

JMP DWORD PTR OPD(IP=EA CS=EA+2)

29) 条件转移指令

JZ(JE)结果为0则转移(ZF=1)

JNZ(JNE)结果不为0则转移(ZF=0)

JS 结果为负则转移(SF=1)

JNS 结果为正则转移(SF=0)

JO 溢出则转移(OF=1)

JNO 不溢出则转移(OF=0)

JP(JPE)奇偶位为1则转移(PF=1)

JNP(JPO)奇偶位不为1则转移(PF=0)

JC(JNAE,JB)低于且不等于或进位位为1则转移(CF=1)

JNC(JNE,JNB)高于或等于或进位位为0则转移(CF=0)30)

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.调试过程中遇到的问题和解决的方法。

x86汇编指令集

x86汇编指令集 数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. MOVSX reg16,r/m8 ; o16 0F BE /r [386] MOVSX reg32,r/m8 ; o32 0F BE /r [386] MOVSX reg32,r/m16 ; o32 0F BF /r [386] MOVZX reg16,r/m8 ; o16 0F B6 /r [386] MOVZX reg32,r/m8 ; o32 0F B6 /r [386] MOVZX reg32,r/m16 ; o32 0F B7 /r [386] 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.

8086指令系统精析解析

8086指令系统精析 3.1基本数据类型 1.IA-32结构的基本数据类型是字节(8位)、字(16位)、双字(32位)、四字 (64位,486中引入的)和双四字(128位,Pentium3中引入的)。 2.低字节占用内存中的最低地址,该地址也是此操作数的地址。图:P44 图3-1 3.字、双字、四字的自然边界是偶数编号的地址,字的自然边界是偶数编号的 地址,双字和四字的自然边界地址要分别能被4和8除尽。 4.数据结构要尽可能在自然边界上对齐 5.对于不对齐的存储访问,处理器要求做两次存储访问操作;而对于对齐的访 问,只要进行一次存储访问操作。 6.数字数据类型(学生自学)PPT 3.28086的指令格式 一、指令格式 Label(标号):mnemonic(助记符)argument1(参数1),argument2(参数2),argument3(参数3)其中: 1.标号是一个标识符,后面跟有冒号 2.助记符是一类具有相同功能的指令操作码的保留名 3.操作数的三个参数是任选的,可以有零到三个操作数,操作数参数的数量取 决于操作码 4.操作数参数可能是文字或数据项的标识符,也可能是寄存器的保留名或在程 序的另一部分声明的赋予数据项的标识符。 5.在算术和逻辑指令中存在两个操作数时,右边的操作数是源,左边的操作数 是目的。例如:LOADREG: MOV AX, SUBTOTAL 功能是把由SUBTOTAL表示的源操作数传送至AX寄存器。 3.38086/8088指令的操作数寻址方式

寻找操作数,操作数能定位在指令中、寄存器中、存储单元中以及I/O端口中。 1.立即数 用包含在指令中的操作数作为源操作数,这些操作数即为立即操作数。 立即数可以是8位或16 例1 MOV AX , 2056H 结果( AH ) = 20H ( AL ) = 56H 例2 MOV AL , 78 H 结果( AL ) = 78H 2.寄存器操作数 操作数在寄存器中,指令中指定寄存器名 8 位操作数,用8 位寄存器: AH、AL、BH、BL、CH、CL、DH、DL 16 位操作数,用16 位寄存器: AX、BX、CX、DX、SP、BP、SI、DI CS、DS、SS、ES 例1 MOV AX , 2056H 执行后:(AX)=2056H 例2 MOV BL , AH 执行前:(BL) = 12H, (AH) = 78H 执行后:(BL) = 78H (AH) = 78H ▲立即数寻址、寄存器寻址的操作数,不用在取完指令后再到内存中取数。 ▲以下的 5 中寻址方式,操作数存放在内存中,取完指令后,还需到内存取数。指令中给出的是该操作数的地址,包括段地址和偏移地址。 3. 内存操作数 ▲指令MOV DS: [ DI ] , CL 完成将CL寄存器中的内容传送到以DS为段值,DI为偏移值的内存单元中。例编程将CL寄存器的内容传送到21000H单元中。PPT 地址21000H=2000:1000H ,编程时,DS 存放段地址2000H,DI 存放偏移地址1000H MOV AX, 2000H MOV DS, AX ; (DS) = 2000H

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

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 注意:

8086汇编语言指令的寻址方式有哪几类

1. 8086汇编语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快? 寄存器寻址最快 7. 下面这些指令哪些是正确的?哪些是错误的?如是错误的,请说明原因。 XCHG CS , AX ;不能修改CS MOV [BX] , [1000] ;不能在两个内存单元之间直接进行数据传送 XCHG BX , IP ;不能用名字直接访问IP PUSH CS POP CS ;不允许直接修改CS值 IN BX , DX ;输入数据必须使用累加器AL或AX MOV BYTE [BX] , 1000 ;格式错误,且超范围,应为MOV word PTR [BX],1000 MOV CS , [1000];不允许直接修改CS值 20.带参数的返回指令用在什么场合?设栈顶地址为3000H,当执行RET 0006后,SP的值为多少? 利用堆栈传递参数时使用;对于近调用SP=3008H,对于远调用SP=300AH 27.设当前SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶地址为多少?当执行 PUSH BX指令后,栈顶地址和栈顶2个字节的内容分别是什么? 栈顶地址:SS:SP,物理地址为:2FF00H;PUSH 完以后栈顶地址为:SS:SP=2010:FDFEH,即物理地址为:2FEFEH,内容为:57H 34H(由低地址到高地址) B P7 5. 设(DS)=3000H,(BX)=1100H,(CS)=0062H,(S1)=0002H,(31100H)=52H, (31101H)=8FH,(31162H)=6BH,(31163H)=99H,(31103H)=F6H, (32200H)=AAH,(32201H)=B6H,(32800H)=55H,(32801H)=77H,给出下列各指令执行后AX寄存器的内容: (1) MOV AX,BX (2) MOV AX,[BX] (3) MOV AX,4200H (4) MOV AX,[2800H] (5) MOV AX,1100H[BX] (6) MOV AX,[1160H+SI] 9. 分别执行下列各指令组,写出AX的内容: (1) MOV AX,93A4H NEG AX 73A4-8c5c,e689-1977 (AX)=6C5CH (2) XY DW "AB" MOV AX,XY (AX)=4142H (3) MOV AX,2B7EH MOV CX,4DB5H ADD AX,CX (AX)=7933H (4) XA DW 0BD57H MOV AX,0FBCDH AND AX,XA (AX)=B945H (5) STC MOV BX, 0B69FH MOV AX, 43A2H SBB AX, BX

常用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

8086汇编语言习题解答

8086/8088汇编语言习题解答 第一章 、试根据自己使用计算机的经历,列举几个必须使用或最好是使用汇编语言编制程序的事例。 、试完成下列数制间的转换 ⑴、十进制数转换为8位二进制数 十进制:100 对应二进制:01100100B 十进制:56 对应二进制:00111000B 十进制:111 对应二进制:01101111B 十进制: 120 对应二进制:01111000B 十进制: 70 对应二进制:01000110B ⑵、8位二进制数(无符号数)转换为十进制数 二进制:01010101B 对应十进制:85 二进制:B 对应十进制:170 二进制:B 对应十进制:240 二进制:00001111B 对应十进制:15 ⑶、十进制数转换为十六进制数 十进制:40 对应二进制:00101000B 十进制:80 对应二进制:01010000B 十进制:105 对应二进制:01101001B 十进制: 114 对应二进制:01101101B 十进制: 207 对应二进制:B

、试把下面用补码表示的二进制数转换为对应的十进制真值 二进制补码:01111000 对应的十进制值数真值:+120 二进制补码:对应的十进制值数真值:-39 二进制补码:对应的十进制值数真值:-127 二进制补码:对应的十进制值数真值:-120 二进制补码:00100111 对应的十进制值数真值:+39 二进制补码:对应的十进制值数真值:-16 、由键盘输入字符通常都是以该字符的ASCII码形式表示的。若现在从键盘上输入十六进制数0~F,那么应如何处理才能把十六进制转换为4位二进制数0000~1111. 答:将键盘输入的数0~F的ASCII码,每输入一个字符,减去30H后,再存入内存,这样就完成了把从键盘上输入的十六进制ASCII码转换为4位二进制数0000~1111. 、试分别判断下列各组数据中哪个数据最大哪个最小 ①、A= B=0,101D C=0,101H ②、A=1011B B=1011D C=1011H 答:第①组:A=1×21-+1×23-= B= C=1×161-+163-=+= 所以A最大,C最小 第②组,B最大,A=B最小 、现有一个二进制数.若将该数看着是无符号数、原码表示的带符号数、补

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) 如何对源程序进行汇编及编辑。

微机原理与接口技术汇编语言指令详解吐血版

第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过 程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及 有效地址的计算。 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码 操作数 …… 操作数 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。 例如:MOV AX ,3000H

立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄

汇编语言程序的设计实验篇(emu8086)

1.汇编语言程序设计实验篇 1.1.汇编系统软件简介 Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug的模拟器。它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和存单元的容。 1.1.1创建程序 https://www.wendangku.net/doc/e214998169.html, TEMPLATE程序 本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。 在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。

在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。 输入全部指令后,单击按钮,保存相应的程序段。 2.EXE TEMPLATE程序 本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。 在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。

汇编语言指令分类详解

3.1 8086/8088寻址方式 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在 操作码的后面,与操作码一起放在代码段区域中。 如图所示。 例如:MOV AX,3000H 立即数可以是8位的,也可以是16位的。若 是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如:MOV AX,DS:[2000H];

图2-2 (对DS来讲可以省略成MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以 分成两种情况: (1)以SI、DI、BX间接寻址,则 通常操作数在现行数据段区域 中,即数据段寄存器(DS)*16 加上SI、DI、BX中的16位偏移 量,为操作数的地址, 例如:MOV AX,[SI] 操作数地址是:(DS)*16+(SI) (2)以寄存器BP间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS)*16与BP的内容相加作为操作数的地址, 例如:MOV AX,[BP] 操作数地址是:(SS)*16+(BP)若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。 例如:MOV AX,DS:[BP] 操作数地址是:(DS)*16+(BP)5.变址寻址 由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个

8086 汇编指令集

8086 汇编指令集 一、数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令 MOV 传送字或字节. 格式为: MOV DST,SRC 执行的操作:(DST)<-(SRC) MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. 格式为:PUSH SRC 执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) POP 把字弹出堆栈. 格式为:POP DST 执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 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 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) 格式为:XCHG OPR1,OPR2 执行的操作:(OPR1)<-->(OPR2) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里) 2. 输入输出端口传送指令. IN I/O 端口输入. ( 语法: IN 累加器,{端口号│DX} ) 长格式为: 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 I/O 端口输出. ( 语法: OUT {端口号│DX},累加器),输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX 指定时,其范围是0-65535. 长格式为: OUT PORT,AL(字节) OUT PORT,AX(字) 执行的操作: (PORT)<-(AL)(字节)

相关文档