【汇编】CPU——CPU组成、寄存器、通用寄存器、段寄存器字在寄存器中的存储、MOV,ADD,16位结构CPU,物理地址的组成、CS:IP的作用,代码段、DEBUG基本指令操作

第二章 CPU

CPU概述

一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
内部总线;内部总线实现CPU内部各个期间之间的联系。
外部总线:外部总线实现CPU和主板上其他器件之间的联系

寄存器概述

在这里插入图片描述

2.1 通用寄存器

AX,BX,CX,DX通常用来存放一半性的数据被称为通用寄存器。
在这里插入图片描述
16位的寄存器可以存放一个16位的数据。
在这里插入图片描述
例:
在这里插入图片描述
AX的低8位0-7位构成了AL寄存器高8位8-15位构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器,且单独在AL或AH运行的运算不进行进位
在这里插入图片描述
在这里插入图片描述

2.2 字在寄存器中的存储

1字=2字节=2B=2内存单元
而高低位寄存器ALAH组合出来的AX正好为一个字的数据。

2.3 简单汇编指令(MOV,ADD)

在这里插入图片描述

在这里插入图片描述

练习

那下面这个最后一步应该是多少呢?0158H吗?
但其实并不是这样,上面说过,因为单独看为一个al寄存器,所以不向上进位,为0058H
在这里插入图片描述
但这里的丢失并不是真的丢弃这个进位值,只是表示其不能在八位寄存器中保存,会存储在别的地方,在后面会有谈论。

2.4 物理地址

在这里插入图片描述

2.5 16位结构的CPU

特征:

  1. 运算器一次最多可以处理16位的数据。
  2. 寄存器的最大宽度为16位。
  3. 寄存器与运算器之间的通路是16位的。

8086有20位地址总线,可以传送20位地址,寻址能力为2^20B=1MB
但8086内部为16位的结构,只能传送16位地址,寻址能力只有64K。

问题:那么如何用16位数据转换成20位地址呢?

可以使用两个16位的地址合成一个20位物理地址。
CPU中提供两个相关部件分别提供两个16位地址,一个称为段地址,另一个称为偏移地址
具体实现就是将段地址*16,也就是左移一位与偏移地址进行相加。

通过地址加法器对段地址和偏移地址进行相加。
在这里插入图片描述
地址加法器合成物理地址方法(极其重要):
物理地址=段地址16+偏移地址
因为是16进制,所以
16等于左移一位。1230*16=12300。

在这里插入图片描述
在这里插入图片描述

2.7 段地址*16+偏移地址=物理地址

这一个实际意义其实相当于我们只能通过纸条来通信,来告诉CPU要执行命令的所在地址,我们需要四位数据的纸条来传播信息,但不巧只有三位数据的纸条,那么我们只能通过用两张三位数的方法来告诉CPU相应的地址了,三位数的第一个条数据进行左移再相加,就达成了和四位数据纸条一样的效果。
在这里插入图片描述
在这里插入图片描述

2.8 段的概念

实际上内存并没有被划分为段,段的划分是由CPU来划分的,通过段地址16+偏移地址=物理地址的方式来给出物理地址,使得我们可以用分段的方式管理内存。
通过段地址
16定位起始地址,用偏移地址定位内存单元。
偏移地址为16位,16位地址寻址能力为64KB,所以一个段的最大长度也为64KB。

在这里插入图片描述

两个问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.9 段寄存器

段寄存器就是提供段地址的。
8086CPU有四个段寄存器:CS,DS,SS,ES,其具体作用和区别在后面会详解。
当CPU要访问内存是,由这四个段寄存器来提供内存单元的段地址。

2.10 CS:IP

CS是代码段寄存器,IP为指令指针寄存器
他们指示了CPU下一步要执行命令的地址在什么地方。
执行命令的流程:
在这里插入图片描述
在这里插入图片描述
CS,IP中的内容分别当成指令的段地址偏移地址

2.11 修改CS、IP的指令

语法:JMP 段地址:偏移地址 即 JMP CS:IP

要修改IP的值,可以先mov ax,数值,然后jmp ax,利用寄存器中的值来修改IP,这种方法只修改IP不修改CS。
在这里插入图片描述

例题

先别看答案,写一下CPU正常运行的顺序流程。
在这里插入图片描述
正确执行顺序:
mov ax,6622H
Jmp 1000:3
Mov ax,0000
Mov bx,ax
Jmp bx
Mov ax,0123H

2.12 代码段

在这里插入图片描述

在这里插入图片描述

问题:如何使代码段中的指令执行呢?

CPU只认被CS:IP指向的内存单元中的内容为指令。
所以要将CS:IP指向第一条指令的首地址

在这里插入图片描述
在这里插入图片描述

2.13 DEBUG模式(重要)

debug可以用WIN+R输入debug使用debug模式。或者使用doxbox小型虚拟机来进行练习。
在这里插入图片描述

实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
无法进行修改是因为,这部分是直接写在主板BIOS中ROM存储器的,相当于只读存储,无法进行修改。
底下两行代码这是修改了显存地址空间中的数据,所以在显示器上进行了显示。
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将 AX 寄存器的数据转换为十进制数并输出到屏幕上,可以使用类似于前面提到的 itoa 函数的方法,将 AX 寄存器的数据保存到变量,然后将变量转换为符串并输出。以下是一个简单的例子: ``` section .data output_msg db '输出的数为: ' number db '0000' ; 四个数符串形式,初始值为 0 section .text global _start _start: ; 将 AX 寄存器的数据保存到变量 mov bx, ax mov ecx, number call itoa ; 输出 "输出的数为: " 提示信息 mov edx, output_msg mov eax, 4 mov ebx, 1 int 0x80 ; 输出数 mov edx, number mov eax, 4 mov ebx, 1 int 0x80 ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80 ; 将整数转换为符串 ; 输入:ax - 整数,ebx - 基数,ecx - 存储符串的地址 ; 输出:ecx - 存储转换后的符串的地址 itoa: push edx push esi push edi mov esi, ecx ; esi 指向符串的起始地址 mov edi, ecx ; edi 指向符串的末尾 cmp ax, 0 ; 处理特殊情况:输入为 0 jne .not_zero mov byte [edi], '0' jmp .finish .not_zero: cmp ax, 0 jl .negative ; 处理负数 .positive: xor edx, edx ; edx 用于保存余数 div ebx ; ax = ax / ebx,dx = ax % ebx add dl, '0' ; 将余数转换为 ASCII 码 mov byte [edi], dl ; 将 ASCII 码保存到符串 dec edi ; edi 指向下一个符 cmp ax, 0 jne .positive jmp .finish .negative: mov byte [esi], '-' inc esi ; esi 指向下一个符 neg ax ; 取反 jmp .positive .finish: pop edi pop esi pop edx ret ``` 以上代码通过调用 itoa 函数将 AX 寄存器的数据转换为符串,并通过系统调用将其输出到屏幕上。如果要输出不同的数据,只需要将数据保存到 AX 寄存器即可。值得注意的是,这里将符串初始值设为 '0000',是为了保证输出的数始终为四个符,如果需要输出不同长度的数,需要相应地修改符串的初始值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webfker from 0 to 1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值