8086汇编指令总结

经过学习,对8086汇编常用指令进行了以下总结:

(1).mov : 移动数据

例如:

	mov ax, 8h              ;mov 寄存器,常量
	mov ax, bx 				;mov 寄存器,寄存器
	mov ax, ds:[0] 			;mov 寄存器,内存单元
	mov ds:[0], ax 			;mov 内存单元,寄存器
	mov ds, ax 				;mov 段寄存器,寄存器
	mov word ptr ds:[0], 8h ;mov (内存单元大小声明) 内存单元, 常量
sk:	mov ax, offset sk       ;mov 寄存器,标号偏移地址
	mov byte ptr ds:[0], offset sk  ;mov 内存单元,标号偏移地址

易错点:

	mov ds:[0], ds:[1] 		;mov 内存单元,内存单元(非法指令)
	mov ds, 8h				;mov 段寄存器,常量(非法指令)
	mov ds, es				;mov 段寄存器,段寄存器(非法指令)
	mov ds, offset sk		;mov 段寄存器,标号偏移地址(非法指令)
	mov [0], ax 			;常量偏移地址不可省略默认ds,必须作段地址声明(非法指令)

(2).add:增加数据值,用法同mov类似

(3).sub:减少数据值,用法同mov类似

(4).push:入栈,栈顶指针(sp)=(sp)+2,,并将一个字数据存入sp所指内存单元

例如:

	push ax                 ;push 寄存器
	push ds:[0] 			;push 内存单元

易错点:

	push al                 ;push 寄存器(高/低)字节(非法指令),必须是一个字,16位数据
	push 8h					;push 常量(非法指令)

(5).pop:出栈,读取一个字sp所指的内存单元,并使栈顶指针(sp)=(sp)-2

例如:

	pop ax 					;pop 寄存器
	pop ds:[0]              ;pop 内存单元

易错点:

	pop al                  ;pop 寄存器(高/低)字节(非法指令),必须是一个字,16位数据
	pop 8h					;pop 常量(非法指令)

(6).inc:数据值+1, dec:数据值-1

例如:

	inc ax 					;inc 寄存器
	inc byte ptr ds:[0]		;inc (大小声明)内存单元
	dec ax 					;dec 寄存器
	dec byte ptr ds:[0] 	;dec (大小声明)内存单元

易错点:

	inc 8h 					;inc 常量(非法指令)
	dec 8h 					;dec 常量(非法指令)

(7).jmp:无条件转移指令

例如:

s:	jmp short s                 ;段内短转移,jmp short 标号,IP修改范围-128~127
	jmp near ptr s              ;段内近转移,jmp near ptr 标号, IP修改范围-32768~32767
	;以上两条指令的实质为保存IP到标号的偏移距离,注意正确使用
	jmp far ptr s               ;段间转移(远转移),jmp far ptr s, 修改CS:IP为标号的段地址:偏移地址
	jmp ax 						;段内转移,jmp 16位reg, (IP)=(16位reg)
	jmp word ptr ds:[0]         ;段内转移,jmp word ptr 内存单元地址,
	;(IP)=(内存单元地址处双字节内存)
	jmp dword ptr ds:[0]        ;段间转移,jmp dword ptr 内存单元地址,
	;(IP)=(内存单元地址处低16位内存数据),(CS)=(内存单元地址处高16位内存数据)

易错点:

	jmp 1000:0					;想转移到(cs:ip)=(1000:0)处(非法指令)
	jmp offset s                ;想转移到标号s处(非法指令)

(8).jcxz:有条件转移指令,等价于

if((cx)==0) jmp short 标号;

(9).loop:循环指令,等价于

	(cx)--;
	if((cx)!=0)jmp short 标号;

(10).and:二进制与运算,同mov,add,sub用法相似

(11).or:二进制或运算, 同mov,add,sub用法相似

