博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows系统-汇编语言的语法是“操作码+操作数”
阅读量:4303 次
发布时间:2019-05-27

本文共 1103 字,大约阅读时间需要 3 分钟。

在汇编语言中,1行表示对CPU的一个指令。汇编语言指令的语法结构是操作码+操作数(也存在只有操作码没有操作数的指令)①。

操作码表示的是指令动作,操作数表示的是指令对象。操作码和操作数罗列在一起的语法,就是一个英文的指令文本。操作码是动词,操作数相当于宾语。例如,用汇编语言来分析“Give me money”这个英文指令的话,Give就是操作码,me和money就是操作数。汇编语言中存在多个操作数的情况下,要用逗号把它们分割开来,就像Give me, money这样。

能够使用何种形式的操作码,是由CPU的种类决定的。表10-1对代码清单10-2中用到的操作码的功能进行了整理,大家可以看一下。这些都是32位x86系列CPU用的操作码。操作数中指定了寄存器名、内存地址、常数等。在表10-1中,操作数是用A和B来表示的。

表10-1 代码清单10-2中用到的操作码的功能

本地代码加载到内存后才能运行。内存中存储着构成本地代码的指令和数据。程序运行时,CPU会从内存中把指令和数据读出,然后再将其存储在CPU内部的寄存器中进行处理(图10-2)。

图10-2 CPU和内存的关系

寄存器是CPU中的存储区域。不过,寄存器并不仅仅具有存储指令和数据的功能,也有运算功能。x86系列CPU的寄存器的主要种类和角色如表10-2所示。寄存器的名称会通过汇编语言的源代码指定给操作数。内存中的存储区域是用地址编号来区分的。CPU内的寄存器是用eax及ebx这些名称来区分的。此外,CPU内部也有程序员无法直接操作的寄存器。例如,表示运算结果正负及溢出状态的标志寄存器及操作系统专用的寄存器等,都无法通过程序员编写的程序直接进行操作。

表10-2 x86系列CPU的主要寄存器②③

Ps:脚注

①在汇编语言中,类似于mov这样的指令称为“操作码”(opcode),作为指令对象的内存地址及寄存器称为“操作数”(operand)。被转换成CPU可以直接解析运行的二进制的操作码和操作数,就是本地代码。

②表10-2 中表示的寄存器名称是x86自带的寄存器名称。在第1章中表1-1列出的寄存器名称是一般叫法。两者有些不同,例如,x86的扩展基址指针寄存器就相当于第1章中介绍的基址寄存器。

③ x86系列32位CPU的寄存器名称中,开头都带了一个字母e,例如eax、ebx、ecx、edx等。这是因为16位CPU的寄存器名称是ax、bx、cx、dx等。32位CPU寄存器的名称中的e,有扩展(extended)的意思。我们也可以仅利用32位寄存器的低16位,此时只需把要指定的寄存器名开头的字母e去掉即可。

转载地址:http://iclws.baihongyu.com/

你可能感兴趣的文章
SpringCloud Feign的使用方式(二)
查看>>
关于Vue-cli+ElementUI项目 打包时排除Vue和ElementUI
查看>>
Vue 路由懒加载根据根路由合并chunk块
查看>>
vue中 不更新视图 四种解决方法
查看>>
MySQL 查看执行计划
查看>>
OpenGL ES 3.0(四)图元、VBO、VAO
查看>>
OpenGL ES 3.0(五)纹理
查看>>
OpenGL ES 3.0(八)实现带水印的相机预览功能
查看>>
OpenGL ES 3.0(九)实现美颜相机功能
查看>>
FFmpeg 的介绍与使用
查看>>
Android 虚拟机简单介绍——ART、Dalvik、启动流程分析
查看>>
原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变
查看>>
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 源码分析 - avcodec_send_packet 和 avcodec_receive_frame
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>
学习笔记_vnpy实战培训day03
查看>>