HLA安装与设置——汇编语言教程之《汇编语言编程艺术》

  版权声明:转载时请以超链接形式标明文章原始出处和作者信息及 本声明
http://www.tuenhai.com/logs/3203703.html

HLA安装与设置——汇编语言教程之《汇编语言编程艺术》

《汇编语言编程艺术》(The Art of Assembly Language)
介绍了一种高级汇编语言HLA ( High Level Assembly ),最开始HLA 是加州大学的教授用来讲解汇编语言编程和机器组织的一个工具,经过几年的发展,如今已经成为了资深汇编语言程序员编写可读性强、功能强大的汇编程序的开发平台。

汇编语言编程艺术 可到作者主页去下载英文电子版  http://webster.cs.ucr.edu/  

tuenhai.com按:我的HLA环境变量设置:
C:/AUTOEXEC.BAT的内容:

@echo off
SET include=d:/masm32/include
SET lib=d:/masm32/lib;d:/hla/hlalib
SET path=d:/masm32/bin;d:/hla
SET ML=/coff /link /SUBSYSTEM:WINDOWS
set hlainc=d:/hla/include
set hlalib=d:/hla/hlalib/hlalib.lib
echo on

AUTOEXEC.BAT的目标位置设置成:
%SystemRoot%/system32/cmd.exe /KC:/AUTOEXEC.BAT


HLA的编辑器一般用RadASM,汉化增强版下载地址:
http://www.hanzify.org

下载下来后安装到D:/RadASM, 另hla安装到D:/hla.

RadASM之路径设置(见hla.ini):

$A=D:/hla
$B=$A/
$D=$R/AddIns
$H=$A/help
$I=$A/Include
$L=$A/hlalib
$P=$R/Hla/Projects
$S=$R/Hla/Sniplets
$T=$R/Hla/Templates
$M=$R/Hla/Macro
$E=$R/OllyDBG


RadASM环境变量tuenhai.com之设置(见hla.ini):
1=path,d:/hla;d:/masm32/bin;
2=lib,d:/hla/hlalib
3=hlainc,d:/hla/include

RadASM菜单,选项,编程语言,把hla设置到最顶端。


附录:

HLA主页:
http://webster.cs.ucr.edu/

在线阅读<汇编语言编程艺术>部分章节:
http://www.ebook520.com/showbooknclass.asp?id=63
http://act.it.sohu.com/book/serialize.php?id=531#content


http://utime.blogbus.com/logs/2005/12/1730078.html
成功安装HLA
2005-12-21, by utime
因为是初次安装HLA,所以费了很大的力气才能成功。把收获与应该注意的问题记下来。如果你也是初次安装,并且安装之后不能汇编链接得到

可执行文件的话,请先认真阅读下面的安装说明。或者直接读我的安装笔记,对照你的安装方法,也能立即找到问题所在。

安装说明:
http://webster.cs.ucr.edu/AsmTools/HLA/HLADoc/HTMLDoc/Install.html

安装环境:
Windows xp;
Masm32: 安装到C:/masm32
Hla:安装到C:/hla

在阅读下面的注意事项之前,保证你已经正确设置了hla要求的环境变量(hlainc,hlalib,hlatmp)。在DOS提示符下,用path, set等设置,而一

劳永逸的方法参考下面的1)步。

1)安装hla后,在DOS下汇编程序时,提示错误“hla既不是命令行,也不是可执行文件”
解决:在“我的电脑”|“高级”|“环境变量”下加入 Path=C:/hla,因为DOS命令PATH是为系统设置可执行文件路径。

2)提示错误“ml既不是命令行,也不是可执行文件”
解决:复制C:/masm32/bin中的四个文件:ml.exe, ml.err, link.exe, mspdb50dll 等到C:/hla文件夹下;

3)每次打开DOS命令行很麻烦,要多次击键,还要用DOS命令改变当前文件夹。
解决:先在C:/hla下建立子文件夹/myprojects。然后为DOS命令符建立桌面快捷方式,并为此快捷方式设置起始位置:C/hla/myprojects。

下次双击DOS命令符快捷方式时,弹出的窗口一定让你满意。

 

http://community.csdn.net/Expert/topic/4919/4919070.xml?temp=.1769678
搞汇编的人都知道一本非常牛的书: AOA !
这本AOA是用HLA讲述汇编的。那么什么是AOA?什么是HLA?