例如:

	and ds:[0], 1111h			;and 内存单元
	and ax, 1111h				;and 16位寄存器 常量
	and al, 11111110b			;and 8位寄存器 常量(第0位设为0)
	and ax, bx 					;and 16位寄存器,16位寄存器
	;等等...

	or ds:[0], 1111h			;or 内存单元
	or ax, 1111h 				;or 16位寄存器 常量
	or al, 00000001b			;or 8位寄存器 常量(第0位设为0)
	or ax, bx 					;or 16位寄存器,16位寄存器
	;等等...

(12).mul:乘法指令

	;(1)两个相乘的数:两个相乘的数,要么都是8位,要么都是16位。如果是8位,
	;一个默认放在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认在
	;AX中,另一个放在16位reg或内存单元中。
	;(2)结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在
	;DX中存放,低位在AX中放。

	;计算100*10
	mov al, 100
	mov bl, 10
	mul bl
	;结果:(ax)=1000(03E8h)

	;计算100*10000
	mov ax, 100
	mov bx, 10000
	mul bx
	;结果:(ax)=4240H, (dx)=000FH     (F4240H=1000000)

(13).div:除法指令

	;除数:有8位和16位两种,在一个reg或内存单元中
	;被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,
	;默认在AX中存放;如果除数为16位,被除数位32位,在DX和AX中存放,DX存
	;放高16位,AX存放低16位
	;结果:如果除数为8位,则AL存储除非操作的商,AH存储除非操作的余数;
	;如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数

	;计算100001/100
	mov dx, 1
	mov ax, 86A1H       ;(dx)*10000H+(ax)=100001
	mov bx, 100
	div bx
	;结果:(ax)=03E8H(即1000),(dx)=1(余数为1)

	;计算1001/100
	mov ax, 1001
	mov bl, 100
	div bx
	;结果:(al)=0AH(即10),(ah)=1(余数为1)

(14)call 标号:等价于

	push IP
	jmp near ptr 标号

(15)ret : 等价于

	pop IP

因此常如此配合使用:

	call program1

program1:
	;........
	ret

(16)call far ptr 标号:等价于

	push CS
	push IP
	jmp far ptr 标号 

(17).retf:等价于

	pop IP
	pop CS

因此常如此配合使用:

	call far ptr program2

program2:
	;........
	retf

(18)call word ptr 内存地址:等价于

	push IP
	jmp word ptr 内存地址

	;例如:
	mov sp, 10h
	mov ax, 0123h
	mov ds:[0], ax
	call word ptr ds:[0]
	;结果:(IP)=0123H, (SP)=0EH

(19)call dword ptr 内存地址:等价于

	push CS
	push IP
	jmp dword ptr 内存单元地址 

	;例如:
	mov sp, 10h
	mov ax, 0123h
	mov ds:[0], ax
	mov word ptr ds:[2], 0
	call dword ptr ds:[0]
	;结果:(CS)=0,(IP)=0123H,(sp)=0CH

(20)shl:逻辑左移指令

	;(1)将一个寄存器或内存单元中的数据向左移位;
	;(2)将最后移出的一位写入CF中
	;(3)最低位用0补充

	;例如:
	mov al, 01001000b
	shl al, 1
	;结果:(al)=10010000b, CF=0 

	;若移动位数大于1,则必须将移动位数放在cl中
	mov al, 01010001b
	mov cl, 3
	shl al, cl
	;结果:(al)=10001000b, 因为最后移除的一位是0,所以CF=0

(21)shr:逻辑右移指令

	;(1)将一个寄存器或内存单元中的数据向右移位;
	;(2)将最后移出的一位写入CF中
	;(3)最高位用0补充

	;例如:
	mov al, 10000001b
	shr al, 1
	;结果:(al)=01000000b, CF=0 

	;若移动位数大于1,则必须将移动位数放在cl中
	mov al, 01010001b
	mov cl, 3
	shr al, cl
	;结果:(al)=00001010b, 因为最后移除的一位是0,所以CF=0

(22)int 常量:中断例程

总结:

由上述可以看出8086汇编有以下语法规律:

(1)指令格式有3种形式:

指令   目标   源

指令   目标

指令

(2)除int指令外,“目标”不能为常量

(3)当“目标”为段寄存器时,“ 源”只能为寄存器

