汇编语言学习笔记

汇编语言的不同种类

  • as86汇编:能产生16位代码的Intel 8086汇编

    mov ax, cs  //cs→ax,目标操作数在前
    
  • GNU as汇编:产生32位代码,使用AT&T系统V语法

    movl var, %eax	// var→%eax,目标操作数在后
    
  • 内嵌汇编,gcc编译x.c文件会产生中间结果汇编文件

汇编语言的组成

汇编语言由三部分组成:

  1. 汇编指令。通过编译器把指令翻译成机器指令,也就是机器码
  2. 伪指令。告诉编译器如何翻译
  3. 符号体系。+-*/

RAM和ROM

内存最小单元:字节

RAM(Random Access Memory)(随机存取存储器):允许读和写,断电后指令和数据就丢失了,直接与cpu交换数据

ROM(Read-Only Memory(只读存储器):只允许读,断电后指令和数据都存在

CPU中的三条总线

CPU通过地址总线,数据总线和控制总线实现对外部元器件的控制,三种总线的宽度标志了CPU不同方面的性能:

  1. 地址总线的宽度决定了CPU的寻址能力
  2. 数据总线的宽度决定了CPU与其他器件进行数据传输的能力(一次传输的数据量)
  3. 控制总线的宽度决定了CPU对系统中其他器件的控制能力

8086CPU给出读取物理地址的方法

image-20210912110918802
  1. CPU中的相关部件提供两个16位的地址,一个是段地址,一个是偏移地址
  2. 段地址和偏移地址通过内部总线送入一个成为地址加法器的部件
  3. 地址加法器将两个16位的地址合成为一个20位的物理地址
  4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路
  5. 20位物理地址被地址总线传送到存储器

物理地址 = 段地址 * 16 + 偏移地址(段地址*16就相当于左移4位)

上述的本质含义是:CPU在访问内存时,用一个基础地址和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

image-20210912112155699

为什么非得是基础地址+偏移地址的思想如上图所示

段寄存器

由于CPU访问内存时候需要相关部件提供内存单元的段地址和偏移地址,以便送入地址加法器合成物理地址,因此段寄存器主要提供段地址,8086CPU有4个段寄存器:**CS **

** 、DS、SS、ES**

CS:代码段寄存器

IP:指令指针寄存器

加入CS中的内容为M,IP中的内容为N,则从内存M*16+N单元开始读取一条指令并执行。即将CS:IP寄存器指向的内存单元当做指令,CS当做指令的段地址,IP当做偏移地址

总结一下寄存器和段寄存器的种类

寄存器:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di

段寄存器:ds、ss、cs、es

CPU中的栈

段寄存器SS和寄存器SP表示了栈顶的位置,栈顶的段地址存放在SS中,偏移地址存放在SP中。即SS:SP指向栈顶元素

push和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

入栈的时候,栈顶从高地址向低地址方向增长。

8086处理器不会去管理栈顶超界的问题,需要我们自己小心是否会有越界行为。

总结:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20210912164804316

源程序和程序

一段源程序包含汇编指令和伪指令,汇编指令是由计算机执行、处理的指令或者数据,一般叫做程序

伪指令就是不由计算机执行,而是编译器执行的代码

源程序就是程序+伪指令

image-20210914101841003

程序执行过程的跟踪

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.obj是目标文件

目标文件要连接外界需要的库形成可执行文件

可执行文件被操作系统提供的shell程序加载进入内存,然后获得cpu执行

可执行文件中程序执行完毕后,cpu返还给shell0

[BX]和loop指令

[bx]和[0]有些类似,[0]表示内存单元,其偏移量是0,例如:

  1. mov ax, [0]

    表示将一个内存单元的内容送入ax中,这个内存单元的长度为2字节,存1个字,偏移地址为0,段地址在ds中

  2. mov al, [0]

    将一个内存单元的内容送入al中,这个内存单元的长度为1字节,存1个字节,偏移地址为0,段地址在ds中

  3. mov ax, [bx]

    将一个内存单元的内容送入ax中,这个内存单元的长度为2字节,存1个字,偏移地址在bx中,段地址在ds中

也可以段前缀来表示:

  1. mov ax,ds:[bx]

表示将一个内存单元的内容送入ax,这个内存单元2个字节,存放1个字,偏移地址在bx中,段地址在ds中

可执行文件的组成

可执行文件由描述信息程序组成,程序来自于源程序中的汇编指令和定义的数据。描述信息则主要是编译,连接程序对源程序中相关伪指令进行处理所得到的信息。

数据、指令、栈放入不同的栈

CPU到底如何处理我们定义的段中的内容,是当做指令执行,当做数据访问还是当做栈空间,完全是靠程序中具体的汇编指令,即:

  1. CS:IP -----指令
  2. SS:SP----- 栈
  3. DS-----数据

与运算和或运算

  • 与(and)

    这个操作可以将操作对象的相应位置设为0,因为全1才为1。

  • 或(or)

    该操作可以将操作对象的相应位设为1,因为有1就为1。

[bx+idata]:一种更灵活的指明内存的方式

之前前面说到过用[bx]来指明一个内存单元,我们还可以用一种更为灵活的方式指明内存单元。

[bx+idata]表明一个内存单元,它的偏移地址为bx+idata(bx中的数值加上idata)

比如mov ax, [bx + 200]指的是将一个内存单元的内容送入ax,这个内存单元长2字节,存放1个字,偏移地址为bx中的数值加上200,段地址在ds中

几种不同的寻址方式

  1. **[idata]**用一个常量表示地址,可用于直接定位一个内存单元
  2. **[bx]**用一个变量来表示内存地址,可用于简介定位一个内存单元
  3. **[bx+idata]**用一个变量和常量来表示地址,可在一个起始地址的基础上用变量简介定位一个内存单元
  4. **[bx+si]**用两个变量表示地址
  5. **[bx+si+idata]**用两个变量和一个常量表示地址

汇编语言中数据位置的表达

  1. 立即数(idata)

    直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中)

  2. 寄存器

    指令要处理的数据在寄存器中,给出相应寄存器的名就行

  3. 段地址(SA)和偏移地址(EA)

    如果指令要处理的数据在内存中,在汇编指令中用[X]的格式给出SA、EA在某个段寄存器中

