程序的机器即代码表示

131 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

高级语言与机器级代码之间的对应

x86汇编语言指令基础

image.png 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 寄存器 image.png image.png image.png 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寄存器中 image.png

常用的x86汇编指令

常见的算数运算指令 image.png 常见的逻辑运算指令 image.png

AT&T格式和Intel格式

image.png image.png

选择语句的机器级表示

无条件转移指令 jmp <地址> #PC无条件转移至<地址> jmp 128 #<地址>可以用常数给出 jmp eax #<地址>可以来自于寄存器 jmp [999] #<地址>可以来自于主存 jmp NEXT #<地址>可以用“标号”锚定 image.png image.png 条件转移指令--jxxx image.png image.png image.png cmp指令的底层原理 image.png

循环语句的机器级表示.

image.png 所有loop指令实现循环 image.png 理论上,能用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的思路: 只提供整数的加减乘指令 一条指令一个电路,电路设计相对简单,功耗更低“并行”、“流水线” image.png