汇编语言存储及寄存器原理解析

这篇文章主要介绍了汇编语言存储及寄存器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

字的存储

一个16位寄存器可以存放一个字(16位)或者一个字节(8位),当存放一个字节的时候只需要一个内存单元(内存单元是以字节为单位的,8位),而存放一个字需要两个内存单元,这样存放一个字就需要两个连续的内存单元,这个16位的字,高位存放在高地址,低位存放在低地址。

内存地址 内存数据
0 20H
1 4EH
2 12H
3 00H

对于字来说0就是低地址单元,1是高地址单元,则字型数据4E20H的低地址位20存放在0号单元,高地址位4E存放在高地址单元,因为它的起始地址为0,又可以称作0地址字单元。

段地址寄存器

通过前面学过的知识我们可以知道当CPU想要对一个内存单元进行操作时,必须知道它的地址,要知道内存单元的地址就要知道它的段地址和偏移地址,在8086 CPU中,DS寄存器就是用来存放段地址的,执行指令的时候,CPU会自动读取DS中的数据为内存单元的段地址,使用[偏移地址]来表示偏移地址,假设DS寄存器中此时存放的是1000H,那么mov al,[0]就表示将10000H(物理地址=段地址x16+偏移地址)地址上存放的数据存到al中。

如果想要修改DS寄存器中的值,那么直接使用mov指令将数字存到DS寄存器中是不行的,只能先将值存到一个寄存器中,再使用mov指令将这个寄存器中的值存到DS中,例:

mov bx,1000H
mov ds,bx
mov ax,[0]

这样就将地址为10000H处的值存放到ax寄存器中了,也就是将下表中的4E20H存放到ax中。(ax是十六位,一个字,两个字节)

内存地址 内存数据
0 20H
1 4EH
2 12H
3 00H

所以一个内存单元地址的确定可以通过段地址DS+[偏移地址]进行确定。

add和sub指令

顾名思义,add指令就是用来做加法操作的,sub指令就是用来做减法操作的,例如add ax,8这条指令相当于C语言中的ax = ax + 8,sub ax,8相当于C语言中的ax = ax - 8。
add和sub指令可以操作的对象有以下几种形式,以add指令为例:

add 寄存器,数据    例如:add ax,8
add 寄存器,寄存器   例如:add ax,bx
add 寄存器,内存单元    例如:add ax,[0]
add 内存单元,寄存器    例如:add [0],ax


栈,是一段具有特殊访问方式的存储空间,它的存取规则是先进后出,后进先出,就像是一个上面没有盖的桶,最后放进去的东西只能最先取出来。

那么我们怎么知道在连续的存储空间中,哪一段是栈,哪一段不是栈,回想一下,CPU是根据CS、IP两个寄存器中存放的值判断当前指令存放的位置,根据DS、偏移地址判断数据存放在哪个内存单元,显然,也会有相应的寄存器用来判断哪一段是栈,在8086 CPU中,通过段寄存器SS和寄存器SP就可以确定栈的位置,栈有栈顶和栈底,栈顶的段地址存放在SS中,SP用于存放偏移地址,在任意时刻SS:SP指向栈顶元素,它指向的第一个元素可以理解为栈底,以后每存放一个数据SS:SP就向上提升,而它所指向的就是栈顶。

PUSH和POP指令

有了栈,那么就可以对栈进行存取数据的操作,使用的指令时push和pop指令,push指令用于入栈操作,也就是存数据,pop指令用于出栈,也就是取数据。8086 CPU的入栈、出栈操作都是以字为单位。
假设有如下一段连续的内存单元,此时SS为1000H,SP为000EH,AX为1234H,栈顶为1000EH。

内存地址 数据
1000AH
1000BH
1000CH
1000DH
1000EH
1000FH

首先,因为SS为1000H,SP为000EH,所以栈顶是指向1000EH位置的:
SS为1000H,SP为000EH,AX为1234H

内存地址 数据
1000AH
1000BH
1000CH
1000DH
1000EH [SS:SP]
1000FH

接着我们执行入栈操作,将AX(1234H)入栈,使用push ax操作进行压栈。
SS为1000H,SP为000CH,AX为1234H

内存地址 数据
1000AH
1000BH
1000CH 34[SS:SP]
1000DH 12
1000EH
1000FH

此时,新的栈顶就变成了1000CH,接着,我们再将一个立即数5678H压入栈中,使用push 5678:
SS为1000H,SP为000AH,AX为1234H。

内存地址 数据
1000AH 78[SS:SP]
1000BH 56
1000CH 34
1000DH 12
1000EH
1000FH

这是,栈顶就是1000AH,SS为1000H,SP为000AH。
演示完了入栈,我们再进行出栈,使用pop ax操作,将出栈的数据放入到ax寄存器中:
SS为1000H,SP为000CH,AX为5678H。

