X86汇编5.高级指令详解

最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。

转移指令
1.转移指令分类:
(1)无条件转移指令,如: jmp
(2)条件转移指令
(3)循环指令,如: loop
(4)过程
(5)中断

操作符
1.offset
释义:由编译器处理的符号,功能是取得标号的偏移地址
start: mov ax,offset start ;相当于mov ax, 0
s: mov ax, offset s ;相当于mov ax, 3

高级指令
1.jmp指令
释义: 无条件转移指令,可以只修改IP,也可以同时修改CS和IP。
jmp指令要给出两种信息:
(1)转移的目的地址
(2)转移的距离(段时间转移、段内短转移,段内近转移)
1)依据位移进行转移的jmp指令:
jmp short 标号(转到标号处执行指令)
这种指令格式的jmp指令实现的是段内转移,它对IP的修改范围是:-128 ~ 127,也就是说,它向前转移时最多128字节,向后最多127.
jmp near ptr 标号,功能为:(IP)= (IP)+ 16
2)转移的目的地址在指令中的jmp指令
jmp far ptr 标号,实现段间转移,又称远转移
(CS) = 标号所在段的段地址,(IP) = 标号在段中的偏移地址
far ptr指明了指令用标号的段地址和偏移地址修改CS和IP
3)转移地址在寄存器中的jmp指令
指令格式:jmp 16位 reg
4)转移地址在内存中的jmp指令
jmp word ptr 内存单元地址(段内转移) ;功能:从内存单元地址处开始存放一个字,是转移的目的偏移地址
内存单元地址可用寻址方式的任一格式给出
jmp dword ptr 内存单元地址(段间转移) ;功能:从内存单元地址处开始存放两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。

2.jcxz指令
jcxz指令是有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对于IP的修改范围都是:-128 ~ 127
指令格式:jcxz 标号

3.loop指令
loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都是:-128 ~ 127。
指令格式:loop 标号

3.call指令
执行call指令时,进行两步操作
(1)将当前IP或CS和IP压入栈,(sp) = (sp)-2 , ((ss)*16 + (sp)) = IP
(2)转移, (IP) = (IP)+ 16
指令格式:call 标号
call指令不能实现短转移,除此之外,call和jmp原理相同。
call far ptr 标号 ;实现段间转移
call 16位reg ;转移地址在寄存器中的call指令
call word ptr 内存单元地址 ;转移地址在内存单元中的call指令
call dword ptr 内存单元地址 ;转移地址在内存单元中的call指令

4.ret指令
ret指令用栈中的数据,修改IP的内容,从而实现近转移
指令格式:ret

5.retf指令
retf指令用栈中的数据,修改CS和IP的内容,从而实现元转移
指令格式:retf

6.movsb指令
将ds:si指向的内存单元中的字节送入es:di,然后根据df值递增或递减
执行movsb指令相当于:
(1)((es)16 + (di)) = ((ds)16 + (si))
(2)如果df=0则:(si) = (si)+1, (di)=(di)+1
如果df=1则:(si) = (si)-1, (di)=(di)-1
指令格式:movsb
相关指令:movsw、cld(df置0)、std(df置1)

7.pushf
将标志寄存器的值压栈

8.popf
从栈中弹出数据,放入标志寄存器

9.int指令
银发中断过程
指令格式:int n
执行过程:
(1)取中断号n
(2)标志寄存器入栈,IF=0,TF=0
(3)CS、IP入栈
(4)(IP) = (n4) , (CS)=(n4 +2)

10.iret指令
中断返回
指令格式:iret
int指令和iret指令的配合使用,与call和ret指令的配合使用类似。

11.in指令
读端口
in al,20h

12.out指令
写端口
out 20h,al

13.shl和shr指令
shl是左移指令,shr是右移指令
shl al,1 ;将al中的数据左移一位
shr al,1 ;将al中的数据右移一位

原文地址:https://blog.51cto.com/14207158/2473567