○  HLA简介

HLA,英文"High Level Assembler"(高阶汇编)的缩写,即所谓高级语法的汇编,它将一些高级语言中的特性加入汇编编写中,但它在最终的

编译连接时还是要用到MASM的编译器和连接器。

更进一步的解释请参看:
http://webster.cs.ucr.edu/AsmTools/HLA/index.html

强烈建议没装过、用过HLA,都用用HLA。没看过《The Art of Assembly Language》(汇编语言的艺术)这本书的都看看。HLA是最牛逼的汇编

了!《The Art of Assembly Language》是非常牛的一本汇编书了!

安装HLA,只要三、五分钟就搞定,然后你就可以用它编程了,非常爽!都来试试吧。

●  HLA的安装

1.下载并安装MASM32

http://www.masm32.com

去下载一个MASM32,并安装它。

2.下载并安装HLA

先到
http://webster.cs.ucr.edu

点击“High Level Assembly”的链接,打开http://webster.cs.ucr.edu/AsmTools/HLA/index.html

再点击“Download HLA”的链接,打开http://webster.cs.ucr.edu/AsmTools/HLA/dnld.html

再找到“Windows Users”下的“HLA Installation Program”,比如hlasetup.exe,然后下载它。

再安装它,安装时选择的目录不要带空格,比如不要装在C:/Program Files,而装在C:/Inetpub可以。

3.设置HLA

到MASM32的bin子目录下,把其中的ml.exe、ml.err、link.exe、mspdb50.dll四个文件复制到HLA所在目录。注意是复制而不是移动。

然后再到MASM32/lib目录下,把其中的gdi32.lib、kernel32.lib、user32.lib三个文件复制到hla/hlalib目录下(如果原本就有这些文件,可

覆盖它们)。注意是复制而不是移动。

设置并确认以下四个系统环境变量:

set hlainc=c:/hla/include
set hlalib=c:/hla/hlalib/hlalib.lib

(安装程序可能已把以上两个系统环境变量设好,不必再改动了)

set lib=c:/hla/hlalib; 《some text》

(安装程序可能已把以上这个系统环境变量设好,但需要检查设置的对不对,有没有重复的地方)

set path=c:/hla; 《some text》

(一般这个系统环境变量的新增部分需要手工添加,注意如果同时安装了Cygwin,要确保HLA的路径在Cygwin之前,否则Cygwin也带有link.exe

,它会先于HLA被执行,导致HLA连接时出错)

4.运行HelloWorld测试HLA

编辑并存盘一个HelloWorld.hla文件,把它存到c:/hla/test,内容如下:

program HelloWorld;
#include( "stdlib.hhf" );
begin HelloWorld;
stdout.put( "Hello, World of Assembly Language", nl );
end HelloWorld;

注意:Randall Hyde在他的AOA(The Art Of Assembly)一书里的上述源码中,英文引号(" ")都变成了中文引号(“”),需要改正过来才

可无错运行。我给出的代码是没这个问题的,你拷贝过去就可直接无错运行了。

编译并运行它:

C:/hla/test>hla HelloWorld.hla
 Assembling: HelloWorld.asm

C:/hla/test>HelloWorld
Hello, World of Assembly Language

C:/hla/test>

进一步修炼HLA,看《The Art of Assembly Language》这本书。

参考网址:
http://webster.cs.ucr.edu


HLA是真正意义上的汇编,你只看到了我本贴的 hello world,就下了结论未免失之偏颇.

其实你应该认真看完那本很牛的AOA, 就会知道你现在的认知是多么地错了!

呵呵, 学下 Randall Hyde 的 "AOA" 吧.他是搞汇编的大虾都无人不知无人不晓的一本牛书,它的中文版有没有不知道,反正英文版是作者免费

提供下载的:

http://webster.cs.ucr.edu/AoA/index.html


分不同版本(根据操作系统), 其中Windows版的"AOA"电子书下载:
http://webster.cs.ucr.edu/AoA/Windows/index.html

有html,pdf,chm几个版本可以选择


"AOA"已经很牛了,但Randall Hyde最牛的书还是更高级修炼的"The Write Great Code"系列,到目前为止出了4卷本:
http://webster.cs.ucr.edu/WriteGreatCode/index.html

学完AOA再学 Write Great Code,感到他实在太牛了,强人啊

