X86汇编语言中的registers相关

0、写在前面

本文中总结于王爽老师的汇编语言,建议有兴趣的都买一本,以支持王爽老师的辛勤付出。再者,这本书写的确实很nice。


8086CPU共有14个registers:AX, BX, CX, DX, SI, DI, SP, BP, IP, CS, SS, DS, ES, PSW, 所有寄存器都是16位的。

【1】通用寄存器: AX, BX, CX, DX

通常用于存放一般性的数据;

【2】CS和IP (code segment and instruction pointer) - 代码段寄存器和指令指针寄存器

CPU从何处执行是由寄存器决定的, 设CS的value = M, IP的value = N , CPU将从M*16 + N 内存单元开始执行;(因为CPU的地址加法器采用 物理地址 = 段地址*16 + 偏移地址 来表示物理地址)
Attention: jmp 可以修改CS和IP的值;

【3】DS(data segment register) - 数据段寄存器

通常用来存放要访问数据的段地址;

mov bx,1000h
mov ds,bx
mov al,[0] 

将1000:0 内存单元中的 数据copy到 al

【4】[bx]

bx用于存放偏移地址EA (effective addr), 段基址在ds中的内存单元;
如mov [bx] ,ax
将ax中的内容copy到 ds:bx (ds*16+bx)内存单元中。

Attention:

A1) EA-effective address 有效地址==偏移地址;

A2) SA-segment address 段基址;

A3) debug 和 汇编编译器masm对指令的不同处理

对于mob bl,[1] ; mov cl,[2] ; debug将[1] 解释为一个内存单元 即将[idata]解释为[idata]内存单元的偏移地址,段基地址在ds中,而编译器将[1]解释为1, 即将[idata]解释为idata立即数了;

【5】bx, si , di , bp

5.1)只有这4个registers 可以用在[…]中来进行内存单元寻址;

mov ax, [bp + di ]

5.2)在[…]中, 这4个registers可以单个出现,或只能以4种组合出现

 bx+si ;bx+di ;bp+si ;bp + di;

5.3)只要在[…]中使用寄存器bp, 若指令中没有显性给出段地址,段地址就默认在ss中。

mov ax,[bp+si+idata] (基址变址相对寻址)

【6】指令处理的数据在什么地方

6.1) 立即数, 数据包含在指令中;

6.2) 寄存器,数据包含在register中

6.3) 段地址(SA)和偏移地址中(EA)

mov ax,[bx+si+8] 段地址默认在ds中;
mov ax,[bp+si + 8] 段地址默认在ss中;

当然你也可以显性指定,如

mov ax,es:[bx]

6.4) 寻址方式如下:

这里写图片描述

【7】指令要处理的数据有多长

mov word ptr ds:[0],1 ; word ptr指明了访问的内存单元是一个字单元
mov byteptr ds:[0],1 ; byte ptr指明了访问的内存单元是一字节字单元

【8】CPU中的栈

任意时刻, SS:SP指向栈顶元素。push和pop指令时,CPU从ss和sp中得到栈顶元素;

push ax 分为两步:

  • 8.1) sp = sp - 2 , SS:SP指向当前栈顶前面的单元;
  • 8.2) 将ax内容送到ss:sp 指向的内存单元处;
    入栈时栈顶由高地址向低地址增长。(先送字数据的低字节,后送 高字节)

【9】pushf和popf (PSW)

pushf和popf的功能是向标志寄存器的压栈和从标志寄存器出栈;

什么是标志寄存器, 其中存储的信息就是程序状态字PSW(program status word)
这里写图片描述
cf==carry flag (进位标志) 前一条指令执行结果产生的进位
pf==parity flag (奇偶标志位)前一条指令执行结果 1 的个数是否为偶数,偶数为1,否则为0;
af==
zf==zero flag(零标志位) 前一条指令执行结果是否为0,为0则zf=1, 否则为0;
sf=sign flag (符号标志) 如果为负, sf=1,否则为0;
tf
if
df
of==overflow flag 溢出标志
这里写图片描述

