程序员的代码最终的实现就是对寄存器和内存进行一些操作,知道CPU中各个寄存器的作用,能够对代码有更深刻的了解。

文章目录

  • CPU各个寄存器作用(8086):
    • CS,IP
    • bx,si,di,bp
    • ss,sp
    • CX:
    • div指令:
    • mul指令:
    • ax,bx,cx,dx总结:
    • cs,ip;ss,sp;ds,bx;es总结:
  • 转移指令
    • (1)offset:
    • (2)jmp:
      • 2-1 根据位移进行转移的jmp指令
      • 2-2 转移的目的地址在指令中的jmp指令
      • 2-3 转移地址在寄存器中的jmp指令
      • 2-4 转移地址在内存中的jmp指令
    • (3)jcxz指令:
    • (4)call和ret指令
      • 4-1 ret指令用栈中的数据,修改IP的内容,从而实现近转移;retf利用栈中的数据,修改CS和IP的内容,从而实现远转移。
      • 4-2 call指令,cpu执行call指令进行两步操作:
      • 4-3 call和ret的配合使用:两者配合实现子程序的机制
  • 标志寄存器:
    • adc指令
    • sbb指令
    • cmp指令
    • 检测比较结果的条件转移指令
    • 串传送指令
    • pushf和popf
    • rep stos

CPU各个寄存器作用(8086):

CS,IP

当前要读取指定的地址,**任意时刻CPU将CS:IP指向的内容当做指令执行。**在内存中,指令和数据没有任何区别,CPU如何区分指令和数据?CPU将CS:IP指向的内存单元的内容看做指令
CPU执行指令的过程:

bx,si,di,bp

可以用在[…]中来进行内存单元的寻址。在[]中这四个寄存器可以单个出现,或者组合:bx和si,bx和di,bp和si,bp和di
一般[]的段地址默认在ds中,但只要在[]中使用bp,指令中没有显性给出段地址,段地址默认在ss中。[]可以显示给出段地址如:es:[bx]。

ss,sp

push,pop指令执行时,CPU从SS和SP中得到栈顶的地址。(栈区低地址是栈顶,高地址是栈底)

push ax的执行由两步组成
(1)sp=sp-2
(2)将ax中的内容送入ss:sp指向的内存单元处,ss:sp此时指向新栈顶

CX:

CPU执行loop指令进行两步操作(1)cx=cx-1(2)判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。

div指令:

(1)除数:在一个reg或者内存单元中
(2)被除数:默认放在ax或dx和ax中,如果除数为8位,被除数则为16位,默认在ax中存放,如果除数为16位,被除数为32位,在dx和ax中存放,dx存高16位,ax存放低16位。
(3)结果:如果除数为8位,则al存储出发操作的商,ah存储除法操作的余数;如果除数为16位,则ax存储除法操作的商,dx存储除法操作的余数。

mul指令:

ax,bx,cx,dx总结:

ax,dx寄存器与div,mul指令相关默认存放被除数和一个乘数,以及最后存放结果;
bx与内存单元寻址有关可以在[…]中使用;
cx与循环和判断语句相关;

cs,ip;ss,sp;ds,bx;es总结:

cs存放指令的段地址,ip存放偏移地址;
ss存放栈的段地址,sp存放偏移地址;
ds存放内存空间的段地址,bx存放偏移地址,还有si,di可以存放偏移地址(也可以使用bp,但此时段地址默认在ss中)
es与串传送指令有关

转移指令

可以修改IP,或同时修改CS和IP的指令统称为转移指令。

(1)offset:

在汇编语言中是有编译器处理的符号,功能是取得标号的偏移地址。

(2)jmp:

无条件转移指令,可以只修改IP,也可以同时修改CS和IP。

2-1 根据位移进行转移的jmp指令


jmp short 标号(转到标号处执行指令)
这种格式的jmp指令实现的是段内短转移,它对IP的修改范围为-128~127



2-2 转移的目的地址在指令中的jmp指令

jmp far ptr 标号实现的是段间转移,又称为远转移,功能如下:cs=标号所在段的段地址;ip=标号在段中的偏移地址。

2-3 转移地址在寄存器中的jmp指令

2-4 转移地址在内存中的jmp指令



(3)jcxz指令:

为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127。
指令格式:jcxz 标号(cx=0时,转移到标号处执行。cx不等于0,什么也不做)
操作:当cx=0时。ip=ip+8位位移

(4)call和ret指令

4-1 ret指令用栈中的数据,修改IP的内容,从而实现近转移;retf利用栈中的数据,修改CS和IP的内容,从而实现远转移。

4-2 call指令,cpu执行call指令进行两步操作:

(1)将当前的IP或CS和IP压入栈中
(2)转移
根据位移进行转移的call指令:

根据目的地址进行转移的call指令

转移地址在寄存器中的call指令

4-3 call和ret的配合使用:两者配合实现子程序的机制



从上面的讨论我们发现,可以写一个子程序,在需要的时候,用call指令转去执行。当执行完子程序后,可以在子程序后面使用ret指令,利用栈中的数据设置IP的值,从而转到call指令后面的代码处继续执行。

标志寄存器:

一种特殊的寄存器,具有3种作用:


ZF标志:记录相关指令执行后,其结果是否为0,如果为0,zf=1,否则zf=0。
PF标志:记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,pf=1,如果为奇数,那么pf=0。
SF标志:记录相关指令执行后,其结果是否为负,如果为负,sf=1,否则sf=0。
CF标志:在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
OF标志:记录了有符号数运算的结果是否发生了溢出,如果发生溢出,of=1,否则of=0。
DF标志:在串处理指令中,控制每次操作后si、di的增减。df=0,每次操作后si、di递增;df=1,每次操作后si、di递减。

adc指令


adc指令可以对任意大的数据进行加法运算。

sbb指令


利用sbb指令可以对任意大的数据进行减法运算。

cmp指令

检测比较结果的条件转移指令

串传送指令



pushf和popf

rep stos

lea     edi,[ebp-0C0h]
mov     ecx,30h
mov     eax,0CCCCCCCCh
rep stos dword ptr es:[edi]

rep指令的目的是重复其上面的指令.ECX的值是重复的次数.
STOS指令的作用是将eax中的值拷贝到ES:EDI指向的地址

CPU各个寄存器作用相关推荐

  1. CPU中寄存器作用及说明

    各种计算机的CPU可能不同,但是在CPU中至少至少要有六类寄存器:①指令寄存器(IR):②程序计数器(PC):③数据地址寄存器(AR):④缓冲寄存器(DR):⑤通用寄存器(R0~R3);⑥状态字寄存器 ...

  2. CPU各寄存器的作用

    CPU各寄存器的作用 - [Asm] 寄存器作用:ebp和esp是32位的SP,BP esp是堆栈指针 ebp是基址指针 ESP与SP的关系就象AX与AL,AH的关系.32位CPU所含有的寄存器有:4 ...

  3. 计算机cpu、寄存器、内存区别

    1.寄存器是中央处理器内的组成部分.它跟CPU有关.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC). ...

  4. 飞腾CPU相关寄存器描述(持续更新)

    飞腾CPU相关寄存器描述(持续更新) SPSel堆栈寄存器选择寄存器 EL1/2/3都可以读写 32位长度. SP, bit[0], 控制堆栈寄存器的选择. 0-->CPU无论处于什么权限级,堆 ...

  5. x86 - CPU架构/寄存器详解 (三) 保护模式

    系列文章 x86 - CPU架构/寄存器详解 (一)x86.8086.i386.IA-32 是什么? x86 - CPU架构/寄存器详解 (二) 实模式(8086模式) x86 - CPU架构/寄存器 ...

  6. X86系列CPU标准寄存器

    title: X86系列CPU标准寄存器 tags: 计算机组成原理   版权声明:本文章参考了唐朔飞的< 计算机组成原理>未经作者允许,严禁用于商业出版,否则追究法律责任.网络转载请注明 ...

  7. CPU缓存有什么用?一文讲解CPU缓存的作用

    来源:电子工程专辑 由于CPU是核心硬件,相信我们在选择CPU的时候都会去关心CPU参数方面,而在CPU核心参数中,我们经常会看到缓存(Cache)这个参数,那么CPU缓存有什么用?下面科普一下关于C ...

  8. 超线程cpu的寄存器_一文总结 CPU 基本知识

    关于CPU和程序的执行 CPU是计算机的大脑. 1.程序的运行过程,实际上是程序涉及到的.未涉及到的一大堆的指令的执行过程. 当程序要执行的部分被装载到内存后,CPU要从内存中取出指令,然后指令解码( ...

  9. .detach().cpu().numpy()的作用

    out = model(inputs) ls.append(out.detach().cpu().numpy()) out是device:CUDA得到的CUDA tensor.关于detach()的官 ...

最新文章

  1. Import error: no module named cv2 错误解决方法
  2. Apache Sentry手动安装、使用手册
  3. 老码农冒死揭开行业黑幕:如何编写无法维护的代码
  4. lambda表达式方法泛型_模板方法模式–使用Lambda表达式,默认方法
  5. 数字化时代的新职业教育行业洞察
  6. 安装qtceator后无法启动help插件 Qt编译错误:cannot find -lGL 解决办法
  7. Builder生成器模式
  8. python全0序列_Python合集之Python序列(一)
  9. JAVA基本数据结构
  10. 高等数学第六版下册答案
  11. JS中将json字符串转为json对象的三种方式
  12. 高一计算机函数公式,高一函数公式汇总
  13. 第四届传智杯 小卡与质数(java实现)
  14. 「技术人生」第7篇:从业务视角谈信息技术与业务的关系
  15. kali linux 磁盘,在硬盘上安装Kali Linux
  16. (windows)Hexo博客建站$ npm install -g hexo-cli时遇到npm ERR! Response timeout……的解决方案
  17. Pytorch张量(Tensor)复制
  18. ArcGIS数据降雨量插值
  19. Python期末复习
  20. csrf(csrf请求非法是什么意思)

热门文章

  1. 谈谈WIN2K的服务(原创:refdom)
  2. 朝花夕拾——更新两个开源项目
  3. html如何使文件间距变大,wps文档数字、字母间距变大怎么办-解决wps文档数字、字母间距变大的方法 - 河东软件园...
  4. 出海游戏怎样触达全球Microsoft Store和Xbox平台的氪金玩家?
  5. 奥运史上首创 北京冬奥会全部场馆将采用绿色电力
  6. 第三方农资电商平台大丰收获华创资本数亿元C轮融资...
  7. python断言方法assert
  8. EFM32智能门锁应用案例
  9. 三 通用目标之make vmlinux的执行过程分析
  10. JSON兼容IE7及以下