牛人Randall Hyde的网站:
http://webster.cs.ucr.edu
以上的下载和书讯都是他这个站的,HLA也在这里下载,牛人啊!

Write Great Code: Understanding the Machine, Volume I
第1卷我在emule找到下载的,不敢私藏,拿出来与大家共享,源很多速度够快,如果需要也先下吧


ed2k://|file|Write%20Great%20Code,%20Volume%201%20-%20Understanding%20the%20Machine%20(No%20Starch%20Press,%

202004).chm|8645090|5518217462E6703BD1CC829F96051C42|/

HLA学习笔记(1)

http://www.vckbase.com/document/viewdoc/?id=1578

作者:lostpencil

HLA 介绍

  HLA是高级汇编语言(High level assembly)的缩写,个人感觉这是一门和c语言有着很大的相似性的汇编语言。他在汇编语言的基础上构建了自己的标准库,使得软件的汇编开发的复杂度大大的减少了,又不影响汇编超级主动的性质。凭我个人短暂的体验来看,最大的不足就是和64位机器的兼容问题,因为它本质上将HLA代码转换成了32位机器的汇编指令,然后通过那些指令操作机器,32位机器和64位机器指令的微小差异,常常弄的很头疼,有时候需要逐个检查生成的汇编代码,修该了才能运行,所以建议,如果不太熟悉这种东西的时候学习的时候还是用32位的机器比较好,可以省去不少麻烦。总之,感觉用这门语言作为汇编语言学习的入口,恰到好处

HLA 的安装

  运行HLA需要的相关软件和相关介绍资料,都可以在http://webster.cs.ucr.edu/AsmTools/HLA/index.html相关的页面找到下载,顺便说出来它是免费的。
  Windows下面的HLA安装比较简单就不说了,简单介绍我的 LINUX 环境下的安装。(其实上面那个网站上面说的很明白,即便有一些微小差别也可以轻松搞定,如果你熟悉linux环境的话)
  下载就不说了,你需要下载的是hla.tar.gz,文件名会因为版本不同有微小的差别。专家们都说的是放在/usr/hla,就这么放好了。然后cd 到/usr,释放文件( gzip -d hla.tar.gz,现在可能会有不同,我记不清我当时怎么做的了,这步好象可以省略,因为文件的格式变了)然后tar xvf hla.tar,基本安装就搞定了 。当然忘了说了你的usr文件对你来说,可能会有一些权限的问题,一般都是在root下做上面操作,然后更改文件权限,使得普通用户可以访问,简单的chmod 777 *就可以,不过要改变整个文件下所有文件的权限,你还需要加上-x参数(参数忘了,自己man chmod吧),接着就是配置相关文件。这时最好用普通用户,因为该系统文件的时候root是和可怕的东西。切换到/home/你的用户文件下,ls -a 找到.bashrc文件,在PATH变量定义的地方追加:/usr/hla(安装hla的路径),然后追加这样两条:

hlalib=/usr/hla/hlalib/hlalib.a
export hlalib
hlainc=/usr/hla/include
export hlainc
后面的路径都是你的实际路径
然后在/usr/hla下面建一个tmp文件夹(放代码的地方)
继续在.bashrc文件里面增加:

hlatemp=/tmp
export hlatemp
(以上变量声明的文件可能和实际系统有所出入,你打开看起来比较像的文件,逐个比较下,看清楚他们的规则,然后增加在适当的地方才不会出错,尝试之前先做个备份)
基本上就好了,你到控制台输入,hla回车,会开到相应的hla提示信息了。

经典的开始

来写个hello word吧
cd 到/usr/hla/tmp 然后用vi写一个hw.hla文件,在里面增加如下代码:

program HelloWorld;
#include( "stdlib.hhf" )
begin HelloWorld;

stdout.put( "Hello, World of Assembly Language", nl );

end HelloWorld;
  保存,然后hla hw.hla,你就会看见标准输出上有Hello, World of Assembly Language,我实际操作的时候提示n1是未定义的宏,因为也

刚学不太久,没有仔细琢磨,把nl去掉就没事了,不过也不换行了。这时,你察看你的tmp文件,会多了很多个文件,根据他们的文件类型名很

容易知道他们是什么,看看那个纪录汇编指令的文件吧,哈哈,原来一个简单的hello world 用到的指令也不少呢。

