灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:4324回复:0

[系统教程]经典汇编语言教程:4.3 调整偏移量的伪指令

楼主#
更多 发布于:2012-09-23 09:00
调整偏移量伪指令是在内存变量定义时用来调整内存变量起始偏移量的,它们是在把源程序汇编成目标文件时起作用。常用的调整偏移量伪指令有:EVEN、ALIGNORG,它们的主要目的是:为了更有效地读取内存单元的内容。

 
4.3.1 偶对齐伪指令EVEN
 
偶对齐伪指令格式:
EVEN
伪指令的作用是:告诉汇编程序(Assember),本伪指令下面的内存变量从下一个偶地址单元开始分配。
如果下一个偏移量是偶地址,那么,该伪指令不起作用,否则,汇编程序将空出一个字节,从下一偶地址开始为其后变量分配内存单元。
假设有下列变量定义,并且变量B1的偏移量是偶数,其内存单元分布如图4.2所示。
B1DB12H;为了表示方便,不妨再假设其偏移量为:xxxx0H
W1DW4567H

图片:04-2.gif


图片:04-3.gif


图4.2 内存单元分布图

图4.3 齐偏移量读取一个字的过程示意图
在上述定义情况下,在许多微机系统中,当需要读变量W1及其后面的字内容时,硬件将按图4.3所示的方式分二次读出该字内容,再拼接成一个字内容,这时,无疑需要二个读内存周期,从而影响程序执行的速度。
出现上述问题的主要原因就是字变量W1在数据段内的偏移量是奇数,为了保证其偏移量是偶数,需要在其定义之前加上伪指令EVEN。

所以,可把前面的变量定义改变成下列形式:

图片:04-4.gif

图4.4 偶偏移量读取字过程
B1DB12H
EVEN
W1DW4567H
这时,变量的内存分配和读取字变量W1的过程如图4.4所示。

 
4.3.2 对齐伪指令ALIGN
 
对齐伪指令格式:
ALIGN  Num
其中:Num必须是2的幂,如:2、4、8和16等。
伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。
如果下一个地址正好能被Num整除,那么,该伪指令不起作用,否则,汇编程序将空出若干个字节,直到下一个地址能被Num整除为止。
试比较下面二组变量定义,它们的对齐效果一致吗?
B1
DB 12HB1DB 12H
EVENALIGN 2

W1
DW 4567HW1DW 4567H
从上面的对比,我们不难看出:伪指令ALIGN的说明功能要比伪指令EVEN强。

喜欢0 评分0
游客

返回顶部