汇编指令总结

GAS中每个操作都是有一个字符的后缀,表明操作数的大小。


C声明


GAS后缀


大小(字节)


char


b


1


short


w


2


(unsigned) int / long / char*


l


4


float


s


4


double


l


8


long double


t


10/12

注意:GAL使用后缀“l”同时表示4字节整数和8字节双精度浮点数,这不会产生歧义因为浮点数使用的是完全不同的指令和寄存器。

操作数格式:


格式


操作数值


名称


样例(GAS = C语言)


$Imm


Imm


立即数寻址


$1 = 1


Ea


R[Ea]


寄存器寻址


%eax = eax


Imm


M[Imm]


绝对寻址


0x104 = *0x104


(Ea)


M[R[Ea]]


间接寻址


(%eax)= *eax


Imm(Ea)


M[Imm+R[Ea]]


(基址+偏移量)寻址


4(%eax) = *(4+eax)


(Ea,Eb)


M[R[Ea]+R[Eb]]


变址


(%eax,%ebx) = *(eax+ebx)


Imm(Ea,Eb)


M[Imm+R[Ea]+R[Eb]]


寻址


9(%eax,%ebx)= *(9+eax+ebx)


(,Ea,s)


M[R[Ea]*s]


伸缩化变址寻址


(,%eax,4)= *(eax*4)


Imm(,Ea,s)


M[Imm+R[Ea]*s]


伸缩化变址寻址


0xfc(,%eax,4)= *(0xfc+eax*4)


(Ea,Eb,s)


M(R[Ea]+R[Eb]*s)


伸缩化变址寻址


(%eax,%ebx,4) = *(eax+ebx*4)


Imm(Ea,Eb,s)


M(Imm+R[Ea]+R[Eb]*s)


伸缩化变址寻址


8(%eax,%ebx,4) = *(8+eax+ebx*4)

注:M[xx]表示在存储器中xx地址的值,R[xx]表示寄存器xx的值,这种表示方法将寄存器、内存都看出一个大数组的形式。

数据传送指令:


指令


效果


描述


movl S,D


D <-- S


传双字


movw S,D


D <-- S


传字


movb S,D


D <-- S


传字节


movsbl S,D


D <-- 符号扩展S


符号位填充(字节->双字)


movzbl S,D


D <-- 零扩展S


零填充(字节->双字)


pushl S


R[%esp] <-- R[%esp] – 4;

M[R[%esp]] <-- S


压栈


popl D


D <-- M[R[%esp]];

R[%esp] <-- R[%esp] + 4;


出栈

注:均假设栈往低地址扩展。

算数和逻辑操作地址:


指令


效果


描述


leal S,D


D = &S


movl地版,S地址入D,D仅能是寄存器


incl D


D++


加1


decl D


D--


减1


negl D


D = -D


取负


notl D


D = ~D


取反


addl S,D


D = D + S



subl S,D


D = D – S



imull S,D


D = D*S



xorl S,D


D = D ^ S


异或


orl S,D


D = D | S



andl S,D


D = D & S



sall k,D


D = D << k


左移


shll k,D


D = D << k


左移(同sall)


sarl k,D


D = D >> k


算数右移


shrl k,D


D = D >> k


逻辑右移

特殊算术操作:


指令


效果


描述


imull S


R[%edx]:R[%eax] = S * R[%eax]


无符号64位乘


mull S


R[%edx]:R[%eax] = S * R[%eax]


有符号64位乘


cltd S


R[%edx]:R[%eax] = 符号位扩展R[%eax]


转换为4字节


idivl S


R[%edx] = R[%edx]:R[%eax] % S;

R[%eax] = R[%edx]:R[%eax] / S;


有符号除法,保存余数和商


divl S


R[%edx] = R[%edx]:R[%eax] % S;

R[%eax] = R[%edx]:R[%eax] / S;


无符号除法,保存余数和商

注:64位数通常存储为,高32位放在edx,低32位放在eax。

条件码:

条件码寄存器描述了最近的算数或逻辑操作的属性。

CF:进位标志,最高位产生了进位,可用于检查无符号数溢出。

OF:溢出标志,二进制补码溢出——正溢出或负溢出。

ZF:零标志,结果为0。

SF:符号标志,操作结果为负。

比较指令:


指令


基于


描述


cmpb S2,S1


S1 – S2


比较字节,差关系


testb S2,S1


S1 & S2


测试字节,与关系


cmpw S2,S1


S1 – S2


比较字,差关系


testw S2,S1


S1 & S2


测试字,与关系


cmpl S2,S1


S1 – S2


比较双字,差关系


testl S2,S1


S1 & S2


测试双字,与关系

访问条件码指令:


指令


同义名


效果


设置条件


sete D


setz


D = ZF


相等/零


setne D


setnz


D = ~ZF


不等/非零


sets D


D = SF


负数


setns D


D = ~SF


非负数


setg D


setnle


D = ~(SF ^OF) & ZF


大于(有符号>)


setge D


setnl


D = ~(SF ^OF)


小于等于(有符号>=)


setl D


setnge


D = SF ^ OF


小于(有符号<)


setle D


setng


D = (SF ^ OF) | ZF


小于等于(有符号<=)


seta D


setnbe


D = ~CF & ~ZF


超过(无符号>)


setae D


setnb


D = ~CF


超过或等于(无符号>=)


setb D


setnae


D = CF


低于(无符号<)


setbe D


setna


D = CF | ZF


低于或等于(无符号<=)

 

跳转指令:


指令


同义名


跳转条件


描述


jmp   Label


1


直接跳转


