王道408计组汇编语言部分学习总结

简介: 用于实现分支结构、循环结构的指令: cmp、 test、 jmp、 jxxx用于实现函数调用的指令: push、pop、call、 ret用于实现数据转移的指令: mov

x86汇编语言指令基础

x86处理器中程序计数器PC 通常被称为IP


高级语言—>汇编语言—>机器语言

6769310a817233c20cac9efa7bae8cf4_d7669d4230454c1b811449a472640d39.png



x86架构CPU,有哪些寄存器

EAX 通用寄存器

EBX

ECX

EDX

ESI

变址寄存器


变址寄存器可用于线性表、字符串的处理

EDI

EBP 堆栈基指针 堆栈寄存器用于实现函数调用

ESP 堆栈顶指针

mov eax, ebx      

#寄存器—>寄存器

mov eax, dword ptr [af996h]      

#主存→寄存器

mov eax, 5    

#立即数—>寄存器

moveax, 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, ebx       
#寄存器—>寄存器
mov eax, dword ptr [af996h]       
#主存→寄存器
mov eax, 5     
#立即数—>寄存器
moveax, 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寄存器中

dea14a9fae0e17a11afef8dcd356eb6e_d6eaeb33921241708d47931571bf044b.png


常用的x86汇编指令

1. 常见的算数运算指令

加 add add d,s #计算d+s,结果存入d

减 subtract sub d,s #计算d-s,结果存入d

乘 multiply mul d,s #无符号数d*s,乘积存入d

imul d,s #有符号数d*s,乘积存入d

除 divide div s #无符号数除法edx:eax/s,商存入eax,余数存入edx(被除数已经放到edx:eax中)

idiv s #有符号数除法edx:eax/s,商存入eax,余数存入edx

取负数 negative neg d #将d取负数,结果存入d

自增++ increase inc d #将d++,结果存入d .

自减-- decrease dec d #将d--,结果存入d

d:destination,目的地(如:寄存器或内存)


s:source,来源地(寄存器,主存,常量)


目的操作数d不可以是常量(因为是把s的东西放到d里)


举例:

add <reg>, <reg> / sub Kreg>, <reg>

add <reg>, <mem> / sub <reg>, <mem>

add <mem>, <reg> / sub <mem>, <reg>

add <reg>, <con> / sub <reg>, <con>

add <mem>, <con> / sub <mem>, <con>


<reg> 的意思是:|寄存器|register

<mem> 的意思是:|内存|memory

<con> 的意思是:|常数|constant


sub eax, 10 #eax←eax-10

add byte ptr [var], 10 #10与var值指示的内存地址的一-字节值相加,并将结果

保存在var值指示的内存地址的字节中


2. 常见的逻辑运算指令

与 and and d,s #将d、s逐位相与,结果放回d

或 or or d,s #将d、s逐位相或,结果放回d

非 not not d #将d逐位取反,结果放回d

异或 exclusive or xor d,s #将d、s逐位异或,结果放回d

左移 shift left shI d,s #将d逻辑左移s位,结果放回d (通常s是常量)

右移 shift right shr d,s #将d逻辑右移s位,结果放回d (通常s是常量)

3. 其他指令

用于实现分支结构、循环结构的指令: cmp、 test、 jmp、 jxxx

用于实现函数调用的指令: push、pop、call、 ret

用于实现数据转移的指令: mov


3.1 无条件转移指令jmp

jmp <地址>
#PC无条件转移至<地址>
jmp 128
#<地址>可以用常数给出
jmp eax
#<地址>可以来自于寄存器
jmp [999]
#<地址>可以来自于主存
jmp NEXT
mov ecx,ebx
NEXT:
mov ecx,eax
#<地址>可以用“标号”锚定

3.2 条件转移指令j***

je <地址>
#jump when equal, 若a==b则跳转
jne <地址>
#jump when not equal, 若a !=b则跳转
jg <地址>
#jump when greater than, 若a>b则跳转
jge <地址>
#jump when greater than or equal to,若a>=b则跳转
jl <地址>
#jump when less than, 若a<b则跳转
jle <地址>
#jump when less than or equal to, 若a<=b则跳转
cmp eax,ebx #比较寄存器eax和ebx里的值
jg NEXT     #若eax > ebx,则跳转到 NEXT:

3.3 函数调用指令

函数调用指令: call<函数名> 
函数返回指令: ret

call指令的作用:

①将IP旧值压栈保存(保存在函数的栈帧顶部)

②设置IP新值,无条件转移至被调用函数的第一条指令

ret指令的作用:

从函数的栈帧项部找到IPI旧值,将其出栈并恢复IP寄存器



push eax #将寄存器eax的值压栈
push 985 #将立即数985压栈
push [ebp+8] #将主存地址[ebp+8]里的数据压栈
pop eax #栈项元素出栈,写入寄存器eax
pop [ebp+8] #栈项元素出栈,写入主存地址:[ebp+8]

push. pop指令实现入栈、出栈操作,x86 默认以4字节为单位。指令格式如下:

Push A  //先让esp减4,再将A压入

Pop B  //栈项元素出栈写入B,再让esp加4

注1:A可以是立即数、寄存器、主存地址:

注2:B可以是寄存器、 主存地址

目录
相关文章
|
3月前
|
存储 算法 NoSQL
天呐!汇编语言竟如此神奇,从零到精通的学习指南带你开启计算机世界神秘大门!
【8月更文挑战第31天】汇编语言是一种底层编程语言,直接与硬件交互,对于理解计算机体系结构和底层原理至关重要。尽管现代软件开发中较少使用,但学习汇编语言有助于深入了解计算机如何执行指令、管理内存和处理数据,从而优化程序性能,进行底层系统开发和调试。不同处理器有不同指令集,如 x86 和 ARM,掌握这些指令集及寄存器、内存地址等基本概念是学习汇编语言的基础。通过简单示例开始,逐步掌握复杂指令和调试工具,可以大大提高编程技能和解决问题的能力。
69 1
|
1月前
|
存储 Go
汇编语言的学习
本文详细介绍了在DOSBox中学习汇编语言的基础知识,包括寄存器的使用、数据和指令的选取、栈的操作、段地址的计算以及如何编写和执行简单的汇编程序。
19 0
汇编语言的学习
|
5月前
|
程序员 索引
逆向学习汇编篇:内存管理与寻址方式
逆向学习汇编篇:内存管理与寻址方式
52 0
|
6月前
|
编译器
【Bug】8086汇编学习
随笔 与汇编的灵活与底层所伴随的,是使用者极大的心智负担。 模块之间的隔离性很难控制。甚至多个子程序间的标号也不能相同,故子程序无法独立开发后直接集成。
149 5
|
6月前
汇编指令学习(寻址方式)
汇编指令学习(寻址方式)
59 0
|
6月前
汇编指令学习(LOOP)
汇编指令学习(LOOP)
81 0
|
6月前
汇编指令学习(CALL,JMP,RET)
汇编指令学习(CALL,JMP,RET)
93 0
|
6月前
|
JavaScript
汇编指令学习(JMP、JE、JS、JP,JO,JB)
汇编指令学习(JMP、JE、JS、JP,JO,JB)
444 0
|
6月前
汇编指令学习(CMP,TEST)
汇编指令学习(CMP,TEST)
138 0
|
6月前
汇编指令学习(AND,OR,XOR,NOT)
汇编指令学习(AND,OR,XOR,NOT)
107 0