【汇编:在运算时默认单位都是“字节”吗】
比如:ip = ip + 2这里ip增加了【2】,这个2的单位就是【2*一个字节=2个字节】吗?由此推及汇编中所有运算,是否只要不说都是默认单位是“字节”吗?? 一个存储单位是8位8位=1个字节, 1个字 = 2个字节。 汇编都是按字节为单位的,包括C语言等高级语言。
你说的 ip + 2,就是说在原 ip 指向的地址位置,被放了2字节 你这个理解不太对,实际IP = IP + 2,相当于是IP对应的偏移地址加2,而每个地址单元存放的是一个字节的数据
所以,如果他是相当于地址加了2,不是说2的单位就是2个字节,不知道你理解了吗? 就拿栈顶指针SP来说吧:每次PUSH一个值进栈,SP会自动减二,这里的二的单位不就是「字节」吗? 本帖最后由 兰陵月 于 2018-3-26 15:31 编辑
ABC23 发表于 2018-3-25 17:27
就拿栈顶指针SP来说吧:每次PUSH一个值进栈,SP会自动减二,这里的二的单位不就是「字节」吗?
理解错误,减2是地址值减2,在8086汇编里,地址是20位,在32位系统里,地址是32位的。
比如当前栈顶的地址是0x00000008,减2以后,栈顶的地址变成了0x00000006.
它每次操作和运算的基本单元(除一些特殊操作指令)都是16位的、或者32位的、64位的。 兰陵月 发表于 2018-3-26 15:29
理解错误,减2是地址值减2,在8086汇编里,地址是20位,在32位系统里,地址是32位的。
比如当前栈顶 ...
这么说减二的单位就是「int」了?? 我也是初学者 我认为(内存偏移地址默认是一个字节 )你+2就是把一个字的数据 给复制过去建议你还是在看两遍教程比较好 ABC23 发表于 2018-3-26 16:00
这么说减二的单位就是「int」了??
你这些表述都是不准确的,汇编里面没有int类型,它只有16位、32位、64位的说法。
32、64是16的超集。
以你说的减2为例,在32位系统里,0x00000008减2,就是0x00000008-0x00000002,这个2,就是0x00000002。教科书里表述是减2,但是作为CPU来说,虽然是一个简单的2,它仍然是一套复杂电路计算出来的。
如果你要搞懂这个问题,那就要从计算机诞生的前世今生慢慢来说,这个就内容太多了。
你要知道,ALU算出来的结果是2,但实际上就是电路信号的组合,所以它不可能仅仅是8位的2,或者16位的2,或者32位的,而是以最高数据带宽来具体定的。 ABC23 发表于 2018-3-26 16:00
这么说减二的单位就是「int」了??
我暂时还未弄清楚,你要明白这个为何?意义不大。
不过最关键的一点,你不能从人的常识角度(也就是平时我们学的自然数学)去看待这些问题,而是要从计算机的角度,0和1以及它们的组合这个角度去理解计算的任何一种操作。 本帖最后由 ABC23 于 2018-3-27 09:16 编辑
楼上说的似乎也太把自己当回事了。学习过程中难免会有问题,有问题你又不正面解决,到现在还没弄懂只能说明你学艺不精;你自己搞不懂的问题请不要妄加于他人,以为别人都是和你一样只求一知半解,到头来只能掌握一些肤浅的东西,永远没有创新(再次请别喷,我说的是事实)。 本帖最后由 兰陵月 于 2018-3-28 15:45 编辑
ABC23 发表于 2018-3-27 09:05
楼上说的似乎也太把自己当回事了。学习过程中难免会有问题,有问题你又不正面解决,到现在还没弄懂只能说明 ...
呵呵,不好意思,学艺不精,没想到会给你这个印象~
哈哈哈,看来我是一个非常愚蠢的人,自作聪明~受教了~
多谢教诲。 兰陵月 发表于 2018-3-28 15:41
呵呵,不好意思,学艺不精,没想到会给你这个印象~
哈哈哈,看来我是一个非常愚蠢的人,自作聪明~受 ...
Jeep 同学只是想让楼主换个角度看问题。看来被误解了{:5_91:}
具体汇编用多少位,我觉得一是指定,比如操作内存的时候,同样一个数,可以占用一个到n个字节,二是看寄存器的位数,取默认值。
不当之处,请多批评,共同进步{:5_108:} erh 发表于 2018-3-30 15:46
Jeep 同学只是想让楼主换个角度看问题。看来被误解了
具体汇编用多少位,我觉得一是指定,比如 ...
{:5_109:}{:5_109:}{:5_109:} 我觉得你的理解没错啊,寻址的时候寻到的都是一个字节,读写操作也都是以字节为单位,这些连续的字节排在内存中,编上连续的号,ip从从一个字节指向另一个字节,编号不断的改变。没毛病啊。
页:
[1]