其作用:

  • (1)用来存储相关指令的某些执行结果
  • (2)用来为CPU执行相关指令提供行为依据
  • (3)用来控制cpu的相关工作方式

【10】串传送指令

movsb, 功能执行movsb指令相当于进行以下几步:

  • (1)(es)16 + (di) = ((ds) 16 + si)
  • (2)
    如果df = 0 (si) = (si) + 1; (di) = (di) + 1;
    如果df = 1 (si) = (si) - 1; (di) = (di) - 1;

movsw ,根据标志寄存器df位的值,将si和di +2 或 -2

如我们的需求:

  • (1)传送的原始位置:ds:si
  • (2) 传送的目的位置:es:di
  • (3)传送的长度:cx
  • (4)传送的方向: df

代码如下:

mov ax,data
mov ds,ax
mov si,0 ; ds:si 指向data:0
mov es,ax
mov di,16  ;  es:di 指向data:0010
mov cx,16   ; cx=16 ,rep循环16次
cld            ;设置df=0, 
rep mobsb

Attention:

cld: 将标志寄存器的df位置0
std: 将标志寄存器的df位置1

【11】offset 操作符

取偏移地址

assume cs:codesg
codesg segmentstart: mov ax, offset start   ; 相当于mov ax,0
s:mov ax, offset s ;相当于mov ax,3

