汇编语言之寄存器详解

 更新时间:2020年01月14日 00:05:58   作者:ivy_0709   我要评论
这篇文章主要介绍了汇编语言之寄存器详解,需要的朋友可以参考下

上图是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指示)

《汇编语言》

相关文章

  • 汇编环境搭建之如何快速安装和配置DOSBox

    汇编环境搭建之如何快速安装和配置DOSBox

    这篇文章主要介绍了汇编环境搭建之如何快速安装和配置DOSBox,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令

    详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令

    这篇文章主要介绍了汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 汇编语言 and和or逻辑运算指令的实现

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

    这篇文章主要介绍了汇编语言 and,or逻辑运算指令的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法

    iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法

    在Xcode中嵌入汇编代码主要依赖了C语言支持通过 __asm__ 引入汇编代码的功能。这篇文章主要介绍了iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法,需要的朋友可以参考下
    2020-02-02
  • 8086汇编语言nasm版本

    8086汇编语言nasm版本

    这篇文章主要介绍了8086汇编语言nasm版本,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 汇编语言 寄存器内存访问原理解析

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

    这篇文章主要介绍了汇编语言 寄存器内存访问原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 浅析shellcode 反汇编模拟运行及调试方法

    浅析shellcode 反汇编模拟运行及调试方法

    这篇文章主要介绍了shellcode 反汇编,模拟运行以及调试方法,本文给大介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 常用的汇编指令与技巧(收藏)

    常用的汇编指令与技巧(收藏)

    这篇文章主要介绍了常用的汇编指令与技巧,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 汇编 JMP使用详解

    汇编 JMP使用详解

    这篇文章主要介绍了汇编 JMP使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 什么是汇编语言

    什么是汇编语言

    汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言
    2020-01-01

最新评论