后记

  目前我也刚开始学这个东西,欢迎更多的人加入这个行列,共同指点下,偶基础比较差,学起来有些困难。不过我会坚持写完这个笔记的

,over!

http://community.csdn.net/Expert/topic/4874/4874821.xml?temp=.2486536


最近我看到不少兄弟在问关于 HLA 学习的事,他们大多买了<<汇编语言编程艺术>>这本书,作者是美国的 Randall Hyde。这本书写的总的来说还是不错的。刚开始的时候比较简单,有些简单的地方又说的略显啰嗦。但如果你耐心看一段时间就能体会其中乐趣。虽然该书有些地方讲的让初学者感到困惑:比如讲到 类和对象汇编实现的时候,开始的一大部分用来做上机实操时得到关于类方法的执行都是会出错的,因为有个关键地方没有设置,即:

VMT(classname);
mov(&tBaseClass._VMT_,bc.pVMT_);

而这个设置在后面才会讲到,但开始却没有丝毫提起,所以会让很多人以为是hla实现上有问题,其实不然。
当然本书自身翻译的不自然和漏字错字也还是存在的,这也算翻译作品的通病吧。而且译者好像缺乏了一点幽默感(我没看过英文原著),但从某些句子段落的咀嚼似乎又能让你会到原作作者的幽默天才(很多原作作者的语言都是很生动和诙谐幽默的,例如另一本:<>)。但不管如何该书还是很有看头的,其中还探讨了使用 HLA 强大的编译时语言编写高级语言语法的功能,还有浮点指令,MMX指令的用法,类和对象的实现等等。

我写此作的目的是希望正在学习 HLA 的朋友能够将遇到的问题和学习的经验和心得和大家共享,本人才疏学浅,通假字连篇,所以不当之处恳请各位多多指出,在此谢过了。

我想先抛砖引玉先说2点:
1. <<汇编语言编程艺术>> 这本书中使用的是 masm32 的编译器,但书中对 win32 SDK  编程好像只是一笔带过,并无详细说明,我在这里就先给出对于 win32 SDK 的简单
   实现,相信大家可以举一反三:

//* * * * * * * * * * * * * *
//code by hopy|侯佩         *
//to use Win32 API with HLA *
//2006-07-12                *
//* * * * * * * * * * * * * *

program Win32ApiNow;
#include("w.hhf");
#include("wpa.hhf");

const
txt:string:="I'm Hopy";
cp:string:="windows XP";

begin Win32ApiNow;
w.MessageBox(NULL,txt,cp,w.MB_OK);
end Win32ApiNow;

(未完待续...以前画漫画的时候经常为这4个字给人骂死...呵呵)


2 关于 enum 的研究。书上 P154 页略微提到了一点 HLA 对枚举表达的实现,但作者
  同时指出内部是使用 8bits 变量存放 enum 的元素,所以enum元素数量不能超过
  256个,有趣的是在 P155 页的脚注上作者却提示:HLA 提供了一个机制,该机制可以
  指定 enum 数据类型占用 2 个或 4 个字节的空间,到此本书再也闭口不提如何达到
  该目的。那么到底可不可以让枚举占用超过1字节的空间呢?

  我在 HLA 编程指南中找到这么一段话(原话):
 
  By default, HLA uses eight-bit values to represent enumerated data types. This means that you can represent up to 256 differentsymbols using an enumerated data type. This should prove sufficient for most applications. HLA provides a special"compile-time variable" that lets you change the size of an enumerated type from one to two or four bytes. In theory, all you’vegot to do is assign the value two or four to this variable and HLA will automatically resize the storage for enumerated types tohandle longer lists of objects. In practice, however, this feature has never been tested so it’s questionable if it works well. If youneed enumerated lists with more than 256 items, you might consider using HLA const definitions rather than an enum list, just to be on the safe side. Fortunately, the need for such an enum list is exceedingly remote.

上面的确提到 HLA 可以对超过256个枚举元素的支持,其主要思想为(部分翻译如下):

HLA 自动地根据 enum 元素的数量改变空间的大小,理论上可以支持超过 256 个枚举元素。但实际上不管怎样这个特性从来没有被测试过,它有可能工作不正常。如果您要
创建超过 256 个枚举元素,您可能在 const 段中定义更好一些...