转移指令的原理

可以修改IP或同时修改CS和IP的指令统称为转移指令。转移指令就是可以控制CPU执行内存中某处代码的指令。

8086CPU的转移指令分为以下几类:

  • 无条件转移指令

    主要有jmp指令,可以同时修改CS和IP。主要给出两种信息:

    1. 转移的目的地址

    2. 转移的距离(段间转移、段内转移、段内近转移)

  • 条件转移指令

    jcxz指令,所有的有条件转移指令都是短转移,对IP的修改范围是:-128~127

  • 循环指令

    loop指令,短转移,对IP的修改范围是:-128~127循环指令

  • 过程

  • 中断

CALL和RET指令

call和ret指令都是转移指令,他们都修改IP,或同时修改CS和IP。

  • ret和retf

    ret指令用栈中的数据修改IP的内容,从而实现近转移

    retf指令用栈中的数据修改CS和IP的内容,从而实现远转移

  • call

    CPU执行call指令时,有两步操作:

    1. 将当前的IP或CS和IP压入栈中
    2. 转移

    call指令不能实现短转移

flag寄存器

image-20210921140724070
  • ZF标志

    零标志位,如果执行相关指令后结果为0,zf=1,若不为0,zf=0

    对于运算指令如add、sub、mul、div等会影响标志寄存器

    对于传送指令mov、push、pop等不会对寄存器有什么影响

  • PF标志

    奇偶标志位。如果执行指令后结果所有bit位中1的个数是偶数,pf=1,为奇数,pf=0

  • SF标志

    符号标志位。执行指令后结果如果为负数,sf=1,如果非负数,sf=0。

    SF标志就是CPU对有符号数运算的一种记录,记录数据的正负。

  • CF标志

    进位标志位。在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。

    当出现进位的时候,会将最高位保存起来,记录在CF位中

  • OF标志

    溢出:在进行有符号数运算时,如果超过了机器所能表示的范围成为溢出。

    溢出标志位。记录有符号数运算的结果是否发生了溢出,如果溢出of=1,否则of=0

    cf和of的区别:cf是对无符号数运算有意义的标志位,of是对有符号数运算有意义的标志位

CPU的内中断

任何一个通用的CPU都具备一种能力,可以在执行完当前正在执行的指令后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊的信息,称为:中断信息。

中断表明CPU不再接着向下执行,而是转去处理这个特殊的信息。

中断可以来自内部和外部,本书主要讨论内中断

内中断有以下几种情况产生:

  1. 除法错误
  2. 单步执行
  3. 执行into指令
  4. 执行int指令

