汇编语言(5)--寄存器

处理器操作主要涉及处理数据。 该数据可以存储在存储器中并从其访问。 然而,从存储器中读取数据并将数据存储到存储器中会减慢处理器的速度,因为它涉及到通过控制总线发送数据请求并进入存储器存储单元并通过同一通道获取数据的复杂过程。

为了加快处理器的运行,处理器包括一些内部存储器的存储位置,称为寄存器(Register)

寄存器存储要处理的数据元素,而不必访问存储器。 处理器芯片中内置了数量有限的寄存器。

处理器寄存器

IA-32体系结构中有10个32位和6个16位处理器寄存器。 寄存器分为三类

  • 通用寄存器
  • 控制寄存器
  • 段寄存器

通用寄存器进一步可以分为以下几类

  • 数据寄存器
  • 指针寄存器
  • 索引寄存器

数据寄存器

四个32位数据寄存器用于算术,逻辑和其他运算。 这些32位寄存器可以三种方式使用

  • 作为完整的32位数据寄存器:EAX,EBX,ECX,EDX。
  • 下半部分的32位寄存器可用作四个16位数据寄存器:AX,BX,CX和DX。
  • 上述四个16位寄存器的下半部分和上半部分可以用作八个8位数据寄存器:AH,AL,BH,BL,CH,CL,DH和DL。

不好理解?上图

image

其中一些数据寄存器在算术运算中有特定用途(注意,这个是重点)。

AX是主要累加器; 它用于输入/输出和大多数算术指令。 例如,在乘法运算中,根据操作数的大小,将一个操作数存储在EAX或AX或AL寄存器中。

BX被称为基址寄存器,因为它可以用于索引寻址。

CX被称为计数寄存器,因为ECX,CX寄存器在迭代操作中存储循环计数。

DX被称为数据寄存器。 它也用于输入/输出操作。 它还与AX寄存器以及DX一起使用,用于涉及大数值的乘法和除法运算

指针寄存器

指针寄存器是32位EIP,ESP和EBP寄存器以及相应的16位右部分IP,SP和BP。 指针寄存器分为三类

  • 指令指针(IP)-16位IP寄存器存储要执行的下一条指令的偏移地址。 与CS寄存器关联的IP(作为CS:IP)给出了代码段中当前指令的完整地址。
  • 堆栈指针(SP)-16位SP寄存器提供程序堆栈内的偏移值。 与SS寄存器(SS:SP)关联的SP是指程序堆栈中数据或地址的当前位置。
  • 基本指针(BP)-16位BP寄存器主要帮助参考传递给子例程的参数变量。 SS寄存器中的地址与BP中的偏移量相结合,以获取参数的位置。 BP也可以与DI和SI组合用作特殊寻址的基址寄存器。

大概就长这样,SP和BP, 不要记成SB了!

image

索引寄存器

32位索引寄存器ESI和EDI及其最右边的16位部分。 SI和DI用于索引寻址,有时用于加法和减法。 有两组索引指针

  • 源索引(SI)-用作字符串操作的源索引。
  • 目标索引(DI)-用作字符串操作的目标索引。
image

上面就是我们可能会常用的一些寄存器,除此之外,还有两个特别重要的也介绍一下。

控制寄存器

将32位指令指针寄存器和32位标志寄存器组合起来视为控制寄存器。

许多指令涉及比较和数学计算,并更改标志的状态,而其他一些条件指令则测试这些状态标志的值,以将控制流带到其他位置。

