-
2006-09-03
HLA简单简单实例 ——《汇编语言编程艺术》
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://www.tuenhai.com/logs/3219335.html
HLA简单简单实例 ——《汇编语言编程艺术》
学习汇编是比较枯燥的,从HLA入门学习汇编就比较容易些。
《汇编语言编程艺术》以X86系列微机为背景,从简单的Hello程序开始,系统而详细地阐述了X86微机汇编语言编程的各种基础知识和编程技巧,内容涉及到数据表示、存储器管理、各种数据类型、过程、与汇编语言相关的体系结构、控制结构、文件、宏指令、位处理指令、字符串指令、MMX指令、类和对象,以及混合语言编程等,尤其是在高级汇编语言(HLA)方面,该书给予了细致深入的讲解。对于有意学习X86汇编语言编程的程序员来说,这是一本难得的好书。本书的作者Randall Hyde在大学中教授汇编语言十多年,并且开发了好几个商用软件,具有丰富的汇编语言开发经验。该书的英文电子版受到了成千上万的网站和高级程序员的高度评价,已经成为了高级汇编语言编程方面的一本经典之作。虽然该书的出版时间不长,但在Amazon上为该书作出评价的人很多,而且几乎所有的人都给予5星的评价,可见其内容之好。笔者相信,随着时间的推移,它在程序员中的影响回越来越大。
汇编语言编程艺术 可到作者主页去下载英文电子版 http://webster.cs.ucr.edu/
《汇编语言编程艺术》中文版部分章节在线阅读:
http://act.it.sohu.com/book/serialize.php?id=531#content汇编语言编程艺术 网上还可以找到视频教程。比如这里 http://www.so138.com/so/so138.aspx?id=1269 可用讯雷下载。
先安装Hla 和RadASM,RadmASM的安装设置见www.tuenhai.com的另一篇文章。本文例子用的是 HLA version 1.86, RadASM version 2.2.0.9。http://jhkdiy.go3.icpcn.com 有RadASM的中文教程。先在ra(RadASM的简称,下同)新建一工程,我取名testhla
我们所有的学习实例都写在testhla.hla中。
《汇编语言编程艺术》实例一:
Program hello;
#include("stdlib.hhf")
begin hello;
stdout.put("hello,www.tuenhai.com");
stdin.readLn();//不写这句,屏幕就会一闪而过
end hello;在ra中,按F5编译,按Ctrl+Shift+F5运行。
《汇编语言编程艺术》实例二:
Program readLn;//从屏幕读取输入并显示
#include("stdlib.hhf")
static
InitValue:int32 :=556677;
NotInitialized:int32;
begin readLn;
stdout.put( "hello,tuenhai.com, InitValue's value is ",InitValue,nl );
stdout.put( "Pls Enter an integer value");//如果输入非数字,会因类型不对而出错
stdin.get( NotInitialized );
stdout.put( "You entered ",NotInitialized, nl )
stdin.readLn();//没有这行,屏幕会一闪而过
end readLn;《汇编语言编程艺术》实例三:
Program movAddSub;//学习mov add sub指令
#include("stdlib.hhf")
static
i8:int8:=-8;
i16:int16:=-16;
i32:int32:=-32;begin movAddSub;
mov(0,al);//8位寄存器al置0
sub(i8,al);//al-=i8
mov(al,i8); //i8=al
mov(0,ax);
sub(i16,ax);
mov(ax,i16);
mov(0,eax);
sub(i32,eax);
mov(eax,i32);
stdout.put("After negation:i8=",i8,nl,
"i16=",i16,nl
"i32=",i32,nl
);//nl是换行,newline
add(56789,i32);//i32+=56789
stdout.put("after Add:i8=",i32);
stdin.readLn();
end movAddSub;《汇编语言编程艺术》实例四:
Program forWhile;//学习for,while循环
#include("stdlib.hhf")
static
i:int8;begin forWhile;
for ( mov(0,i);i<30;add(2,i) ) do//for 循环,初始值;条件,步进
stdout.put("i=",i,nl);//在屏幕上打印出来
endfor;
stdout.put(nl,nl)
mov(0,i);//i初始值为0
while(i<15) do
stdout.put("i=",i,nl);
add(3,i);//步进为3
endwhile;
stdin.readLn();
end forWhile;
《汇编语言编程艺术》实例五:Program repeatForever;//学习repeat,forever
#include("stdlib.hhf")
static
i:int32;begin repeatForever;
mov(10,ebx);//ebx=10
repeat
stdout.put("ebx=",ebx,nl)
sub(1,ebx);//ebx-=1
until( ebx=0 );//当ebx=0时停止循环
stdout.put(nl);//输出一个空行
forever
stdout.put("Enter an integer less than 79",nl);
stdin.get(i);//读取输入值赋给i
breakif(i<79);//输入值正确就退出
stdout.put("The value needs to be less than 79",nl);//输入不正确就提示
endfor;
stdin.readLn();
end repeatForever;
《汇编语言编程艺术》实例六:Program testTry;//try..exception..endtry语句处理异常
#include("stdlib.hhf")
static
i:int16;
b:boolean:=false;begin testTry;
repeat
try
stdout.put("Enter an integer less than 79",nl);
stdin.get(i);//把输入值赋给i
if (i<79) then//如果输入值正确就退出repeat
mov(true,b);
endif;exception(ex.ConversionError);//输入非数字时引发的异常
stdout.put("Illegal numeric value,please re-enter",nl);
exception(ex.ValueOutOfRange);//输入数字超过i(int16)的最大值时引发的异常
stdout.put("Value is out of range,please re-enter",nl);
endtry;
until( b );//当ebx=0时停止循环
stdin.readLn();
end testTry;随机文章:
HLA安装与设置——汇编语言教程之《汇编语言编程艺术》 2006-09-01我的第一个汇编小程序 WinExec函数的使用 2006-08-29汇编语言程序设计教程汇总,Windows环境下32位汇编语言程序设计, 2006-08-282007以来的第一个太阳 2007-05-30做一个什么样的网站,怎么做 2006-10-04
收藏到:Del.icio.us
评论
作者:英国《金融时报》居伊•德•容凯尔(Guy de Jonquieres)
2006年9月5日 星期二
我
搬到亚洲后最惊奇的发现之一是,对于亚洲令人叹为观止的崛起以及它的未来发展方向,很少存在理论层面的好奇心。尽管亚洲的全球影响力日益增加,但无论是经济学、商业、社会政策,还是国际关系,该地区诸多事务方面最具启发性的研究,有许多都发源于其它地区,主要是西方。
亚洲不缺脑力人才或自封的智库。但大部分产生的是乏味的成果,往往不针对真正的难题,更别提解答了。许多成果只不过是官方宣传,而且几乎没有人看到自己的小天地之外。用熟悉亚洲的瑞士商学院教授让-皮埃尔•雷曼(Jean-Pierre Lehmann)的话来说,亚洲智库不少,但思想不多。
诚然,许多西方智库也不过是其资金赞助者的喉舌。但还是有一些最优秀的智库,深入挖掘事实,严格加以筛选,质疑现有政策,并寻求制订出新的方向。偶尔,它们能够播下革新的种子,就像对英国撒切尔夫人(Baroness Thatcher)的思想产生深刻影响的那些智库一样。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
亚洲根本没有思想的市场。中国的经济增长固然令人瞠目,但令人印象深刻的是其大胆的“执行”成就,而不是独创的发展思想。约10年前,“亚洲价值观”被作为一种与众不同的哲学思想在该地区宣传,但这些价值观只是出于证明威权政府正当性的自私企图。
相比之下,新颖思想是由智力辩论与理智反驳所激发的。它们往往在英美等国大量涌现,这绝非偶然。这些国家宽容甚至鼓励这些活动,认为这些活动有益社会。在亚洲,只有印度拥有与之媲美的传统,该国有一些具备显著独立思想的研究机构。印度裔学者阿玛蒂亚•森(Amartya Sen)将这种传统追溯到公元7世纪的佛教结集会,结集会通过热烈讨论来探求真理。
在亚洲其它地区,质疑现存秩序的做法受到反对,即便威权政府并未对其压制时也是如此。对权威出自本能的顺从、家长作风以及不愿让别人丢脸的心态,抑制了公然的挑战与批评。正如森教授在《好辩的印度人》(The Argumentative Indian)一书中指出的,非正统观点往往会引起猜疑,认为这些观点是由夺权野心所激发,而不是为了获得更好的结果。
亚洲典型的处事方法是接受现状,而不是设法彻底改变现状:遇到路障就绕过,而不是推平。这种做法往往能获得丰厚回报。亚洲企业“化障碍为机遇”的本领,在很大程度上是该地区活力的关键。同样,亚洲各国政府的实用主义使经济一体化得以推进,尽管彼此间深刻的不信任常常令它们分裂。亚洲各国政府让市场力量去推动一体化,而不是通过法律与条约来推动这一这一进程。
然而,安于现状也是有代价的。它不能培育出激发创新所需的充满活力的探究精神,而创新则是许多亚洲新兴经济体热衷于鼓励的。企业与政治力量“和睦相处”的意愿,很容易堕落成任人唯亲和违背公共利益的暧昧合谋。这种例子在亚洲不胜枚举。
如果不敦促政府探索“想都不敢想的”彻底改革,并借助外部审查对政府进行经常问责,政策制定也会受到影响。隐现的问题可能不易察觉,待发现后为时已晚,而多种解决方法也被忽略。外交关系和国内事务都是如此。正如东南亚国家联盟(ASEAN)认识到的那样(尽管这种认识姗姗来迟),一味遵循最小阻力路径(course of least resistance)只会导致停滞不前。
如果亚洲希望能够应对未来发展所带来的巨大挑战,它需要一个更加活跃的思想市场。这些挑战正日益跨越国界,并存在于保健、移民、运输和环境等诸多领域。亚洲缺乏可以制定共同解决方案的共有机构和论坛,这使得对高瞻远瞩的思想的需求更大了。
但利用这些思想的最大障碍并非缺乏优秀的智库,而是对智库观点的疲弱需求。香港思汇政策研究所(Civic Exchange)是该地区最好的智库之一,还是推动变革的有力参与机构。然而,它针对政府政策提出了论证有力、基于事实的批评,但这既未阻止政府加紧推行考虑不周且不必要的建议,如征收商品和服务税,也没能促使政府认真解决香港糟糕的空气污染问题。
当然,香港政府对选民也是无须负责的。但在台湾或菲律宾等年轻的民主政体中,情况也大同小异。它们都处于混乱之中,但原因并不仅仅是领导阶层无能,还因为反对党立法者们更热衷于将现任政府赶下台,而不是推动积极的政策议程。
所有市场都同时需要买方和卖方。在更多的亚洲政策制定者愿意提供言论机会之前,倡导建设性变革的批评者们,将难以让人们听到自己的声音。
译者/张征