内存地址 数据
1000AH 78
1000BH 56
1000CH 34[SS:SP]
1000DH 12
1000EH
1000FH

注意,出栈并不意味着之前写入内存单元的数据被删除了,之前写入的数据还是存在的,只不过它不在栈中了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作(推荐)

    汇编语言 汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植. XOR 指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作,并将结果存放在目标操作数中: XOR dest

  • 汇编语言之寄存器(详细介绍)

    1.寄存器 32位寄存器有16个,分别是: 4个数据寄存器(EAX.EBX.ECX.EDX). 2个变址和指针寄存器(ESI和EDI):2个指针寄存器(ESP和EBP). 6个段寄存器(ES.CS.SS.DS.FS.GS). 1个指令指针寄存器(EIP):1个标志寄存器(EFlags). 2.数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间. 32位CPU有4个32位通用寄存器:EAX.EBX.ECX和EDX.对低16位数据的取存,不会影

  • 汇编语言中mov和lea指令的区别详解

    指令(instruction)是一种语句,它在程序汇编编译时变得可执行.汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行. 一条指令有四个组成部分: 标号(可选) 指令助记符(必需) 操作数(通常是必需的) 注释(可选) 最近在学习汇编语言,过程中遇到很多问题,对此在以后的随笔会逐渐更新,这次谈谈mov,lea指令的区别   一,关于有没有加上[]的问题 1,对于mov指令来说: 有没有[]对于变量是无所谓的,其结果都是取值 如: num dw 2 mov bx,num mov

  • 汇编语言AAD,DAA,DAS用法解析

    这篇文章主要介绍了汇编语言AAD,DAA,DAS用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 AAD 为下面的除法做准备 ,把AL 和 AH 两个单BCD码组成一个十进制数 1.AAD(调整除) 5.2该指令是在作除法前用于调整寄存器AH和AL之值,它是把二个寄存器中单BCD码组成一个十进制数值,其调整规则如下: AL←AH*10+AL,AH←0 受影响的标志位:PF.SF和ZF(AF.CF和OF等都是无定义) MOV AX, 050

  • 汇编语言lea指令使用方法解析

    这篇文章主要介绍了汇编语言lea指令使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 lea指令变种(按大小分类): leaw #2个字节 leal #4个字节 leaq #8个字节 lea的用法: leaq a(b, c, d), %rax 首先lea指令是mov指令的变种,据说,lea指令是x86体系结构中,是一条最古老但是从某个方面来讲又是最神奇的指令. 表面上看,它做的事情非常简单,根据括号里的源操作数来计算地址,然后把地址加

  • 汇编语言编译环境搭建过程

    1. 将masm615文件夹拷贝在C或D盘或其他(文件路径不要有中文文件夹) 2. 运行DOSBox(网上下载) 3. DOSBox软件中输入命令mount C C:\masm615(假设masm615安装在C盘),回车输入C: 4. 测试程序test1.asm DATA SEGMENT BUFFER DB "1 STYLE ONE ", 0DH, 0AH DB "2 STYLE TWO ", 0DH, 0AH DB "3 EXIT ", 0DH

  • 汇编语言 and和or逻辑运算指令的实现

    本文介绍了汇编语言 and,or逻辑运算指令的实现,分享给大家 assume cs:code code segment ; 逻辑运算 按照二进制位运算 start: mov ax,0 mov al, 00001111B and al, 11110000B ; 00000000B mov ax,0 mov al, 00001111B or al, 11110000B ; 11111111B mov ax,4c00H int 21H code ends end start 通过and,or逻辑运算指

  • 汇编语言学习心得

    汇编语言 汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植. CPU的组成 CPU是由运算器(信息处理).控制器(控制器件工作).寄存器(信息存储)等器件组成,他们之间通过总线相连

  • 16位汇编语言寄存器及指令整理(小结)

    寄存器 通用寄存器 8位寄存器 16位寄存器 32位寄存器 寄存器名称 AH,AL AX EAX 累加寄存器 BH,BL BX EBX 基地址寄存器 CH,CL CX ECX 计数器寄存器 DH,DL DX EDX 数据寄存器 SI ESI 源变址寄存器 DI EDI 源目标寄存器 DH,DL DX EDX 基地址寄存器 DH,DL DX EDX 栈顶寄存器 段寄存器 标号 名称 CS 代码段 DS 数据段 SS 栈段 ES 附加数据段 GS,FS 附加数据段(+80386) 专用寄存器 标号

  • 汇编语言存储及寄存器原理解析

    这篇文章主要介绍了汇编语言存储及寄存器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 字的存储 一个16位寄存器可以存放一个字(16位)或者一个字节(8位),当存放一个字节的时候只需要一个内存单元(内存单元是以字节为单位的,8位),而存放一个字需要两个内存单元,这样存放一个字就需要两个连续的内存单元,这个16位的字,高位存放在高地址,低位存放在低地址. 内存地址 内存数据 0 20H 1 4EH 2 12H 3 00H 对于字来说0就是

  • 汇编语言 寄存器内存访问原理解析

    这篇文章主要介绍了汇编语言 寄存器内存访问原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读) 问题: (1)0地址单元中存放的字节型数据是多少? # 20H (2)0地址字单元中存放的字型数据是多少? # 4e20H (3)2地址字单

  • ThreadLocal数据存储结构原理解析

    目录 一:简述 二:TheadLocal的原理分析 1.ThreadLocal的存储结构 2.源码分析 set()方法 三:源码分析 createMap() 源码: 流程图: expungeStaleEntry() cleanSomeSlots() rehash() resize() get()方法 getEntry() getEntryAfterMiss() remove() 四:总结 一:简述 我们很多时候为了实现数据在线程级别下的隔离,会使用到ThreadLocal,那么TheadLoca

  • Android截屏方案实现原理解析

    Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途 在截屏功能中,有时需要截取全屏的内容,有时需要截取超过一屏的内容(比如:Listview,Scrollview,RecyclerView).下面介绍各种场景获取Bitmap的方法 普通截屏的实现 获取当前Window的DrawingCache的方式,即decorView的DrawingCache /** * shot the current screen ,with the sta

  • 玩转Koa之koa-router原理解析

    一.前言 Koa为了保持自身的简洁,并没有捆绑中间件.但是在实际的开发中,我们需要和形形色色的中间件打交道,本文将要分析的是经常用到的路由中间件 -- koa-router. 如果你对Koa的原理还不了解的话,可以先查看Koa原理解析. 二.koa-router概述 koa-router的源码只有两个文件:router.js和layer.js,分别对应Router对象和Layer对象. Layer对象是对单个路由的管理,其中包含的信息有路由路径(path).路由请求方法(method)和路由执行

  • SpringCloud配置刷新原理解析

    我们知道在SpringCloud中,当配置变更时,我们通过访问http://xxxx/refresh,可以在不启动服务的情况下获取最新的配置,那么它是如何做到的呢,当我们更改数据库配置并刷新后,如何能获取最新的数据源对象呢?下面我们看SpringCloud如何做到的. 一.环境变化 1.1.关于ContextRefresher 当我们访问/refresh时,会被RefreshEndpoint类所处理.我们来看源代码: /* * Copyright 2013-2014 the original a

  • 使用Python检测文章抄袭及去重算法原理解析

    在互联网出现之前,"抄"很不方便,一是"源"少,而是发布渠道少:而在互联网出现之后,"抄"变得很简单,铺天盖地的"源"源源不断,发布渠道也数不胜数,博客论坛甚至是自建网站,而爬虫还可以让"抄"完全自动化不费劲.这就导致了互联网上的"文章"重复性很高.这里的"文章"只新闻.博客等文字占据绝大部分内容的网页. 中文新闻网站的"转载"(其实就是抄)现象非

  • 微信公众号被动消息回复原理解析

    背景:某分厂需要实时查询工件堆放的位置,要求快速便捷,因此设计了采用微信公众号被动回复信息的方案. 技术实现:开发者服务器--基于Angular2框架的已发布网站,编程语言为Python,后台存储数据库为Mysql: 微信服务器--微信公众号,此业务只是处理微信客户端发送的文本信息,且不使用公众号的其他功能,因此不需要认证公众号: 微信客户端--关注公众号的微信使用者,即粉丝. 当粉丝给公众号发送特定的消息时,微信公众号自动回复相应内容,而其背后的实现原理可由下图所示: 由上图可知,粉丝(微信客

  • Java实现顺序栈原理解析

    这篇文章主要介绍了Java实现顺序栈原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 什么是栈 1.栈的英文是stack 2.栈是一个先入后出的有序列表 3.栈是限制线性表元素的插入和删除只能在线性表的同一端进行的一种特殊的线性表,允许插入和删除的一端是,为变化的一端,成为栈顶,另外的一端为固定的一端为栈底 4.栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除的情况刚好相反,最后放入的元素先删除,最先放入的元素后删除

  • Java时区转换及Date类实现原理解析

    这篇文章主要介绍了Java时区转换及Date类实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.时区的说明 地球表面按经线从东到西,被划成一个个区域,规定相邻区域的时间相差1小时.在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时.当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时 ,所以同一时刻在不同时区表示的时间是不一样的. 二.时间的表示 我们平时表示时间时通

随机推荐