高级语言与机器级代码之间的对应
x86汇编语言指令基础
mov指令
mov目的操作数d,源操作数s destination:目的地 source:来源、发源地
#mov指令功能: 将源操作数s复制到目的操作数d所指的位置
mov eax, ebx
#将寄存器ebx的值复制到寄存器eax
mov eax, 5
#将立即数5复制到寄存器eax
mov eax, dword ptr [af996h]
#将内存地址 af996h所指的32bit值复制到寄存器eax
mov byte ptr [af996h], 5
#将立即数5复制到内存地址 af996h所指的一字节中
指明内存的读写长度:
dword ptr一一双字,32bit
word ptr一一单字,16bit
byte ptr一一字节,8bit
寄存器
mov eax, dword ptr [ebx]
#将ebx所指主存地址的32bit复制到eax寄存器中
mov dword ptr [ebx], eax
#将eax的内容复制到ebx所指主存地址的 32bit
mov eax, byte ptr [ebx]
#将ebx所指的主存地址的8bit复制到eax
mov eax, [ebx]
#若未指明主存读写长度,默认32 bit
mov [af996h], eax
#将eax的内容复制到 af996h所指的地址(未指明长度默认32bit)
mov eax, dword ptr [ebx+8]
#将ebx+8所指主存地址的32bit复制到eax寄存器中
mov eax, dword ptr [af996-12h]
#将 af996-12所指主存地址的32bit复制到eax寄存器中
常用的x86汇编指令
常见的算数运算指令
常见的逻辑运算指令
AT&T格式和Intel格式
选择语句的机器级表示
无条件转移指令
jmp <地址> #PC无条件转移至<地址>
jmp 128 #<地址>可以用常数给出
jmp eax #<地址>可以来自于寄存器
jmp [999] #<地址>可以来自于主存
jmp NEXT #<地址>可以用“标号”锚定
条件转移指令–jxxx
cmp指令的底层原理
循环语句的机器级表示.
所有loop指令实现循环
理论上,能用loop指令实现的功能一定能用条件转移指令实现
使用loop指令可能会使代码更清晰简洁
补充: loopx指令―一如 loopnz, loopz
loopnz—当ecx!=0 && ZF==0时,继续循环
loopz—当ecx!=0 && ZF==1时,继续循环
CISC和RISC
CISC:Complex Instruction Set Computer
设计思路:一条指令完成一个复杂的基本功能。
代表:x86架构,主要用于笔记本、台式机等
80-20规律:典型程序中80%的语句仅仅使用处理机中20%的指令
RISC: Reduced Instruction Set Computer
设计思路:一条指令完成一个基本“动作”;
多条指令组合完成一个复杂的基本功能。
代表:ARM架构,主要用于手机、平板等
比如设计一套能实现整数、矩阵加/减/乘运算的指令集:
CISC的思路:
除了提供整数的加减乘指令除之外,还提供矩阵的加法指令、矩阵的减法指令、矩阵的乘法指令
一条指令可以由一个专门的电路完成有的复杂指令用纯硬件实现很困难
->采用“存储程序”的设计思想,由一个比较通用的电路配合存储部件完成一条指令
RISC的思路:
只提供整数的加减乘指令
一条指令一个电路,电路设计相对简单,功耗更低“并行”、“流水线”