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

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

在内存中字的存储

这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读)

问题:

(1)0地址单元中存放的字节型数据是多少?  # 20H

(2)0地址字单元中存放的字型数据是多少?  # 4e20H

(3)2地址字单元中存放的字节型数据是多少? # 12H

(4)2地址单元中存放的字型数据是多少?   # 0012H

(5)1地址字单元中存放的字型数据是多少?  # 12aEH

结论:就是我上面说的,字型数据就是它和它的下一位地址单元的数据(数据由高地址位向低地址位读)

数据段寄存器DS和偏移量[address]

用法和cs和ip差不多,都是段寄存器的值*16+偏移量的值

为给DS数据段寄存器值

因为CPU的段寄存器都比较害羞,没法给他们直接赋值(cs代码寄存器用的是jmp cs:ip),所以段寄存器采用以下方法赋值

字的传送

问题1:

内存中的情况如下图,写出下面指令执行后寄存器ax,bx,cx中的值?

解析:

问题2:

内存中的情况如下图,写出下面指令执行后寄存器ax,bx,cx中的值?

解析:

NB的move指令

sub,add指令

数据段

我们上面操作的实际上就是数据段,具体来看下是怎样操作数据段的

累加123B0H~123BAH的内存单元的操作

小结:

(1)字在内存中存储时 ,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放再高地址单元中。

(2)用 mov 指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。

(3)[address]表示一个偏移地址为address的内存单元。

(4)在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。

(5)mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

(2) 内存中的情况如图3.6所示

各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;

① 写出CPU执行的指令序列(用汇编指令写出)。

② 写出CPU执行每条指令后,CS、IP和相关寄存器的数值。

③ 再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

答案:我以为jmp了以后cp的值也会改变,实际上就是它jmp的内个CP:IP


指令序列


CS


IP


DS


AX


BX


初始值


2000h


0


0


0


0


1


mov ax,6622h


2000h


3h


0


6622h


0


2


jmp 0ff0:0100


ff0h


100h


0


6622h


0


3


mov ax,2000h


ff0h


103h


0


2000h


0


4


mov ds,ax


ff0h


105h


2000h


2000h


0


5


mov ax,[8]


ff0h


108h


2000h


c389h


0


6


mov ax,[2]


ff0h


10bh


2000h


ea66h


0

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

(0)

相关推荐

  • 详解汇编语言MOV指令

    在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的). 32位指令集 1.一般传送指令 MOV指令: 格式: MOV目的-->除CS.IP以外的寄存器或存储器 源-->寄存器.存储器.立即数 ex : MOV  ECX ,EDX ;   EDX->ECX ECX =00000034H EDX =00000052H 指令执行结果: ECX = 00000052H, EDX不变,标志寄存器也不变. MOVSX

  • 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) 专用寄存器 标号

  • 汇编语言入门教程(这一篇足矣)

    汇编语言是一种最低级.最古老.不具有移植性的编程语言,它能够直接访问计算机硬件,所以执行效率极高,占用资源极少,一般用于嵌入式设备.驱动程序.实时应用.核心算法等. 汇编语言的缺点是开发周期特别长,实现一个简单的功能都非常麻烦,已经很少用来编写应用程序了. 1 本讲座以汇编初学者或对汇编一点也不了解的读者为对象,汇编高手不属于该范围,但强烈建议高手指导并增补.修改本文. 2 任何读者可以跟此贴,提出疑问,或解答其中的问题,但对于所有跟贴,水贴.内容有错.毫不相干贴将直接删除,有意义的贴可能会合并

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

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

  • 汇编语言mov指令及基本用法

    在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的).其特点是不破坏源地址单元的内容. 例如: MOV AX,2000H:将16位数据2000H传送到AX寄存器 MOV AL,20H:将8位数据20H传送到AL寄存器 MOV AX,BX:将BX寄存器的16位数据传送到AX寄存器 MOV AL,[2000H]:将2000H单元的内容传送到AL寄存器 需要注意的是: (1)两个存储单元之间不能直接传送数据,即:MOV

  • 汇编语言AND指令实现对两个操作数进行逻辑(按位)与操作

    AND 指令在两个操作数的对应位之间进行(按位)逻辑与(AND)操作,并将结果存放在目标操作数中: AND destination,source 下列是被允许的操作数组合,但是立即操作数不能超过 32 位: AND reg, reg AND reg, mem AND reg, imm AND mem, reg AND mem, imm 操作数可以是 8 位.16 位.32 位和 64 位,但是两个操作数必须是同样大小.两个操作数的每一对对应位都遵循如下操作原则:如果两个位都是 1,则结果位等于

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

    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位数据的取存,不会影

  • 汇编语言之寄存器详解

    上图是cpu中三个组成部分:寄存器 运算器 控制器.其中寄存器是cpu中程序员用指令读取的唯一部件(调剂界面中的 寄存器窗口).如果是16位cpu,就是处理,传输,暂时存储的数据长度都是16位.所以16位的cpu,寄存器也是16位.<汇编语言>这本书中使用的是16位寄存器位例子来讲的,所以下面的内容也都是16位寄存器的. ps:查看处理器型号以及几核cpu,我现在的电脑4核64位 寄存器名字 16位的寄存器有:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

  • 汇编语言位向量(位映射)的实现

    有些应用控制的对象是从一个有限全集中选出来的一组项目.就像公司里的雇员,或者气象监测站的环境读数.在这些情景中,二进制位可以代表集合成员. 与 Java HashSet 用指针或引用指向容器内对象不同,应用可以用位向量(或位映射)把一个二进制数中的位映射为数组中的对象. 如下例所示,二进制数的位从左边 0 号开始,到右边 31 号为止,该数表示了数组元素 0.1.2 和 31 是名为 SetX 的集合成员: SetX = 10000000 00000000 00000000 00000111 (

  • 详解汇编语言中中括号[]作用及lea和mov指令的区别

    汇编中中括号[]作用及lea和mov指令的区别 现在总结一下:其中牵扯到lea指令,mov指令,[] 一.lea指令: 对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如: mov eax,2 lea ebx,[eax];执行后ebx=2 mov ebx,eax;等同于上句 lea ebx,eax;编译器报错: error A2070: invalid instruction operands 对于变量来说加不加[]都是一样的效果,都是取变量的地址,相

随机推荐