在定义一个结构体时,在用.align伪指令时,就有地址对齐的问题,为什么要对齐,请往下看:
这一切都来自CPU的引脚,相关引脚有AD(address data bus),它是分时复用的,总线周期T1状态表示地址总线,剩下来的T2~T4状态表示数据总线、BHE(bus high enable)高位数据总线允许引脚,用作高位数据选通信号,在T1状态,当BHE=0时,高位数据有效。为什么要介绍这两引脚,因为BHE和A0引脚的配合控制着地址线信号对存储器的读写操作。
下面再介绍下存储器的结构:一般和数据总线的高位相连的是奇地址,得用信号低电平作为选择信号,偶地址和数据总线的低位相连,得用地址线的第一根A0=0来作为选择信号。
BHE和A0的不同组合数据总线的使用高低位不同,操作上开始的奇偶地址也不同,读写的位数也不同,有时是bytes有时是word,网上有组合参数表,这里偷懒就不贴啦。
所以,对于规则字读写可在一个总线周期完成,因为BHE和A0同时有效,就从偶地址读完低位就读高位了;而非规则字,在第一个总线周期中,cpu读写数据时是在奇地址块中,读/写的是高位数据,cpu完成一个存储器周期后,下来,它将存储器地址加1,改变A0电平为低电平,选中偶地址块。这就到了第二个总线周期了,读写低位数据块,最后,再调换高低数据,所以非规则字需要二个总线周期。
这就是地址对齐的所在,这里主要写了起始地址,还有字长也很重要,一般数据总线宽度就是字长。
.aling N伪指令对于intel汇编语法表示字节,对于at&t语法则是1<<N字节对齐,这个N有两种含义当时不知道,简真搞得偶看见它就看不下去下面的程序了,这个,偶卡了N长时间。
转载于:https://blog.51cto.com/jkers/1089672