zoukankan      html  css  js  c++  java
  • 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)转移指令有直接设置和位移偏移两种。当中位移偏移有距离限制。





  • 相关阅读:
    Netflix Ribbon(负载均衡)介绍
    Annotation 注解
    框架设计的灵魂-反射
    idea maven java.lang.outofmemoryerror gc overhead limit exceeded
    洛谷P4427 [BJOI2018]求和
    洛谷P1196 [NOI2002]银河英雄传说
    CF191C Fools and Roads
    洛谷P2296 寻找道路
    洛谷P3389 【模板】高斯消元法
    洛谷P1351 联合权值
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6970513.html
Copyright © 2011-2022 走看看