一个寄存器只能存放两个字节? 太小了,能干啥

谁学逆向工程 2011-07-17 09:41:48
王爽的《汇编语言》第二版,14页,2.1节的第一段的第一句话: 8086CPU 的所有寄存器都是16位的,可以存放两个字节。

寄存器是干啥的,两个字节好像太小了,干什么都不够用啊,是不是什么情况下两个字节就够用了?
...全文
2928 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
dinko321 2011-07-18
  • 打赏
  • 举报
回复
寄存器和内存 就像 内存和硬盘 的关系

大的东西放在硬盘上,要用了才读入内存。你不能说你15G的WOW你2G的内存装不下吧



而且你还没看寻址方式吧?

16位的寄存器的寻址范围是1M啊1M
不解释 2011-07-18
  • 打赏
  • 举报
回复
这个够大的了,一般不直接用,用来寻址的,值也可以变换的
wcqqq 2011-07-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xiaoyuanyuan2009 的回复:]

既然寄存器的作用是寻址,那谁是负责处理数据的啊。
1、谁负责处理数据
2、负责处理数据的东西有多大。
假设我有个巨大的结构体,负责处理的东西能装的下吗
[/Quote]
结构体是高级语言的一个抽象。
到了机器语言这个阶段只有数据(也包括地址)和指令码
而负责将高级语言抽象的结构体转变为实实在在的机器语言,就是编译器的工作啦~~~~
,你写个c/c++的程序调试一下就知道是咋回事情。
Im17benteng 2011-07-18
  • 打赏
  • 举报
回复
学习中
MHBBCRCPJ 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 xiaoyuanyuan2009 的回复:]

引用 22 楼 mhbbcrcpj 的回复:
你用高级语言操作这个结构体的时候也不能一下子把结构体中所有的变量一次都处理了吧?就算是用函数写两个结构体相加,在函数内部不是还是要一个一个操作变量么。

你的意思是说,CPU一个一个的处理?
[/Quote]
是,多核的除外。多核可以同时处理多个。
谁学逆向工程 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 mhbbcrcpj 的回复:]
你用高级语言操作这个结构体的时候也不能一下子把结构体中所有的变量一次都处理了吧?就算是用函数写两个结构体相加,在函数内部不是还是要一个一个操作变量么。
[/Quote]
你的意思是说,CPU一个一个的处理?
MHBBCRCPJ 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 xiaoyuanyuan2009 的回复:]

引用 19 楼 mhbbcrcpj 的回复:
2.我不知道你要怎么衡量这个大?你指的是位数么?一般CPU内部的运算器的宽度就是寄存器的……

随便整个大点的结构体,举个例子

struct X
{
int a;
int b;
wchar_t n[999999999];
double q,w,e,r,t,y,u,i,o;
char m[9999……
[/Quote]

你用高级语言操作这个结构体的时候也不能一下子把结构体中所有的变量一次都处理了吧?就算是用函数写两个结构体相加,在函数内部不是还是要一个一个操作变量么。
谁学逆向工程 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mhbbcrcpj 的回复:]
2.我不知道你要怎么衡量这个大?你指的是位数么?一般CPU内部的运算器的宽度就是寄存器的……
[/Quote]
随便整个大点的结构体,举个例子

struct X
{
int a;
int b;
wchar_t n[999999999];
double q,w,e,r,t,y,u,i,o;
char m[999999999999];
};

如果有这么一大大对象,那运算器能折腾得了他吗
MHBBCRCPJ 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mhbbcrcpj 的回复:]

引用 17 楼 xiaoyuanyuan2009 的回复:

既然寄存器的作用是寻址,那谁是负责处理数据的啊。
1、谁负责处理数据
2、负责处理数据的东西有多大。
假设我有个巨大的结构体,负责处理的东西能装的下吗


1.准确的说是运算器。每一种运算都有对应的处理逻辑。运算器只能操作寄存器。
2.我不知道你要怎么衡量这个大?你指的是位数么?一般CPU内部的运算器的宽度就是寄存器……
[/Quote]
但FPU的运算器的宽度和FPU的寄存器的宽度是一样的。
MHBBCRCPJ 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xiaoyuanyuan2009 的回复:]

既然寄存器的作用是寻址,那谁是负责处理数据的啊。
1、谁负责处理数据
2、负责处理数据的东西有多大。
假设我有个巨大的结构体,负责处理的东西能装的下吗
[/Quote]

1.准确的说是运算器。每一种运算都有对应的处理逻辑。运算器只能操作寄存器。
2.我不知道你要怎么衡量这个大?你指的是位数么?一般CPU内部的运算器的宽度就是寄存器的宽度。但也不一定,比如FPU(从很早开始Intel的CPU就开始包含这个东西了,虽然也在CPU里,但相对来说是比较独立的)的运算器的宽度就有80位,现在的比较NB的CPU才64位。如果是硬件上的大小的话我还真不知道,不过感觉运算器应该占了很大的空间。
canmeng 2011-07-17
  • 打赏
  • 举报
回复
寄存器就是非常特殊的内存。
谁学逆向工程 2011-07-17
  • 打赏
  • 举报
回复
既然寄存器的作用是寻址,那谁是负责处理数据的啊。
1、谁负责处理数据
2、负责处理数据的东西有多大。
假设我有个巨大的结构体,负责处理的东西能装的下吗
MHBBCRCPJ 2011-07-17
  • 打赏
  • 举报
回复
单片机还有四位的呢,
MHBBCRCPJ 2011-07-17
  • 打赏
  • 举报
