汇编语言之寄存器详解

上图是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。

32位寄存器就是前面加个E,64位前面加个R。

vs中解决方案平台选择x86——32位寄存器,可以存数32位二进制数据

vs中解决方案平台选择x64——64位

各种类型的寄存器

在下面介绍各个寄存器的时候,都用16位的寄存器作为介绍。同种类型的32位和64位寄存器功能一样,只是处理的数据宽度更大了。同时介绍一些汇编指令(汇编指令不区分大小写)。

1.通用寄存器——AX BX CX DX

作用:存放一般性的数据

传送指令:move

mov 转移指令,大部分的寄存器都可以用这个指令来改变其值。常用的有:不仅限于下面几种

1.move 某一个合法寄存器 某一个合法寄存器

将一个寄存器的内容传送到另一个寄存器

比如:move 段寄存器(ds,cs),通用寄存器——段寄存器的值不能直接通过数据来设定

2.move 某一个合法寄存器 数据

将数据直接传入寄存器

3.move 某一个合法寄存器 [内存单元的偏移地址]

将一个内存单元中的内容存入一个寄存器中,后面将DS寄存器的时候再讲。

算术运算指令:add,sub

add 寄存器,数据/寄存器/内存单元

add 内存单元,寄存器

如何记住一个二进制数据左移1位相当于乘以2,左移n位,相当于乘以2的N倍:

一个10进制的数左移1位,相当于乘以10,左移n位,相当于乘以10的N倍。

2.CS,IP——代码段

CS(code)

IP(instruction pointer)

是最关键的两个寄存器,代码段寄存器和指令指针寄存器 ,他们的内容提供了cpu要执行指令的地址。

而cpu就是一直重复读指令,执行指令的过程。cpu就认这个指向的地址为指令,然后进行执行指令,所以把 代码段的起始地址设置成cs:ip,让程序开始执行。

1:从cs:ip(段地址的方式)指向的内存单元中读取指令,读进来以后进入指令缓存器

2:ip = ip + 所读指令的长度,从而指向下一条指令

3:执行指令

4:回到第一步

疑问:

1. 怎么知道指令的长度的

2.什么时候修改cs 和 ip 的值的 (下面介绍)

最简单的转移指令——jmp

用来改变cs和ip的值的指令,CS*16 + IP 指向的内容被当作指令来执行

jmp 某一个合法寄存器——改变IP的值

用这个寄存器的值改变IP寄存器的值,含义上[ mov IP寄存器,某一合法寄存 ] ,只不是mov不能用于IP寄存器。

jmp 段地址:偏移地址——同时修改CS的值,和IP的值

含义上,[ mov CS 段地址 ,move IP 偏移地址 ]

8080 8085 8位机、 8086 16位机。8086的cpu16位,地址总线20位,给物理地址的方式(20位) = 段地址(16位)*16(左移4位) + 段内偏移(16位,段最大长度是2^16 = 64k))

32位cpu 也可以开启36位地址模式,所以也可以用用 36位物理寻址方式=段地址(32位)*16(左移四位) +段内偏移(32位,段最大长度是2^32 =4G)

所以一个段的其实地址一定是16的倍数(16进制表示,最后一位肯定是0)

所以看map文件中的地址 也是 使用的段+段内偏移,只不是那个段是指的是段号。

3.DS——数据段

DS(data)

存放要访问的数据的段地址,再通过加上偏移地址,把数据所在的内存地址赋值上。

通过move指令进行设置其值,先把其值赋值给一般寄存器,再通过一般计算器传送给DS

move bx,1000H

move ds,bx

move al,[0]————访问到了ds:0所指的内存单元了

4.SS,SP——栈空间(高地址往低地址增长)

SS(stack) SP(instruction pointer)

任意时刻,ss:sp指向栈顶元素的内存地址。

cpu不保证对栈的操作不超过空间

cpu只知道栈顶在何处(ss:sp),而不知道栈空间大小

就像cpu只知道当前要执行的指令在何处(cs:ip),而不知道要执行的指令有多少

程序定义了栈段以后,把ss:sp指向我们定义的栈端就可以了

入栈出栈指令 Push 和 Pop 指令

ss:sp指向的内存单元处的数据取出,sp = sp + 2

或者

往 ss:sp指向的内存单元处 存入数据,sp = sp - 2

push/pop 寄存器/段寄存器/[内存单元的偏移地址](段地址由ds指示)

《汇编语言》

(0)

