上图是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 转移指令,大部分的寄存器都可以用这个指令来改变其值。常用的有:不仅限于下面几种
1.move 某一个合法寄存器 某一个合法寄存器
将一个寄存器的内容传送到另一个寄存器
比如:move 段寄存器(ds,cs),通用寄存器——段寄存器的值不能直接通过数据来设定
2.move 某一个合法寄存器 数据
将数据直接传入寄存器
3.move 某一个合法寄存器 [内存单元的偏移地址]
将一个内存单元中的内容存入一个寄存器中,后面将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指示)
《汇编语言》
本文向大家介绍汇编语言之寄存器(详细介绍),包括了汇编语言之寄存器(详细介绍)的使用技巧和注意事项,需要的朋友参考一下 1、寄存器 32位寄存器有16个,分别是: 4个数据寄存器(EAX、EBX、ECX、EDX)。 2个变址和指针寄存器(ESI和EDI);2个指针寄存器(ESP和EBP)。 6个段寄存器(ES、CS、SS、DS、FS、GS)。 1个指令指针寄存器(EIP);1个标志寄存器(EFla
x86的通用寄存器有eax、ebx、ecx、edx、edi、esi。这些寄存器在大多数指令中是可以任意选用的,比如movl指令可以把一个立即数传送到eax中,也可传送到ebx中。但也有一些指令规定只能用其中某些寄存器做某种用途,例如除法指令idivl要求被除数在eax寄存器中,edx寄存器必须是0,而除数可以在任意寄存器中,计算结果的商数保存在eax寄存器中,而原来的被除数被覆盖掉,余数保存在ed
本文向大家介绍汇编语言 寄存器内存访问原理解析,包括了汇编语言 寄存器内存访问原理解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了汇编语言 寄存器内存访问原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字
本文向大家介绍汇编语言中的各种寄存器介绍,包括了汇编语言中的各种寄存器介绍的使用技巧和注意事项,需要的朋友参考一下 汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成
本文向大家介绍16位汇编语言寄存器及指令整理(小结),包括了16位汇编语言寄存器及指令整理(小结)的使用技巧和注意事项,需要的朋友参考一下 寄存器 通用寄存器 8位寄存器 16位寄存器 32位寄存器 寄存器名称 AH,AL AX EAX 累加寄存器 BH,BL BX EBX 基地址寄存器 CH,CL CX ECX 计数器寄存器 DH,DL DX EDX 数据寄存器 SI ESI 源变址寄存器 DI
机器语言 机器语言是指令的集合。 汇编语言 汇编语言的主体是汇编指令。 存储器 随机存储器RAM,可读可写,必须带电存储,关机后存储的内容丢失 只读存储器ROM,只读,关机后其中的内容不丢失 装有 BIOS (基本输入输出设备)的ROM 接口卡上的RAM:显存 外存(storage,磁盘)和内存(memory,主存,高速缓存) 内存地址空间 存储单元:1个字节(byte) 总线 地址总线:CPU是