通用标志位是

  • 溢出标志(OF)-指示有符号算术运算后数据的高阶位(最左位)的溢出。
  • 方向标记(DF)-它确定向左或向右移动或比较字符串数据的方向。 DF值为0时,字符串操作为从左至右的方向;当DF值为1时,字符串操作为从右至左的方向。
  • 中断标志(IF)-确定是否忽略或处理外部中断(例如键盘输入等)。当值为0时,它禁用外部中断,而当值为1时,它使能中断。
  • 陷阱标志(TF)-允许在单步模式下设置处理器的操作。我们使用的DEBUG程序设置了陷阱标志,因此我们可以一次逐步执行一条指令。
  • 符号标志(SF)-显示算术运算结果的符号。根据算术运算后数据项的符号设置此标志。该符号由最左位的高位指示。正结果将SF的值清除为0,负结果将其设置为1。
  • 零标志(ZF)-指示算术或比较运算的结果。非零结果会将零标志清零,零结果将其清零。
  • 辅助进位标志(AF)-包含经过算术运算后从位3到位4的进位;用于专业算术。当1字节算术运算引起从第3位到第4位的进位时,将设置AF。
  • 奇偶校验标志(PF)-指示从算术运算获得的结果中1位的总数。偶数个1位清除奇偶校验标志为0,奇数个1位清除奇偶校验标志为1。
  • 进位标志(CF)-在算术运算后,它包含一个高位(最左边)的0或1进位。它还存储移位或旋转操作的最后一位的内容。

下表列出了16位标志寄存器中标志位的位置

image

也就是说,所有的标志位都在一个2个字节大小的寄存器(CF, 不是打游戏的那个)中。

段寄存器

段是程序中定义的用于包含数据,代码和堆栈的特定区域。 主要分为三个部分

  • 代码段-它包含所有要执行的指令。 16位代码段寄存器或CS寄存器存储代码段的起始地址。
  • 数据段-它包含数据,常量和工作区。 16位数据段寄存器或DS寄存器存储数据段的起始地址。
  • 堆栈段-包含数据或过程或子例程的返回地址。 它被实现为“堆栈”数据结构。 堆栈段寄存器或SS寄存器存储堆栈的起始地址。

除DS,CS和SS寄存器外,还有其他段寄存器-ES(额外段),FS和GS,它们提供了用于存储数据的其他段。

在汇编编程中,程序需要访问存储器位置。 段中的所有存储位置都相对于段的起始地址。 段的起始地址可以是16或十六进制的整数,因此,所有此类存储地址中最右边的十六进制数字为0,通常不存储在段寄存器中。

段寄存器存储段的起始地址。 为了获得数据或指令在段中的确切位置,需要一个偏移值(或位移)。 为了引用段中的任何存储位置,处理器将段寄存器中的段地址与该位置的偏移值进行组合。

示例

查看以下简单程序,以了解汇编程序中寄存器的使用。 该程序在屏幕上显示9个星星以及一条简单消息

section .text
   global _start     ;must be declared for linker (gcc)

_start:          ;tell linker entry point
   mov  edx,len  ;message length
   mov  ecx,msg  ;message to write
   mov  ebx,1    ;file descriptor (stdout)
   mov  eax,4    ;system call number (sys_write)
   int  0x80     ;call kernel

   mov  edx,9    ;message length
   mov  ecx,s2   ;message to write
   mov  ebx,1    ;file descriptor (stdout)
   mov  eax,4    ;system call number (sys_write)
   int  0x80     ;call kernel

   mov  eax,1    ;system call number (sys_exit)
   int  0x80     ;call kernel

section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg  ;length of message
s2 times 9 db '*'

编译并执行,可以看到屏幕上打印出结果

Displaying 9 stars
*********

大家可以对照一下上一篇文章中的Hello world程序,加深一下这两节内容的理解。

关注公众号(知青语),资料和软件都在里面。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 计算机通过执行指令序列来使机器得以工作,所以对于每一系列的计算机都有指定的一组指令集供计算机使用,这组指令...
    未来科技工作室阅读 7,988评论 1 10
  • 1.地址总线,数据总线,控制总线在哪里,它们有什么作用?答:它们都是cpu连接外部组件的线路。地址总线:地址总线A...
    MagicalGuy阅读 1,449评论 0 1
  • 80X86微处理器 一、80x86系列微处理器概况: 8086、8088、80286、80386、80486之后型...
    Zhou_qn阅读 4,563评论 0 4
  • 汇编指令速查 汇编中各寄存器的作用4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和E...
    星星之火666阅读 170评论 0 0
  • 一切竟然就这样开始了。时间才不管那些有的没的,只顾裹挟着一切情愿的不情愿的、完成的未完成的向前走。 我...
    Asa二十代不在家阅读 364评论 0 2