相关推荐

  • 汇编语言之寄存器详解

    上图是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

  • 汇编语言入门汇编指令及寄存器详解教程

    目录 前言 什么是汇编语言 汇编语言产生的原因 汇编与二进制的关系 寄存器 寄存器作用 存取速度比较 寄存器分类 常用寄存器用途 寄存器EAX.AX.AH.AL的关系 汇编语言指令 数据传送指令 算术运算指令 逻辑运算指令 循环控制指令 转移指令 linux 和 windows 下汇编的区别 总结 前言 我们大都是被高级语言惯坏了的一代,源源不断的新特性正在逐步添加到各类高级语言之中,汇编作为最接近机器指令的低级语言,已经很少被直接拿来写程序了,不过我还真的遇到了一个,那是之前的一个同事,因为在

  • 汇编语言Debug命令详解教程

    目录 1. Debug-R命令 2. Debug-D命令 3. Debug-E命令 4. Debug-U命令 5. Debug-T命令 6. Debug-A命令 参考书籍<汇编语言>--王爽 Debug的命令比较多,这里我介绍常用的命令,其余的等需要的时候再进行查询. 命令 用途Debug-R查看.改变CPU寄存器的内容Debug-D查看内存中的内容Debug-E改写内存中的内容Debug-U将内存中的机器指令翻译成汇编指令Debug-T执行一条机器指令Debug-A以汇编指令的格式在内存中写

  • 图文详解通俗易懂的汇编语言寄存器

    目录 认识寄存器 计算机架构中的寄存器 通用寄存器 AX 寄存器 BX 寄存器 CX 寄存器 DX 寄存器 索引寄存器 状态和控制寄存器 物理地址 什么是段 段寄存器 CS 寄存器 什么是 Code Segment DS 寄存器 栈 栈和 SS 寄存器 栈顶越界问题 我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 下面我们就来介绍一下关于寄存器的相关内容.我们知道,寄存器是 CPU 内部的构造,它

  • 汇编语言实现电子闹钟思路详解

    2.1 设计思路 首先使用8255.8254.8259 三个芯片实现电子时钟的功能,让闹钟可以正常走时:其次,在时钟的基础上添加闹铃功能.整点报时功能.设置当前时间功能:完成设计. 2.2 设计方案 1. 电子时钟部分:此次设计是通过对计数器8254设定计数值对脉冲进行计数,在程序里,8254工作于计数器0,方式3.接入的CLK为1MHz,设计数初值为10000,每100次中断计数一次,产生的记数时间正好是时钟每秒走过的时间.通过对中断控制器8259设置初始化命令字初值来控制中断.程序中通过移位

  • 详解汇编语言各种指令的解释与用法

    [数据传输指令] 一.通用数据传送指令 1.传送指令MOV(move) 指令的汇编格式:MOV DST,SRC 指令的基本功能:(DST)<-(SRC) 将原操作数(字节或字)传送到目的地址.指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令.指令的执行对标志位的影响:不影响标志位.指令的特殊要求:目的操作数DST和源操作数SRC不允许同时为段寄存器:目的操作数DST不能是CS,也不能用立即数方式. 2.进栈指令 PUSH(push onto the sta

  • 汇编语言指令mov、add、sub、jmp详解

    指令(instruction)是一种语句,它在程序汇编编译时变得可执行.汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行. 一条指令有四个组成部分: 标号(可选) 指令助记符(必需) 操作数(通常是必需的) 注释(可选) 不同部分的位置安排如下所示: [label: ] mnemonic [operands] [;comment] 现在分别了解每个部分,先从标号字段开始. mov传送指令mov a,b 将b数据放进a mov:寄存器,数据 mov:寄存器,寄存器 mov:寄存器

  • C语言如何与ARM汇编语言混合编程示例详解

    目录 一.ARM汇编语言简介 二.C语言调用汇编语言 1.无参数调用 2.有参数调用 三.汇编语言调用C语言 四.总结 五.参考文献 主要使用软件:keiL μVision5 一.ARM汇编语言简介 什么是汇编语言?汇编语言是任何一种适用于电子计算机.微处理器或其他可编程器件的低级语言.虽然被称为"低级语言",但是并不是说汇编语言真的"低级".特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植.汇编语言主要包括传送指令.逻辑运算.移位指令.位

  • 汇编语言学习assume的作用详解

    assume 的作用是关联段名与段寄存器. 如果你在数据段中定义了变量名,比如: x db 0 而你在代码中,需要直接使用这个变量名,比如: mov al, x 那么,汇编程序在汇编时,就会报告错误. 因为,mov指令中遇到 x 这个变量名时,汇编程序不知道它要用哪个段寄存器作为段地址. 所以: 若要用变量名直接访问,或使用语句标号(比如你例子中的标号 start)就必须要在assume伪指令中将这些变量或标号所在段的段名,与段寄存器名关联,否则会出错. 如果你不使用段中的变量名,可以不关联这个

  • 汇编语言80x86系统通用数据传送指令详解

    目录 通用数据传送指令 附上UML Markdown代码: 通用数据传送指令 MOV move 传送 MOVSX move with sign-extend 带符号扩展传送 MOVZX move with zero-extend 带零扩展传送 PUSH push onto the stack 进栈 POP pop from the stack 出栈 PUSHA/PUSHAD push all registers 所有寄存器进栈 POPA/POPAD pop all registers 所有寄存器

随机推荐