中断是不同的信息,因此必须先识别不同信息来源。所以中断信息中必须包含识别来源的编码,叫做中断类型码。这个中断类型码是一个字节型数据,可以表示256种中断信息的来源。

  • 中断过程
    1. 从中断信息中获取中断类型码
    2. 标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,因此先将其保存在栈中)
    3. 设置标志寄存器的第8位TF和第9位IF的值为0
    4. CS的内容入栈
    5. IP的内容入栈
    6. 从内存地址为中断类型码*4和中断类型码 *4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS

端口的读写

CPU可以直接读写一下3个地方的数据:

  1. CPU内部的寄存器
  2. 内存单元
  3. 端口

端口所在的芯片和CPU通过总线相连,所以端口地址和内存地址一样,通过地址总线来传送。CPU总共可以定位64KB个不同的端口,因此端口的范围是0~65535

端口的读写指令只有两条:in和out

外中断

CPU除了能够执行指令进行运算以外,还应该能够对外部设备进行控制,接收它们的输入,向它们进行输出。要及时处理外设的输入,要解决一下两个问题:

  1. 外设的输入随时可能发生,CPU如何得知
  2. CPU从何处得到外设的输入?

答:外设接口芯片中有若干寄存器,CPU将这些寄存器当做端口来访问。外设的输入不直接送入内存和CPU中,而是送入相关的接口芯片的端口中;同理,CPU向外设的输出也不是直接送入外设,而是先送入端口,再由相关芯片送到外设。因此,**CPU通过端口和外部设备进行联系。**由于外设的输入随时可能到达,因此CPU提供中断机制来满足这种要求。这种中断信息来自CPU外部,相关芯片向CPU发出相应的中断信息,CPU执行完当前的指令后,可以检测到发送过来的中断信息,引发中断过程进而处理外设输入。

外中断一共有两类:

  1. 可屏蔽中断。该中断CPU可以不响应。是否响应要看标志寄存器中IF位的设置,当CPU检测到可屏蔽中断信息时,IF=1,则CPU在执行完当前指令后响应中断,如果IF=0,则不响应可屏蔽中断。(键盘输入就属于可屏蔽中断)
  2. 不可屏蔽中断。指CPU必须响应的外中断,CPU执行完当前指令后,立即响应引发中断过程。
    先送入端口,再由相关芯片送到外设。因此,**CPU通过端口和外部设备进行联系。**由于外设的输入随时可能到达,因此CPU提供中断机制来满足这种要求。这种中断信息来自CPU外部,相关芯片向CPU发出相应的中断信息,CPU执行完当前的指令后,可以检测到发送过来的中断信息,引发中断过程进而处理外设输入。

外中断一共有两类:

  1. 可屏蔽中断。该中断CPU可以不响应。是否响应要看标志寄存器中IF位的设置,当CPU检测到可屏蔽中断信息时,IF=1,则CPU在执行完当前指令后响应中断,如果IF=0,则不响应可屏蔽中断。(键盘输入就属于可屏蔽中断)
  2. 不可屏蔽中断。指CPU必须响应的外中断,CPU执行完当前指令后,立即响应引发中断过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Qt的UDP通信、TCP文件传输程序的设计与实现——QQ聊天群聊

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言一…

Selenium 元素不能定位总结

目录 元素不能定位总结: 1、定位语法错误: 定位语法错误,如无效的xpath,css selector,dom路径错误,动态dom 定位语法错误,动态路径(动态变化) 定位策略错误,如dom没有id用id定位…

vue history路径编码

记录今天遇到的一个问题: 问题现状 有一个需要前端伪造302进行重定向的需求,我们需要将这样的一个路径:http://xxx.com/system-name/#/index,拼接在跳转地址的后面,进行重定向。拼接的方式是这样的: htt…

攻防世界-web-Confusion1

1. 题目描述 打开链接,如图 点击Login和Rigister,都报错 但是有提示 指出了flag所在的位置,题目中直接能获取到的信息暂时就这么些了 2. 思路分析 既然告诉了我们flag文件的位置,那么要读取到这个文件,要么是任意文…

AI辅助带货直播场景源码系统 附带网站的搭建教程

互联网技术的发展和普及,直播带货行业迅速崛起。然而,直播带货在带来商机的同时,也面临着诸多挑战。如直播内容缺乏新意、转化率低等问题。针对这些问题,AI辅助带货直播场景源码系统应运而生,旨在利用人工智能技术&…

对接苹果支付退款退单接口

前言 一般而言,我们其实很少对接退款接口,因为退款基本都是商家自己决定后进行操作的,但是苹果比较特殊,用户可以直接向苹果发起退款请求,苹果觉得合理会退给用户,但是目前公司业务还是需要对接这个接口&am…

