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實現上有問題,其實不然。
當然本書自身翻譯的不自然和漏字錯字也還是存在的,這也算翻譯作品的通病吧。而且譯者好像缺乏了一點幽默感(我沒看過英文原著),但從某些句子段落的咀嚼似乎又能讓你會到原作作者的幽默天才(很多原作作者的語言都是很生動和詼諧幽默的,例如另一本:<<WIN32 API 編程 for VB>>)。但不管如何該書還是很有看頭的,其中還探討了使用 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<maxlen)
?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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章