汇编语⾔之寄存器详解
上图是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 转移指令,⼤部分的寄存器都可以⽤这个指令来改变其值。常⽤的有:不仅限于下⾯⼏种
将⼀个寄存器的内容传送到另⼀个寄存器
⽐如:move 段寄存器(ds,cs),通⽤寄存器——段寄存器的值不能直接通过数据来设定
将数据直接传⼊寄存器
将⼀个内存单元中的内容存⼊⼀个寄存器中,后⾯将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指⽰)《汇编语⾔》
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论