IA-32指令系统 x86-64 instruction-set architecture Processor Architecture 指令集结构 x87FPU MMX SSE SIMD

 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
CodeMeaningConditionNotes
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的栈帧

 

 

 

 

 

 


 

 

 
movb movw movl movq
 

 

 

 
 

 

 

 
过程调用的寄存器使用约定
 
 
 
返回地址为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
 
 

 

 

 

 

 

 

 

 

 
R_ 64位  E_ 32 ._ 16 _L 8


 

 

 

 
符号扩展 零扩展
 
 
 

 

 

 

 

 

 

 

 一些过程的参数取送,不必访问内存,即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.
posted @ 2016-12-07 12:53  papering  阅读(823)  评论(0编辑  收藏  举报