X86 Assemble指令--LEA - 简书 https://www.jianshu.com/p/01e8d5ef369f
https://baike.baidu.com/item/lea/1139441 lea(微机8086/8088系列的一条指令)_百度百科
LEA reg16,mem
LEA指令将
存储器操作数mem的4位16进制偏移地址送到指定的
寄存器。这里,源操作数必须是存储器操作数,目标操作数必须是16位
通用寄存器。因该寄存器常用来作为地址指针,故在此最好选用四个间址寄存器BX,BP,SI,DI之一。
LEA 取
有效地址指令 (Load Effective Address )
指令格式:LEA 目的,源
解释:指定的寄存器的内容被标出的变量偏移量取代,也可以用标号,或地址表达式所取代。
[2]
指令功能:取源操作数地址的
偏移量,并把它传送到目的操作数所在的单元。如:
LEA BX ,BUFFER
LEA AX,[BX][DI](j基址加变址寻址)
LEA DX,DATA [BX][SI](相对基址加变址寻址)
[3]
LEA 指令要求源操作数必须是
存储单元,而且目的操作数必须是一个除段寄存器之外的16位或32位寄存器。当目的
操作数是16位
通用寄存器时,那么只装入
有效地址的低16位。使用时要注意它与MOV指令的区别,MOV指令传送的一般是源操作数中的内容而不是地址。
LEA指令和MOV指令一样是移动数据,但是与MOV不同的是,它移动的是“[ ]”里面的内容,例如:LEA EAX,[ECX]中,执行这条指令相当于MOV EAX,ECX。而MOV EAX,[ECX]是把“[ ]”里面的数据当成是内存地址编号,取地址里面的内容。
注意LEA指令与MOV指令的区别,比较下面两条指令:
LEA BX, BUFFER
MOV BX, BUFFER
前者将
存储器变量BUFFER的偏移地址送到BX,而后者将存储器变量BUFFER的内容(两个字节)传送到BX。当然也可以用MOV指令来得到存储器的偏移地址,例如以下两条指令的效果相同:
LEA BX, BUFFER
MOV BX, OFFSET BUFFER
其中,OFFSET BUFFER表示存储器变量BUFFER的偏移地址
The Intel 80386, part 3: Flags and condition codes - The Old New Thing https://devblogs.microsoft.com/oldnewthing/20190122-00/?p=100765
Code | Meaning | Condition | Notes |
E |
Equal |
ZF |
|
Z |
Zero |
NE |
Not equal |
!ZF |
|
NZ |
Not zero |
A |
Above |
!CF && !ZF |
Unsigned greater than |
NBE |
Not below or equal |
AE |
Above or equal |
!CF |
Unsigned greater than or equal |
NB |
Not below |
NC |
No carry |
No unsigned overflow |
B |
Below |
CF |
Unsigned less than |
NAE |
Not above or equal |
C |
Carry set |
Unsigned overflow |
BE |
Below or equal |
CF || ZF |
Unsigned less than or equal |
NA |
Not above |
G |
Greater |
!(SF ^ OF) && !ZF |
Signed greater than |
NLE |
Not less than or equal |
GE |
Greater than or equal |
!(SF ^ OF) |
Signed greater than or equal |
NL |
Not less than |
L |
Less than |
(SF ^ OF) |
Signed less than |
NGE |
Not greater than or equal |
LE |
Less than or equal |
(SF ^ OF) || ZF |
Signed less than or equal |
NG |
Not greater than |
S |
Sign |
SF |
Negative |
NS |
No sign |
!SF |
Positive or zero |
O |
Overflow |
OF |
Signed overflow |
NO |
No overflow |
!OF |
No signed overflow |
P |
Parity |
PF |
Even number of bits set |
PE |
Parity even |
NP |
No parity |
!PF |
Odd number of bits set |
PO |
Parity odd |
The overflow and parity conditions are not normally used by C code. Note also that many flags are not testable via condition codes. (Poor auxiliary carry flag. Nobody loves you.)
There are a few instructions for directly manipulating selected flags:
STC ; set carry
CLC ; clear carry
CMC ; complement (toggle) carry
STD ; set direction (go down)
CLD ; clear direction (go up)
1.101*2^(-10)
尾数 1.101 阶10
计算机系统基础(一):程序的表示、转换与链接-模块九 第3讲 x86-64的过程调用(3)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=AFVPGFE6J
[9.3.3]--3.IA-32和x86-64的比较举例(15分钟)_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1kE411X7S5?p=76
退栈
addq $32,$rsp 释放caller的栈帧
返回地址为64位
参数传递
最多可以用6个整型或指针型参数通过寄存器传递
超过,则通过栈来传递
movq %rsi,%rax 将y的值放入rax
addq (%rdi),%rax 将rdi所指的内存单元的数据和y相加后放入rax
movq %rax,(%rdi) 将rax的内容放入rdi所指的内存单元中
x86--64逆向工程举例
movq %rdi,%rax x86-64 入参x放入寄存器中
movl $0,%ecx 局部变量val放入寄存器中;
虽然val为long,但是初始值为0.可以不考虑高位,故放入ecx,而不是rcx。
movl $0,%edx 局部变量i放入寄存器中
比较 减,相等 位运算 与
leal (%rdi,%rsi),%eax 相加 1条指令
用addl要3条指令
movsbl %sil,%esi 在SIL中的b位char型
leaq (%rcx,%rsi),%rax 将ecx和rsi相加后放入rax
一些过程的参数取送,不必访问内存,即ebp+4,+8,+12 等
数据长度
数据类型及格式
x86-16
x86-32 IA-32
x86-64 Intel64, AMD64
Intel先推出不兼容IA-32的64位架构:IA-64,故没有市场份额(2000年安腾1,2002安腾2);
之后,AMD推出兼容IA-32的64位架构:指令集x86-64,AMD64 (2003)
之后,Intel推出兼容IA-32的64位架构:指令集x86-64,Intel64 (2004)
SIMD全称Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。
计算机系统基础(一):程序的表示、转换与链接-模块六 第5讲 x87浮点处理指令(1)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=JFVPGF7PA
从浮点寄存器到内存 Store
从内存到浮点寄存器 Load
计算机 比较 2个数 大小 通过 条件标志判断
计算机系统基础(一):程序的表示、转换与链接-模块六 第2讲 定点算术运算指令(3)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=TFVPGF6HN
一条指令,不区分是否带符号
计算机系统基础(一):程序的表示、转换与链接-模块六 第2讲 定点算术运算指令(2)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=NFVPGF68K
计算机系统基础(一):程序的表示、转换与链接-模块六 第2讲 定点算术运算指令(1)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=AFVPGF5VK
b byte 8位 w word 字 16位,早期; l 32位
栈:嵌套过程调用
入栈:从高地址向低地址增长
w 16位 2个字节
lea 加载有效地址 装入有效地址 load effective address
计算机系统基础(一):程序的表示、转换与链接-模块六 第1讲 传送指令(1)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=AFVPGF5H1
CISC
变长指令字 变长操作码
存储器的操作数的寻址方式
IA-32寻址方式
计算机系统基础(一):程序的表示、转换与链接-模块五 第2讲 IA-32指令系统概述(3)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=QFVPGF4LO
辅助进位标志
奇偶标志
方向标志
中断允许标志
陷阱标志
计算机中的算盘
计算机系统基础(一):程序的表示、转换与链接-模块五 第2讲 IA-32指令系统概述(2)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=CFVPGF4EM
标志寄存器
IA-32的寄存器组织
IP:即PC程序计数器
IA-32支持的数据类型及格式
计算机系统基础(一):程序的表示、转换与链接-模块五 第1讲 程序转换概述(2)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=PFVPGF43E
将cl寄存器中的内容
传送到
bx寄存器中的地址和di寄存器中的地址的和 减 6 后的地址
的寄存器中
计算机系统基础(一):程序的表示、转换与链接-模块五 第1讲 程序转换概述(1)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=NFVPGF3RQ
计算机系统基础(一):程序的表示、转换与链接-模块四 第2讲 整数除法运算-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=KFVPGF2V4
计算机系统基础(一):程序的表示、转换与链接-模块三 第2讲 从C表达式到逻辑电路-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=IFVPGF1L0
x64 兼容x86
IA-64不兼容IA-32
计算机系统基础(一):程序的表示、转换与链接-模块五 第2讲 IA-32指令系统概述(1)-网易公开课 https://open.163.com/newview/movie/free?pid=WFVPGEQSL&mid=GFVPGF49R
ISA 指令集结构
https://zhuanlan.zhihu.com/p/55896356
SP stack pointer 指向当前栈桢顶部的堆栈指针
BP base pointer 指向当前栈桢底部的基指针
堆栈的内存地址越来越低,即向地址小的地方增长。
MOV 指令将源操作数复制到目的操作数
MOV destination,source
目的操作数的内容会发生改变,而源操作数不会改变。这种数据从右到左的移动与 C++ 或 Java 中的赋值语句相似:
dest = source;
在几乎所有的汇编语言指令中,左边的操作数是目标操作数,而右边的操作数是源操作数。只要按照如下原则,MOV 指令使用操作数是非常灵活的。
两个操作数必须是同样的大小。
两个操作数不能同时为内存操作数。
指令指针寄存器(IP、EIP 或 RIP)不能作为目标操作数。
Intel寄存器的艺术 https://www.oschina.net/translate/the-art-of-picking-intel-registers
EAX - 累加器寄存器
EBX - 基础寄存器
ECX - 计数器寄存器
EDX - 数据寄存器
ESI - 源指针
EDI - 目的地指针
EBP - 基本指针
ESP - 堆栈指针
EAX - Accumulator Register
EBX - Base Register
ECX - Counter Register
EDX - Data Register
ESI - Source Index
EDI - Destination Index
EBP - Base Pointer
ESP - Stack Pointer
在CPU中,有八个通用寄存器
ax (add,代表相加,累加的意思)累加寄存器
bx (base,代表基地址,存放地址的寄存器) 基址寄存器
cx (count,个数,代表统计的意思)计数寄存器
dx (data,数据) 数据寄存器
SI (source) 源寄存器,存放源地址的内容的寄存器
DI (Dest) 目标寄存器,从源寄存器中memcpy到目标寄存器中
BP (base Point) 堆栈,理解为栈底指针,每次在栈中移动数据,出栈进栈,都会更新.记录的是当前的栈底
SP () 堆栈栈顶指针.
16位汇编第一讲简介
https://www.cnblogs.com/iBinary/p/7446164.html
32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用
https://www.cnblogs.com/iBinary/p/7508144.html
https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html
Computer Systems A Programmer's Perspective Second Edition
We have seen that a processor must execute a sequence of instructions,
where each instruction performs some primitive operation, such as adding
two numbers. An instruction is encoded in binary form as a sequence of 1 or more bytes.
The instructions supported by a particular processor and their byte-level encodings
are known as its instruction-set architecture (ISA). Different
“families” of processors, such as Intel IA32, IBM/Freescale PowerPC, and the
ARM processor family have different ISAs. A program compiled for one type
of machine will not run on another. On the other hand, there are many different
models of processors within a single family. Each manufacturer produces proces-
sors of ever-growing performance and complexity, but the different models remain
compatible at the ISA level. Popular families, such as IA32, have processors sup-
plied by multiple manufacturers. Thus, the ISA provides a conceptual layer of
abstraction between compiler writers, who need only know what instructions are
permitted and how they are encoded, and processor designers, who must build
machines that execute those instructions.