jmp   *Operand


1


间接跳转


je     Label


jz


ZF


等于/零


jne    Label


jnz


~ZF


不等/非零


js     Label


SF


负数


jnz    Label


~SF


非负数


jg     Label


jnle


~(SF^OF) & ~ZF


大于(有符号>)


jge    Label


jnl


~(SF ^ OF)


大于等于(有符号>=)


jl     Label


jnge


SF ^ OF


小于(有符号<)


jle     Label


jng


(SF ^ OF) | ZF


小于等于(有符号<=)


ja     Label


jnbe


~CF & ~ZF


超过(无符号>)


jae    Label


jnb


~CF


超过或等于(无符号>=)


jb     Label


jnae


CF


低于(无符号<)


jbe    Label


jna


CF | ZF


低于或等于(无符号<=)

转移控制指令:(函数调用):


指令


描述


call    Label


过程调用,返回地址入栈,跳转到调用过程起始处,返回地址是call后面那条指令的地址


call    *Operand


leave


为返回准备好栈,为ret准备好栈,主要是弹出函数内的栈使用及%ebp

时间: 2024-10-09 07:55:33

汇编指令总结的相关文章

汇编指令解析

X86架构 [原创]X86汇编之指令格式解析 [原创]汇编指令之OpCode快速入门 [原创]X64汇编之指令格式解析 ARM架构:

Android 图解逆向工程中ARM常用汇编指令(一)

我们走得太快,灵魂都跟不上了. 微小的幸福就在身边,容易满足就是天堂. 在逆向和爆破中我们经常会在IDA中接触到汇编,一般做安卓的不会太了解VB回编等,不太了解的同学可以先查看上篇文章<Android ARM常用的汇编指令合集> 再来继续我们的学习,我们先来看张图. 这个view里面有 PUSH/LDR/SUB/MOVS/BLX/SUBS/BEQ/CMP ,这些差不多都是常见的,不过也不需要看得懂,理解这个指令即可,接下来我们就来分析下这些指令分别有什么作用吧. 先引入 概念性 东西,免得大家

如何实现对ARM汇编指令的调试?

学习ARM汇编语言时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在x86平台上执行ARM指令,可以使用qemu模拟器执行ARM汇编指令,具体的调试方法,一起来看看吧. 一.准备ARM汇编程序 首先,我们构造一段简单的ARM汇编程序作为测试代码main.s. .globl _start _start: mov R0,#0 swi 0x00900001 以上汇编指

汇编指令速查

指令 功能 AAA 调整加 AAD 调整除 AAM 调整乘 AAS 调整减 ADC 进位加 ADD 加 AND 与 ARPL 调整优先级 BOUND 检查数组 BSF 位右扫描 BSR 位左扫描 BSWAP 交换字节 BT 位测试 BTC 位测试求反 BTR 位测试清零 BTS 位测试置一 CALL 过程调用 CBW 转换字节 CDQ 转换双字 CLC 进位清零 CLD 方向清零 CLI 中断清零 CLTS 任务清除 CMC 进位求反 CMOVA 高于传送 CMOVB 低于传送 CMOVE 相等

汇编指令mov、add、sub、jmp

mov:寄存器,数据 mov:寄存器,寄存器 mov:寄存器,内存单元 mov:段寄存器,内存单元 mov:内存单元,寄存器 mov:内存单元,段寄存器 mov:段寄存器,寄存器 mov:寄存器,段寄存器 add:寄存器,数据 add:寄存器,寄存器 add:内存单元,寄存器 add:寄存器,内存单元 sub:寄存器,数据 sub:寄存器,寄存器 sub:内存单元,寄存器 sub:寄存器,内存单元 jmp:段地址:偏移地址  用段地址修改CS 用偏移地址修改IP jmp:寄存器,只用寄存器的内容

查看汇编指令的二进制代码

今天在尝试ptrace设置断点达时候想知道syscall这条汇编指令对应达二进制码是多少. 百度无果之后在stackoverflow上看到这么个问题 http://stackoverflow/questions/9815448/jmp-instruction-hex-code 里边哥们问jmp对应的二进制码是多少,大神是这么回答的 echo 'asm("mov $400835, %rax\n jmp %rax\n");' >a.c gcc -c a.c objdump -d a.

【嵌入式Linux+ARM】ARM体系结构与编程(ARM汇编指令)

自己的一些简单的总结,也是最常用的ARM汇编指令,之后也会不断的补充完善. 1. 汇编系统预定义的段名 .text    @代码段 .data   @初始化数据段 .bss    @未初始化数据段 需要注意的是,源程序中.bss段应该在.text之前. 2.定义入口点 汇编程序的缺省入口是 start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点. .text .global _start _start: 3 .word用法 word expression就是在当前位置放一个wo

汇编指令:push、pop

8086CPU出栈入栈都是以字为单位进行的. push ax 由一下两步完成 1.SP=SP-2 2.将ax中的内容送入SS:SP指向的内存单元 pop ax 1.将SS:SP指向的内存单元中的内容送入ax 2.SP=SP+2 push 寄存器 pop 寄存器 push 段寄存器 pop 段寄存器 push 内存单元 pop 内存单元 只给出内存单元的偏移地址,段地址在指令执行时从ds中获得. 汇编指令:push.pop,布布扣,bubuko.com

带注释的汇编指令大全

一.数据传输指令 ─────────────────────────────────────── 它们在存贮器和寄存器.寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节.  如:MOV eax,11  意思:eax=11 MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. POPA 把DI,SI,BP,SP,BX,DX,CX

一些汇编指令

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