试试MyBatis-Plus可视化代码生成器,太香了,你一定会感谢我

前言 在基于Mybatis的开发模式中,很多开发者还会选择Mybatis-Plus来辅助功能开发,以此提高开发的效率。虽然Mybatis也有代码生成的工具,但Mybatis-Plus由于在Mybatis基础上做了一些调整,因此,常规的生成工具生成的代码…

PC端使子组件的弹框关闭

子组件 <template><el-dialog title"新增部门" :visible"showDialog" close"close"> </el-dialog> </template> <script> export default {props: {showDialog: {type: Boolean,default: false,},},data() {retu…

Java面向对象(高级)-- 类中属性赋值的位置及过程

文章目录 一、赋值顺序&#xff08;1&#xff09;赋值的位置及顺序&#xff08;2&#xff09;举例&#xff08;3&#xff09;字节码文件&#xff08;4&#xff09;进一步探索&#xff08;5&#xff09;最终赋值顺序&#xff08;6&#xff09;实际开发如何选 二、(超纲)关于字节…

1992-2021年省市县经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年省市县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;分区域汇总&#xff1a…

SpringBoot : ch05 整合Mybatis

前言 随着Java Web应用程序的快速发展&#xff0c;开发人员需要越来越多地关注如何高效地构建可靠的应用程序。Spring Boot作为一种快速开发框架&#xff0c;旨在简化基于Spring的应用程序的初始搭建和开发过程。而MyBatis作为一种优秀的持久层框架&#xff0c;提供了对数据库…

【Linux】-进程间通信-共享内存(SystemV),详解接口函数以及原理(使用管道处理同步互斥机制)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

中低压MOSFET 2N7002T 60V 300mA 双N通道 采用SOT-523封装形式

2N7002KW小电流双N通道MOSFET&#xff0c;电压60V电流300mA&#xff0c;采用SOT-523封装形式。低Ros (on)的高密度单元设计&#xff0c;坚固可靠&#xff0c;具有高饱和电流能力&#xff0c;ESD防护门HBM2KV。可应用于直流/直流转换器&#xff0c;电池开关等产品应用上。

成为AI产品经理——AI产品经理工作全流程

一、业务背景 背景&#xff1a;日常排球训练&#xff0c;中考排球项目和排球体测项目耗费大量人力成本和时间成本。 目标&#xff1a;开发一套用于实时检测排球运动并进行排球垫球计数和姿势分析的软件。 二、产品工作流程 我们这里对于产品工作流程的关键部分进行讲解&…

「Docker」如何在苹果电脑上构建简单的Go云原生程序「MacOS」

介绍 使用Docker开发Golang云原生应用程序&#xff0c;使用Golang服务和Redis服务 注&#xff1a;写得很详细 为方便我的朋友可以看懂 环境部署 确保已经安装Go、docker等基础配置 官网下载链接直达&#xff1a;Docker官网下载 Go官网下载 操作步骤 第一步 创建一个…

汽车智能座舱/智能驾驶SOC -2

第二篇&#xff08;笔记&#xff09;。 未来智能汽车电子电气将会是集中式架构&#xff08;车载数据中心&#xff09;虚拟化技术&#xff08;提供车载数据中心灵活性和安全性&#xff09;这个几乎是毋庸置疑的了。国际大厂也否纷纷布局超算芯片和车载数据中心平台。但是演进需…

日期格式转化成星期几部署到linux显示英文

异常收集 原因&#xff1a;解决办法仰天大笑出门去&#xff0c;我辈岂是蓬蒿人 传入一个时间获取这个时间对应的是星期几&#xff0c;在开发环境&#xff08;window系统&#xff09;中显示为星期几&#xff0c;部署到服务器&#xff08;linux系统&#xff09;中会显示英文的时间…

Youtube新手运营——你需要的技巧与工具

对于有跨境意向的内容创作者或者品牌企业来说&#xff0c;YouTube是因其巨大的潜在受众群和商业价值成为最值得投入变现与营销计划的平台。 据统计&#xff0c;98% 的美国人每月访问 YouTube&#xff0c;近三分之二的人每天访问。但是&#xff0c;YouTube还远未达到过度饱和的…

Leetcode—53.最大子数组和【中等】

2023每日刷题&#xff08;三十四&#xff09; Leetcode—53.最大子数组和 前缀和算法思想 参考灵茶山艾府 实现代码 #define MAX(a, b) ((a > b) ? (a) : (b)) #define MIN(a, b) ((a < b) ? (a) : (b)) int maxSubArray(int* nums, int numsSize) {int ans INT_…