回复
寄存器是用来运算数据的,不是存放数据的。高级语言的变量几乎全部是定义在内存里的。只有需要对变量进行处理的时候才会把变量从内存中取出来,放到寄存器里进行处理和运算,弄完了再放回去。
CPU对内存能执行的操作只有读和写(我猜的,但这个是正确的几率应该很大),不能直接对内存中的数据进行运算。但对寄存器可以执行的操作就很多了。还有哪些看起来操作数是内存的指令实际上也要把数据读到CPU中,处理完了再写回内存。
Lactoferrin 2011-07-17
  • 打赏
  • 举报
回复
暂存器是暂时放东西的地方,容量小但速度快,要计算时把东西拿到寄存器,长时间存储时再放到主存
znufe_zl 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiaoyuanyuan2009 的回复:]
32位机器中,C++的指针是32位的。如果用来寻址,估计差不多够了
[/Quote]
你看,你完全懂得这个道理。
指针的本质是地址,它会被存入寄存器。多看看寻址方式一节。
纯C和汇编更为相似,所以常说C简直是高级汇编语言。
谁学逆向工程 2011-07-17
  • 打赏
  • 举报
回复
32位机器中,C++的指针是32位的。如果用来寻址,估计差不多够了
znufe_zl 2011-07-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xiaoyuanyuan2009 的回复:]
引用 5 楼 znufe_zl 的回复:
80X86 有8个32位通用寄存器
在intel 64位处理器中(intel 64模式下)有更多的更大的寄存器。

在intel 64位处理器中有多大的寄存器,估计也是几个字节吧? 干什么用这么小的东西
[/Quote]
64模式下的通用寄存器自然是64位。
寄存器造价很贵的。早期寄存器的位宽也正是因为技术和成本的限制。
寄存器通常用来寻址多于传递参数。
znufe_zl 2011-07-17
  • 打赏
  • 举报
回复
一个函数的典型汇编代码如下:
;设置堆栈框架
push ebp
mov ebp,esp
sub esp,4*n(n = 局部变量个数)

-------
mov eax,返回值
;恢复堆栈框架,即你所说的清楚堆栈中的数据
mov esp,ebp
pop ebp
ret

如果一个函数只定义 int a = 123,
那么sub esp,4(一个int的字长)
对局部变量的引用使用 dword ptr [ebp + 4]
cngst 2011-07-17
  • 打赏
  • 举报
回复
已经足够大
加载更多回复(8)
【课程简介】本课程是《Armv8/Armv9架构从入门到精通 第二期》中的第四章。建议购买大课程。本课程以为armv8-aarch64、armv9为基准,不涉及armv7及其以前的版本,也不涉及aarch32。本课程包含但不限于以下内容MMU的基础学习:啥是MMU?工作原理?MMU和cache之间的关系?及其怎样相互影响的?哪些是MMU硬件自动的行为?哪些是软件可配置的行为?地址空间基础:啥是虚拟地址空间?啥是物理地址空间?啥时memory-map? 代码程序中的虚拟地址空间是怎样的?arm core硬件决定的物理地址空间是怎样的?SOC memory-map时的地址空间是怎样的?具体的外设又是怎样的地址空间?Translation Regime:系统里有多少个MMU?系统里有多少个Translation Regime?他们之间的关系是怎样的?页表翻译:MMU是怎样翻译的?页表有几级?这些信息是怎么告诉MMU的,MMU又是怎样工作的,软件又需要怎样设计?stage1和stage2的区别和使用?Descriptor:啥是Descriptor、页表项、entry、条目、页表条目? Descriptor的格式是怎样的?每一个属性位是怎样的?MMU除了完成地址转换,属性权限的控制/cache的缓存策略是怎样配置的?optee中使用MMU的示例MMU深度思考篇:开启MMU瞬间可能出现的问题以及多种常用的解决方案。注意这里提到的是多种方案,绝大多数人只知道第一种,除此之外还有没有其它的设计方式? MMU关闭时cache的缓存策略会怎样?【思考】01、一个大系统中有多少个MMU ?02、一个ARM Core中有多少个Translation regime?03、EL1&0 Translation regime Stage2、EL2 Translation regime stage1、EL2&0 Translation regime stage1 这三者的区别是什么?04、TTBR1_EL2寄存器有啥特殊性,这个寄存器是给谁使用的?05、有没有TTBR1_EL3寄存器?为什么?06、什么是memory-map? 一个ARM的系统中,有几套物理地址空间?07、页表到底有几级? 页表最少可以有几级?页表最多可以有几级?08、页表有多大? 页表存放在哪里?页表由谁来管理?09、页表是否能放在cache中?10、什么是Translation Table walk? 什么是TLB?11、请简述页表查询的过程?12、在一个大系统中,物理地址是多少位的? 物理地址是多少位指的是什么?虚拟地址又是多少位的? 物理地址的位数和虚拟地址的位数都是由谁来决定的?13、请说明entry、descriptor、页表项、条目 这个四个词汇的由来?14、TCR中有缓存属性和共享属性、页表的entry中也有缓存属性和共享属性,这俩有什么区别?15、请简述TTBR0和TTBR1的概念和意义?16、请简述cacheability和shareability属性的含义?17、stage1和stage2有何区别?18、stage1和stage2的descriptor中,有很多重复的属性,当两者属性有冲突了怎么办?19、L1、L2、L2的descriptor中也有部分相同的属性,重复时怎么办?20、Descriptor的格式有哪几种?21、Descriptor的类型有哪几种?22、简述您所观察到的系统软件中(操作系统或hypervisor)的shareability和cacheability一般都是怎样配置的?23、开启一个MMU的步骤是怎样的?24、啥是flat map? 啥是full level table?25、页表中的AF属性位、DBM属性位分别是干啥的?26、页表中的nG属性位是干啥的?27、页表中的Contiguous属性位是干啥的?28、在开启MMU的瞬间会考虑哪些事情?【课程目录】当前21节课,6.8小时

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