【Complementary】 字符串处理指令

  • (1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI
  • (2) stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI
  • (3) movsb、movsw:把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI
  • (4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI
  • (5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI
  • (6) rep:重复其后的串操作指令。重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在LODS前。

Attention

上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX
涉及的标志位:DF、AF、CF、OF、PF、SF、ZF

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

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

相关文章

代码流程图生成器_【进阶Python】第五讲:迭代器与生成器

点击蓝字关注我迭代是Python中常用且非常强大的一个功能,它可以用于访问集合、列表、字符串、字典等数据结构的元素。我们经常使用循环和条件语句,我们也清楚哪些是可以迭代访问,但是具体它们之间有什么有什么异同之处?有哪些特点…

生成最简单的验证码图片的Java代码

后端代码: package priv.lwx.servlet.sl.web; /*** description** author liaowenxiong* date 2022/3/25 09:56*/import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.…

cognito_将Amazon Cognito与单页面应用程序(Vue.js)集成

cognito在本文中,我们将研究使用OAuth协议通过Amazon Cognito对单页应用程序(使用Vue.js构建)进行身份验证。 在上一篇文章中,我们将服务器端应用程序与Amazon Cognito集成在一起。 搭建单页应用程序 我们将使用vue-cli创建一个空…

段描述符表(GDT+LDT)的有感

【0】写在前面 要知道,在汇编中,代码的装入顺序决定了在内存中的地址位置。所有的代码或者数据都在硬盘上,当调试或者启动的时候,加载到内存;当需要对数据进行处理的时候,我们通过将数据从内存载入到regis…

地理信息系统概论_地理信息系统概论黄杏元第3版配套练习题库——才聪学习网...

黄杏元《地理信息系统概论》(第3版)配套题库【考研真题精选+章节题库】一、选择题1完整的GIS主要由四个部分构成,即计算机硬件系统、计算机软件系统、(  )和系统管理操作人员。[杭州师范大学2018年研]A.网络B.用户C.…

PO/BO/VO/DTO/POJO/DAO/DO

文章目录DO(Domain Object)DO(Data Object)POVOBODTOPOJODAOJavaBeanEJBEntity应用程序的分层设计MVC业务分层阿里开发手册关于POJO类的命名规范总结参考文章DO(Domain Object) Domain Object,…

openshift_OpenShift Origin中的Kubernetes Spark运算符(第1部分)

openshift本系列有关Radanalytics.io的Kubernetes Spark运算符 OpenShift起源 。 它是一个开源的运营商来管理 Apache Spark集群和应用程序。 为了在OpenShift Origin上部署操作员,第一次需要为其克隆GitHub存储库: git clone https://github.com/rad…

小程序二级页面tabbar_小程序页面推广踩坑记

前几天,团队里有个小伙伴遇到一个问题,卡壳了大半天。我觉得这个例子值得拿出来分享给大家。希望大家以后遇到类似的问题能顺利绕过这种坑。业务场景很常见,就是为了配合小程序中特定页面的推广,区分推广渠道和人员,逐…

转移指令jmp和跳转指令call

【-1】写在前面 以下内容文字描述来自于 王爽老师的《汇编语言》教材,建议大家都买一本,哈哈。不是我打广告,确实人家写的好,应该支持。我只是附上了自己的图片和理解而已。 【0】先上干货 只修改ip,称为段内转移&a…

jmeter负载测试测试_使用Apache JMeter负载测试Web应用程序

jmeter负载测试测试Apache JMeter是用于模拟Web应用程序上的用户负载以测试性能的出色工具。 您可以通过指定用户数量和请求间隔来轻松地构建测试计划,然后JMeter将为每个用户生成一个线程并访问您的Web应用程序。 在测试结束时,您将获得一份性能摘要报告…

Windows下安装Nutch

Nutch安装 一、需求部份 a) Nutch是Java开发的所以需要下载Java JDK 下载地址http://java.sun.com/javase/downloads/index.jsp b) Nutch的演示搜索页面是Jsp的需要Tomcat做服务器 下载地址:http://jakarta.apache.org/tomcat/ c) Nutch的脚本都是用Linux的Shell写的…

python子进程关闭fd_gpg –passphrase-fd无法使用python 3子进程

以下脚本encrypt_me.py(modified from another post)使用gpg加密自身并以装甲形式打印出密文.但它只适用于python2.7但不适用于python3?你知道它在python3上运行时有什么问题吗?import subprocessimport shleximport osimport sysin_fd, out_fd os.pipe…

程序编码(机器级代码+汇编代码+C代码+反汇编)

【-1】相关声明 本文总结于csapp; 了解详情,或有兴趣,建议看原版书籍;【0】程序编码 GCC调用了一系列程序,将源代码转化成可执行代码的流程如下: (1)C预处理器扩展源代码&#xf…

angular1.2.27_Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

angular1.2.27“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 如果您已经成为Java开发人员超过15年,那么您可能还记得何时…

ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发

在知乎上看过不少大牛写的自动驾驶技术介绍文章,大多谈到的是AI, Deep Learning, Computer Vision等等感知(Perception)层面的。但在各个传感器(雷达、摄像头、激光雷达等)探测到目标信息及周围环境后,车辆该如何做出反应?自动驾驶的大脑该怎…

MyEclipse详细使用教程

第一部分MyEclipse的基本使用 一.提示:MyEclipse的透视图按钮:可以切换不同的透视图(位于右上角) 1.建立一个工程 ----File—new—project—选项含有Javaproject,webproject等等—输入工程名字如myproject&…

控制语句(if-else+循环+switch)汇编规则

【1】说说条件码 最常用的的条件码有: CF:进位标志 (无符号溢出)ZF:零标志SF:符号标志(结果为负数)OF:溢出标志 (补码溢出, 有符号溢出&#xf…

zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?

zxing qr区域判断在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像。 QR码生成 下面的代码使用Zxing库创建一个表示QR Code的java.awt.image.BufferedImage对象: public static BufferedImage getQRCode(String …

审批流_怎样让审批工作流和应用数据分离?

在企业行政管理中,审批是最常遇到的场景。传统管理中,人们会有纸张审批,而现在市场上已有大量的线上审批软件,他们帮助企业完成审批电子化,审批速度更快,信息也能留档。然而大部分审批软件都不够灵活&#…

java 反射api_反射是最重要的Java API

java 反射api前几天我在想-这是最重要的Java API。 哪种SE和EE API可以使大多数Java生态系统成为可能,而哪些API不能重新创建为第三方库。 正如您可能已经猜到标题一样,我认为它是Reflection API 。 是的,它不可避免地是每个项目的直接或间接…