网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
学 Win32 汇编 [11]: 数据对齐相关的伪指令(ALIGN、
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/11/26
下载{$ArticleTitle}原创论文样式

  32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度;

  但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度!

  如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存" 得失的问题.

  准备使用的测试文件:

; Test11_1.asm 
.586 
.model flat, stdcall 
 
include  Windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.data 
   ;声明三个字节变量 
   v1 db 0 
   v2 db 0 
   v3 db 0 
.code 
main proc 
   ;三个字节变量的默认偏移地址如下(在没有对齐约束的情况下, 它们各占一个字节): 
   PrintDec offset v1 ;4206592 
   PrintDec offset v2 ;4206593 
   PrintDec offset v3 ;4206594 
   ret 
main endp 
end main 

  ALIGN: 指定对齐边界

; Test11_2.asm 
.586 
.model flat, stdcall 
 
include  Windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.data 
   v1 db 0 
   align 4 ;让下一个变量的起始地址保证是 4 的倍数 
   v2 db 0 
   v3 db 0 
.code 
main proc 
   PrintDec offset v1 ;4206592 
   PrintDec offset v2 ;4206596 (!) 
   PrintDec offset v3 ;4206597 
   ret 
main endp 
end main 
 
;align 后面的参数是 2n, 还可测试下: 1、2、8、16 

  EVEN 相当于 ALIGN 2

; Test11_3.asm 
.586 
.model flat, stdcall 
 
include  windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.data 
   v1 db 0 
   even  ;(!) 
   v2 db 0 
   v3 db 0 
.code 
main proc 
   PrintDec offset v1 ;4206592 
   PrintDec offset v2 ;4206594 (!) 
   PrintDec offset v3 ;4206595 
   ret 
main endp 
end main 

  ORG 可以指定从当前位置跨越指定书目的字节再安排下一个数据:

; Test11_4.asm 
.586 
.model flat, stdcall 
 
include  windows.inc 
include  kernel32.inc 
include  masm32.inc 
include  debug.inc 
includelib kernel32.lib 
includelib masm32.lib 
includelib debug.lib 
 
.data 
   v1 db 0 
   org 100 ;(!) 
   v2 db 0 
   v3 db 0 
.code 
main proc 
   PrintDec offset v1 ;4206592 
   PrintDec offset v2 ;4206692 (!) 
   PrintDec offset v3 ;4206693 
   ret 
main endp 
end main 

  这些伪指令不对局部变量产生影响, 因为伪指令作用在编译之前, 局部变量使用内存是程序运行之后的事.

  关于局部变量的对齐和速度, 除了编译的工作外, 我们在安排变量类型和次序时也应该考虑到 "对齐" 的问题.(责任编辑:admin)

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号