X86汇编语言中的registers相关
0、写在前面
本文中总结于王爽老师的汇编语言,建议有兴趣的都买一本,以支持王爽老师的辛勤付出。再者,这本书写的确实很nice。
8086CPU共有14个registers:AX, BX, CX, DX, SI, DI, SP, BP, IP, CS, SS, DS, ES, PSW, 所有寄存器都是16位的。
【1】通用寄存器: AX, BX, CX, DX
通常用于存放一般性的数据;
【2】CS和IP (code segment and instruction pointer) - 代码段寄存器和指令指针寄存器
CPU从何处执行是由寄存器决定的, 设CS的value = M, IP的value = N , CPU将从M*16 + N 内存单元开始执行;(因为CPU的地址加法器采用 物理地址 = 段地址*16 + 偏移地址 来表示物理地址)
Attention: jmp 可以修改CS和IP的值;
【3】DS(data segment register) - 数据段寄存器
通常用来存放要访问数据的段地址;
mov bx,1000h
mov ds,bx
mov al,[0]
将1000:0 内存单元中的 数据copy到 al
【4】[bx]
bx用于存放偏移地址EA (effective addr), 段基址在ds中的内存单元;
如mov [bx] ,ax
将ax中的内容copy到 ds:bx (ds*16+bx)内存单元中。
Attention:
A1) EA-effective address 有效地址==偏移地址;
A2) SA-segment address 段基址;
A3) debug 和 汇编编译器masm对指令的不同处理
对于mob bl,[1] ; mov cl,[2] ; debug将[1] 解释为一个内存单元 即将[idata]解释为[idata]内存单元的偏移地址,段基地址在ds中,而编译器将[1]解释为1, 即将[idata]解释为idata立即数了;
【5】bx, si , di , bp
5.1)只有这4个registers 可以用在[…]中来进行内存单元寻址;
mov ax, [bp + di ]
5.2)在[…]中, 这4个registers可以单个出现,或只能以4种组合出现
bx+si ;
bx+di ;
bp+si ;
bp + di;
5.3)只要在[…]中使用寄存器bp, 若指令中没有显性给出段地址,段地址就默认在ss中。
mov ax,[bp+si+idata] (基址变址相对寻址)
【6】指令处理的数据在什么地方
6.1) 立即数, 数据包含在指令中;
6.2) 寄存器,数据包含在register中
6.3) 段地址(SA)和偏移地址中(EA)
mov ax,[bx+si+8] 段地址默认在ds中;
mov ax,[bp+si + 8] 段地址默认在ss中;
当然你也可以显性指定,如
mov ax,es:[bx]
6.4) 寻址方式如下:
【7】指令要处理的数据有多长
mov word ptr ds:[0],1 ; word ptr指明了访问的内存单元是一个字单元
mov byteptr ds:[0],1 ; byte ptr指明了访问的内存单元是一字节字单元
【8】CPU中的栈
任意时刻, SS:SP指向栈顶元素。push和pop指令时,CPU从ss和sp中得到栈顶元素;
push ax 分为两步:
- 8.1) sp = sp - 2 , SS:SP指向当前栈顶前面的单元;
- 8.2) 将ax内容送到ss:sp 指向的内存单元处;
入栈时栈顶由高地址向低地址增长。(先送字数据的低字节,后送 高字节)
【9】pushf和popf (PSW)
pushf和popf的功能是向标志寄存器的压栈和从标志寄存器出栈;
什么是标志寄存器, 其中存储的信息就是程序状态字PSW(program status word)
cf==carry flag (进位标志) 前一条指令执行结果产生的进位
pf==parity flag (奇偶标志位)前一条指令执行结果 1 的个数是否为偶数,偶数为1,否则为0;
af==
zf==zero flag(零标志位) 前一条指令执行结果是否为0,为0则zf=1, 否则为0;
sf=sign flag (符号标志) 如果为负, sf=1,否则为0;
tf
if
df
of==overflow flag 溢出标志
其作用:
- (1)用来存储相关指令的某些执行结果
- (2)用来为CPU执行相关指令提供行为依据
- (3)用来控制cpu的相关工作方式
【10】串传送指令
movsb, 功能执行movsb指令相当于进行以下几步:
- (1)(es)16 + (di) = ((ds) 16 + si)
- (2)
如果df = 0 (si) = (si) + 1; (di) = (di) + 1;
如果df = 1 (si) = (si) - 1; (di) = (di) - 1;
movsw ,根据标志寄存器df位的值,将si和di +2 或 -2
如我们的需求:
- (1)传送的原始位置:ds:si
- (2) 传送的目的位置:es:di
- (3)传送的长度:cx
- (4)传送的方向: df
代码如下:
mov ax,data
mov ds,ax
mov si,0 ; ds:si 指向data:0
mov es,ax
mov di,16 ; es:di 指向data:0010
mov cx,16 ; cx=16 ,rep循环16次
cld ;设置df=0,
rep mobsb
Attention:
cld: 将标志寄存器的df位置0
std: 将标志寄存器的df位置1
【11】offset 操作符
取偏移地址
assume cs:codesg
codesg segment
start: mov ax, offset start ; 相当于mov ax,0
s:mov ax, offset s ;相当于mov ax,3
【Complementary】 字符串处理指令
- (1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI
- (2) stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI
- (3) movsb、movsw:把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI
- (4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI
- (5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI
- (6) rep:重复其后的串操作指令。重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在LODS前。
Attention
上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX
涉及的标志位:DF、AF、CF、OF、PF、SF、ZF
版权声明:本文为博主原创文章,未经博主允许不得转载。
X86汇编语言中的registers相关的更多相关文章
- x86汇编语言实践(3)
0 写在前面 为了更深入的了解程序的实现原理,近期我学习了IBM-PC相关原理,并手工编写了一些x86汇编程序. 在2017年的计算机组成原理中,曾对MIPS体系结构及其汇编语言有过一定的了解,考虑到 ...
- x86汇编语言实践(2)
0 写在前面 为了更深入的了解程序的实现原理,近期我学习了IBM-PC相关原理,并手工编写了一些x86汇编程序. 在2017年的计算机组成原理中,曾对MIPS体系结构及其汇编语言有过一定的了解,考虑到 ...
- x86汇编语言实践(1)
0 写在前面 为了更深入的了解程序的实现原理,近期我学习了IBM-PC相关原理,并手工编写了一些x86汇编程序. 在2017年的计算机组成原理中,曾对MIPS体系结构及其汇编语言有过一定的了解,考虑到 ...
- 程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25
程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都 ...
- VS2013的x86汇编语言开发环境配置
转载:https://blog.csdn.net/infoworld/article/details/45085415 转载:https://blog.csdn.net/u014792304/arti ...
- 存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20
存储器的保护(三) 修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响).要求:对内存的读写按双字的长度进行,并在检测的同时显示已检测的内存数量 ...
- 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18
本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄 ...
- 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17
(十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 ...
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
随机推荐
- 用JS或jQuery访问页面内的iframe,兼容IE/FF
用JS或jQuery访问页面内的iframe,兼容IE/FF js或者jQuery访问页面中的框架也就是iframe.注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.htm ...
- vs2012 + web api + OData + EF + MYsql 开发及部署
先说下我的情况,b/s开发这块已经很久没有搞了,什么web api .MVC.OData都只是听过,没有实际开发过,因为最近要开发一个手机app的服务端,所以准备用这套框架来开发. 下面开始进入正题( ...
- List排序忽略大小写
public List<String> sortListIgnoreCase(List<String> list) { Collections.sort(list ...
- 微价值:专訪《甜心爱消除》个人开发人员Lee,日入千元!
[导语]我们希望能够对一些个人开发人员进行专訪,这样大家更能显得接地气,看看人家做什么,怎么坚持.<甜心爱消除>作者Lee是三群的兄弟,也关注微价值.微价值的文章还是能够的,得到一些业内大 ...
- 无法将类型为 excel.applicationclass 的 com 强制转换为接口类型 的解决方法。
今天碰到客户的电脑在导出EXCEL的时候提示,无法将类型为 excel.applicationclass 的 com 强制转换为接口类型 excel._application 的问题 最后用下面的方法 ...
- C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem
class TestThread { static void Main() { //使用WaitHandle静态方法阻止一个线程,直到一个或多个同步对象接收到信号 WaitHandle[] waitH ...
- .NET企业轻量级开发框架(APS.NET+Spring.Net+NHibernate)
在<企业级应用架构>系列文章发表之余,也得到了许多同行的反馈,有人说这套框架太重了或者技术学习太复杂了或者初学者不太好理解或者完全颠覆了传统APS.NET开发模式让人望而生畏. ...
- c#(asp.net)杂谈笔记
1.js解析json格式的时间 //转换json格式时间的方法 如Date(1340239979000)转换为正常 function ConvertJSONDateToJSDateObject(JSO ...
- Cocos2d-x 3.1 内存管理机制
Cocos2d-x使用的内存管理方式是引用计数.引用计数是一种非常有效的机制.通过给每个对象维护一个引用计数器,记录该对象当前被引用的次数.当对象添加一次引用时,计数器加1:而对象失去一次引用时.计数 ...
- DP之矩阵连乘问题
最优二叉查找树的一道思考习题 同最优二叉查找树一样,矩阵连乘问题也是一个卡特兰数问题(其动态规划的构造过程都很像) 分析解答: a,铺垫的数学知识首先要搞清楚矩阵相乘是怎么乘的: 1)对于连续的n个矩 ...