(4)"目标“和"源"所占的内存字节大小应保证相同,

当双方显式知晓内存字节大小时,若不相同,则无法通过编译,

当仅有一方知晓内存字节大小时,数据处理则按该方内存字节大小计算,

当双方都不知晓内存字节大小时,应用byte/word/dword ptr显示声明,其中dword ptr仅用于一些特殊指令。

(5)转移指令有直接设置和位移偏移两种,其中位移偏移有距离限制。

时间: 2024-10-10 08:37:39

8086汇编指令总结的相关文章

8086汇编指令速查手册

一.常用指令 二.算术运算指令 三.逻辑运算指令四.串指令 五.程序跳转指令------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1.数据寄存器数据寄存器主要用来保存操作数和运算结

复习8086汇编指令

CLI :clear InterupetSTI :set InterupetCLD:clear DirectorSTD:set Director:::::::::::::::::::CLI和STI是屏蔽中断和设置中断用的.CLD与STD是用来操作方向标志位DF(Direction Flag).CLD使DF复位,即DF=0,STD使DF置位,即DF=1.用于串操作指令中.CLD是使得传送方向从低地址到高地址,而STD就刚好相反了. 原文地址:https://blog.51cto.com/13652

汇编实验二 用机器指令和汇编指令编程

实验二  用机器指令和汇编指令编程 任务一: (1)用E命令将内存单元0021:0~0021:7连续8个字节数据修改为30H,31H,32H,33H,34H,35H,36H,37H. (2)用A命令输入汇编指令: (3)用T命令单步执行: 在用T命令执行MOV SS,AX时,它的下一条指令MOV  SP,0100同时执行. (4)填写书上内容: 任务二: 观察如图实验过程,分析为什么2000:0~2000:f中的内容会发生改变. 任意时刻,SS:SP指向栈顶元素,初始时栈为空.初始时,栈顶为0B

汇编指令介绍

8086汇编指令主要有以下几种: 1.数据传输指令 2.算术运算指令 3.逻辑运算指令 4.串指令 5.程序转移指令 6.伪指令 ----------------------------------------------------------------------------------------------------------------------- 具体介绍各种指令的含义: 一.数据传输指令:它们在存储器和寄存器.寄存器和输入输出端口之间传送数据 a.通用数据传送指令 MOV 

一些汇编指令

AX Accumulator   用累加器进行的操作 输入输出 乘除 操作BX 基址寄存器 (Base Register) CX 计数寄存器 (Count Register)常用于 循环 计数器  在 位操作中 要用 CL来指明 位移的位数DX  数据寄存器(Data Register)  在 进行 双字节 运算时  也可以 存放 io 的端口地址MOV 数据传送指令 ADD 算数指令编程环境 Masm  调试 工具 DebugDebug  cpu 各种 寄存器 的 内容 内存的情况 在机器码中

8086汇编学习小结———实时更新

初学IBM-PC 8086,对INT指令不是很理解.现从网上总计如下: 表:DOS系统功能调INT 21H AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异步通迅输入 AL=输入数据 04 异步通迅输出 DL=输出数据 05 打印机输出 DL=输出字符 06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符 07 键盘输入(无回显) AL=输入字符 08 键盘

学习linux内核时常碰到的汇编指令(1)

 转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符.宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了. $∶地址计数器的值——记录正在被汇编程序翻译的语句地址.每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值. ?∶操作数.在数据定义语句中,操作

16位汇编第六讲汇编指令详解第二讲

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器

汇编指令: LGDT、LIDT、LLDT、LMSW[]

汇编指令: LGDT.LIDT.LLDT.LMSW 名称 功能 操作数 操作码 模数 寄存器1 寄存器2或内存 位移量 立即数 符号 方向 芯片型号 16位 32位 LGDT 加载全局描述符 [寄16] $0F01 00 010 5 无 无 无 无 286 无 $67 LGDT 加载全局描述符 [寄32] $0F01 00 010 5 无 无 无 无 286 $67 无 LGDT 加载全局描述符 [寄16+位移8] $0F01 01 010 5 9 无 无 无 286 无 $67 LGDT 加载