汇编的简单认识

汇编语言的特点

  • 可以直接访问、控制各种硬件设备,比如存储器、CPU等,能最大限度地发挥硬件的功能
  • 汇编指令是机器指令的助记符,同机器指令一一对应。每一种CPU都有自己的机器指令集/汇编指令集,所以汇编语言不具备可移植性
  • 知识点过多,开发者需要对CPU等硬件结构有所了解,不易于编写、调试、维护
  • 不区分大小写,比如mov 和 MOV是一样的

汇编语言的用途

  • 编写驱动程序、操作系统(比如Linux内核的某些关键部分)
  • 对性能要求极高的程序或者代码片段,可与高级语言混合使用(内联汇编)
  • 软件安全
    1 病毒分析与防治
    2 逆向/加壳/脱壳/破解/外挂/免杀/加密解密/漏洞/黑客
  • 是理解整个计算机系统的最佳起点和最有效途径
  • 为编写高效代码打下基础
  • 弄清代码本质
    1 sizeof
    2 ++a + ++a + ++a
    3 swich 和if 的效率究竟谁高?为什么?

目前讨论比较多的汇编语言有
8086汇编(8086是16bit的CPU)
Win32汇编
Win64汇编
AT&T汇编
ARM汇编

软件执行过程.png

函数调用流程

  1. push参数
  2. push函数的返回地址
  3. push bp (保护bp之前的值,方便以后恢复)
  4. mov bp, sp (保留sp之前的值,方便以后恢复)
  5. sub sp, 空间大小 (分配空间给局部变量)
  6. push si 、push di、 push bx (保护可能要用到的寄存器)
  7. 使用CC (int 3) 填充局部变量的空间
  8. ---- 执行业务逻辑 ----
  9. pop dx、 pop di、 pop si (恢复寄存器之前的值)
  10. mov sp, bp (恢复sp之前的值)
  11. pop bp (恢复bp之前的值)
  12. ret (将函数的返回地址出栈,执行下一条指令)
  13. 恢复栈平衡(add sp 参数所占的空间)
sum:
// 1保护bp
push bp
// 2保存sp之前的值; 
mov bp, sp
// 3预留10个字节给局部变量
sub sp, 10
// 4保护可能用到的寄存器
push bx
push cx
push es
push di
// 5给局部变量空间填充 int 3
// stosw的作用: 将ax的值拷贝到es:di中,同时di的值会+2
mov ax, 0cccch
//让es等于ss
mov bx, ss
mov es, bx
//让di等于bp-10 (局部变量 地址最小的区域)
mov di, bp
sub di, 10
// rep的作用,重复指向某个指令(执行次数由cx决定)
mov cx, 5
rep stosw

//6 业务逻辑
mov word ptr ss:[bp-2], 3
mov word ptr ss:[bp-4], 4
mov ax, ss:[bp-2]
add ax, ss[bp-4]
mov ss:[bp-6], ax
add ax, ss:[bp-6]

//7 恢复寄存器
pop di
pop es
pop cx
pop bx
//8 恢复sp
mov sp, bp
//9 恢复bp
pop bp

ret

栈桢.png
栈桢情况.png

基于x86架构的处理器所使用的汇编指令一般有2种格式

  • Inter汇编
  1. DOS(8086处理器)、windows
  2. Windows派系 -> VC编译器
  • AT&T汇编
  1. Linux、Unix、Mac OS、iOS(模拟器)
  2. Unix派系 -> GCC编译器
lldb常用指令.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 为什么要了解汇编? 了解汇编语言能够更加深入的理解高级语言的本质,彻底理解之前只是知道却又不清楚为什么的知识,比如...
    喵子G阅读 6,070评论 0 1
  • 一.认识汇编语言 要认识汇编语言,还得从编程语言的发展说起,语言有以下几种分类,其发展都是为了让我们更容易去操纵计...
    WellsCai阅读 4,832评论 0 1
  • 1基础知识机器语言是机器指令的集合,由0和1组成,但是很长很复杂,汇编语言因此产生。汇编语言的主体是汇编指令。汇编...
    一眼万年的星空阅读 5,020评论 0 1
  • 工作中经常会遇到需要使用汇编知识来解决的问题,比如查找崩溃堆栈定位在一些未提供源码的第三方库的崩溃原因等,但是由于...
    离原春草阅读 3,959评论 0 5
  • 1.地址总线,数据总线,控制总线在哪里,它们有什么作用?答:它们都是cpu连接外部组件的线路。地址总线:地址总线A...
    MagicalGuy阅读 5,501评论 0 1

友情链接更多精彩内容