观看不试是没有用的,下面我创建了一个含有 500 个元素的 enum 类型,为了简便起
见,我使用了 HLA 的编译时语言的支持,而不是真的手工输入500个元素(谁叫偶懒哩):

program EnumTest;
#include("stdlib.hhf");

type
//以下是创建500个元素的 color 枚举:
color:enum{
?i:=0;
#while(i<500)
@text("a"+ string(i)+",")
?i:=i+1;
#endwhile
a500
 };

static
EC:color:=a500;

begin EnumTest;
//nothing...
end EnumTest;

结果是编译无法通过:

F:/HLA>hla a.hla
 Assembling: a.asm
a.data.inc(2) : error A2071: initializer magnitude too large for specified size
Error returned by Assembler = 1

真的行么?下面我将 EC:color:=a500; 改为 EC:word:=a500; 如下:

program EnumTest;
#include("stdlib.hhf");

type
//以下是创建500个元素的 color 枚举:
color:enum{
?i:=0;
#while(i<500)
@text("a"+ string(i)+",")
?i:=i+1;
#endwhile
a500
};

static
EC:word:=a500;

begin EnumTest;
//nothing...
end EnumTest;

OK,编译成功,用 ollydbg 查看, EC 变量的值正确的被赋为: 01f4h


1 HLA 用的就是 masm32 的汇编器,只不过内部有个"翻译器"将含有 HLA 语法 的 .hla 文件翻译成 标准的 masm 语法的 .asm 文件。

2 HLA 旨在探讨汇编对高级语言中一些功能的实现,比如 低级条件语句和高级条件语句的转换,汇编对高级语言中类与对象的支持,在HLA 的编译时语言中还讨论了编写高级语言语法器的可能性。

3 我同意楼上的观点,在大部分的工作中,的确不需要汇编的存在,而我也只在研究或追求速度空间的 cool 时才摆弄汇编。
  若楼上有兴趣,可以看看我写的关于 五角星问题和背包问题的汇编解法。

3 关于 HLA 中的 intmul 指令,大家如果在 intel 指令手册中找的话,结果可能会失望,因为没有该条指令。其实他只是 imul 的变种(异型?)之一:

  imul r32,r/m32,imm8/32

4 在看到移位指令的时候,我就在想是否可以不用位指令来实现移位(bt之类的指令也不用)。答案是肯定的,以下是左移一位的代码:

program mainmy;
#include("stdlib.hhf");

readonly
bitstr:byte[8]:=[%0000_0001,%0000_0010,%0000_0100,
        %0000_1000,%0001_0000,%0010_0000,
        %0100_0000,%1000_0000];

var
mb:byte;

procedurelm1(var mb:byte);
var
tmpa:byte;
tmpb:byte;
tmpi32:int32;
beginlm1;
push(eax);
push(ebx);
mov(mb,eax);
mov([eax],al);
mov(al,tmpb);
mov(al,tmpa);

mov(6,tmpi32);
while(tmpi32>=0) do
mov(tmpi32,ebx);
and(bitstr[ebx],al);
mov(bitstr[ebx+1],al);
jnzt0;
not(al);
and(al,tmpb);
jmpt1;
t0:
or(al,tmpb);
t1:
dec(tmpi32);
mov(tmpa,al);
endwhile;

and(%1111_1110,tmpb);
mov(mb,eax);
mov(tmpb,bl);
mov(bl,[eax]);
pop(ebx);
pop(eax);
end         lm1;

begin mainmy;

mov(%0101_0111,mb);
stdout.put("the value before transfer is ",mb,nl);
lm1(mb);
stdout.put("after transfer the value is ",mb,nl);

end mainmy;


5 我在上面说过了 HLA 的编译时语法的功能是很强的,现在做一个小的实例是通过
  编译时宏将 ascii字符串 转换成 宽字符串。要说明的是这个转换很简单,只是一
  个小例子其中还有很多没考虑到的地方:

program test0;
#include("stdlib.hhf");

#macroctrlstr(thestr);
?maxlen:=@length(thestr);
?i:=0;
@text("ustr:char[maxlen*2+2]:=[")
#while(i?strnow:=@substr(thestr,i,1);
@text("#0,'"+strnow+"',")
#print(strnow)
?i:=i+1;
#endwhile
@text("#0,#0];")
#endmacro;

static
ctrlstr("kinds");

begin test0;

     //do nothing ...

end test0;

你可能感兴趣的:(其它,未分类)