时间: 2024-08-08 22:27:13

X86汇编5.高级指令详解的相关文章

16位汇编第五讲各种指令详解第一讲

汇编指令详解 8080指令详解 1.8086系统下,Inter指令系统共有117条指令(看似很多,分一下类) 1.数据传送类指令(专门传送数据的) 2.算术运算类指令(加减乘除的运算的) 3.位操作类指令(或  异货 与 -.) 4.串操作类指令 (内存拷贝,内存连续地址拷贝的操作) 5.控制转移类指令(跳转,比如C语言的Goto) 6.处理机控制类指令(计算机的待机 ,重启 等等,让CPU待机睡眠的指令) 学习指令的注意事项 1.指令的功能,也就是这个指令可以实现什么操作.通常的话,指令就是指

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 表示可以比较寄存器

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

                                          16位汇编第六讲汇编指令详解第第三讲 1.十进制调整指令 1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 2.分成压缩BCD码和非压缩BCD码调整 简而言之: 以前的时候你有个手表,里面的数字是九,如果加一个1就是0了,就会产生进位, 不过这个是10进制进位的,所以应该是 a了,但是a的话就出错了.所以我们就出来了这个调整指令直接变为零,然后进位,也就是16进制码当做10进制使用

几种基本汇编指令详解

几种基本汇编指令详解 常见寄存器 寄存器 16位 32位 64位 累加寄存器 AX EAX RAX 基址寄存器 BX EBX RBX 计数寄存器 CX ECX RCX 数据寄存器 DX EDX RDX 堆栈基指针 BP EBP RBP 变址寄存器 SI ESI RSI 堆栈顶指针 SP ESP RSP 指令寄存器 IP EIP RIP 汇编指令 mov movb(8位).movw(16位).movl(32位).movq(64位) 寄存器寻址: movl %eax, %edx eax -> edx

迈向angularjs2系列(2):angular2组件和指令详解

<%= INIT %> 内容 一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> &l

数据传送指令详解

数据传送指令详解 前言 上一章我们说了汇编语言的基础,包括数据格式,寄存器以及操作数的标识方式,接下来我们就应该去认识一下hiU币按语言当红真难过的格各个指令了.这些指令大部署很简单,但是组合在一起却能模拟出我们程序当中香烟的任何效果,确实很神奇. 数据传送指令 数据传送指令的目的是我了将一个数据从一个位置复制到另一个位置.既然如此,那么数据传送至零就会包含一个源操作数和一个目的操作数,指令会将源操作数的值复制到目的操作数并覆盖. 数据传送指令一共可以分为5种,分别是mov,movs,movz,

Dockerfile常用指令详解&镜像缓存特性

Dockerfile简介 Dockerfile 是Docker中用于定义镜像自动化构建流程的配置文件.在Dockerfile中,包含了构建镜像过程中需要执行的命令和其他操作.通过Dockerfile可以更加清晰,明确的给定Docker镜像的制作过程,由于仅是简单,小体积的文件,在网络等介质中传递的速度快,能够更快的实现容器迁移和集群部署.Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. 相对于提交容器修改在进行镜像迁

Git大法好——2.Git本地操作指令详解

Git大法好--2.Git本地操作指令详解 引言 上节给大家讲解了有关于Git的一些概念,Git的引入,Git的四个组成部分,Git文件的状态,以及 Git的下载安装:前面也讲过Git和SVN有个明显的差别就是,Git可以不需要网络就可以进行版本 控制,这是因为Git中每个电脑都拥有一个本地的版本库,而远程的仓库仅仅是作为我们交换修改 的一个工具!即使失去这个工具,我们也可以干活,只是交换修改不方便罢了,假如是SVN,远程 服务器挂了-所以,我们使用Git的时候大部分时间都是在进行Git的一些本

[转]JVM指令详解(上)

作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符                            说明 0x00         nop                                什么都不做 0x01        aconst_null                   将null推送至栈顶 二.const系列 该系列命令主要