5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

[探讨/原创] 关于 HLA 的学习心得

楼主mydo(侯佩|hopy|ks)2006-07-12 09:58:23 在 其他开发语言 / 汇编语言 提问

最近我看到不少兄弟在问关于   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个字给人骂死...呵呵)  
  问题点数:100、回复次数:85Top

1 楼liuxiaoyi666(MSMVP 小猪妹荣誉马甲之八卦兔子)回复于 2006-07-12 10:39:00 得分 0

观察.....  
   
  我记得国内有一本书的,win32与汇编....Top

2 楼icuc88(职业特种兵)回复于 2006-07-12 11:09:54 得分 0

good   work,   please   go   on.Top

3 楼liuxiaoyi666(MSMVP 小猪妹荣誉马甲之八卦兔子)回复于 2006-07-12 11:14:40 得分 0

特种兵比偶还无聊的说  
   
  我记得是王啥云的....已经记8得了Top

4 楼mydo(侯佩|hopy|ks)回复于 2006-07-12 14:53:50 得分 0

[续1]  
   
  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  
   
   
  (未完待续...)Top

5 楼jinjazz(近身剪)回复于 2006-07-12 15:19:48 得分 0

看不懂-_-||Top

6 楼liangqingzhi(老之)回复于 2006-07-12 23:20:58 得分 0

看不懂-_-||Top

7 楼xyjdn(项有建^_^)回复于 2006-07-13 01:21:19 得分 0

晕,这些我哪会?只能帮你顶贴了。Top

8 楼xixuemao(钱不是问题,问题是没钱)回复于 2006-07-13 08:32:50 得分 0

曾经想好好学习汇编,但是.......看不懂-_-||Top

9 楼windindance(风舞轻扬·白首为功名)回复于 2006-07-13 08:49:38 得分 0

有点晕……  
  这难道是……传说中的汇编?  
   
  飘过Top

10 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-07-13 08:53:55 得分 100

汇编挺好玩滴  
   
  vb用是挺有难度滴  
   
  你没有例子我是不会用滴  
   
  哈哈Top

11 楼lw549(那个孩子他爹)回复于 2006-07-13 09:08:06 得分 0

HLA是什么?Top

12 楼mydo(侯佩|hopy|ks)回复于 2006-07-13 09:10:02 得分 0

to   lw549(那个孩子他爹)  
   
  全称是高级汇编语言,使用了很多高级语言的机制。Top

13 楼jinjazz(近身剪)回复于 2006-07-13 09:17:39 得分 0

这年头连汇编都快oop了?Top

14 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-13 09:28:31 得分 0

学习了   ...  
   
  呵呵,   楼主系强人   ...  
  暂时还没有接触   界个冬冬   ...Top

15 楼syy64(太平洋)回复于 2006-07-13 09:39:21 得分 0

偶对汇编没什么研究,楼主知道我?Top

16 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2006-07-13 09:53:18 得分 0

谢谢你看了不才的博客  
  你的夸奖和鼓励是我的动力  
  有点意思  
  不过不才没有看过这本书  
   
  但是字里行间我感觉到了一个问题  
   
  那就是   我们为什么选择汇编语言?  
   
  自然,如果一部分代码需要用汇编语言来实现,  
  明显的需求是我们需要高效率的代码  
   
  但是,由于对Hla的不了解,  
  所以对效率的问题我也不干肯定  
   
  另外我个人觉得HLA其实是做了一层汇编的解析,然后使用了一个高一层次的编译器而已  
  如果汇编失去了他的效率价值  
  我们还不如使用简单的C++了  
   
  兄弟的那些代码只需要两行(我这里以C++Builder为例)  
   
  for(int   i   =   0   ;   i   <   500   ;   i++)  
                ShowMessage((IntToStr(i)));  
   
  那我们为什么还要用那些晦涩难懂而且效率还不如汇编的东西呢  
   
  一己之见  
  有板砖欢迎拍过来。Top

17 楼lw549(那个孩子他爹)回复于 2006-07-13 10:03:50 得分 0

对了,那本书粗略的翻过,诚如楼上所说,感觉跟高级语言没什么区别了  
  感觉比MS的宏汇编更高级一些,方便一些,对于像楼主这样的汇编老鸟,这点改变也许根本无所谓  
   
  汇编支持OO,感觉没必要,毕竟,汇编是用在对效率,内存要求苛刻的场合,这些场合是不适合OO的  
  如果要OO,还不如直接用c++方便  
   
  (个人观点,献丑献丑)Top

18 楼windindance(风舞轻扬·白首为功名)回复于 2006-07-13 10:05:02 得分 0

个人认为:  
  使用汇编的地方:  
  1   极少数地方需要用汇编来优化。  
      但除了多媒体处理,现在似乎没有太多地方需要这样优化的。  
  2   学习,了解深层架构。  
      但我觉得mov   eax,eax   这种代码更亲切一些……  
  3   嵌入式开发  
      同上,我认为还不如用C。  
  总之,我认为所谓高级汇编语言没有什么用处……  
  C语言就已经是高级汇编语言了……Top

19 楼mydo(侯佩|hopy|ks)回复于 2006-07-13 10:07:55 得分 0

感谢楼上捧场:  
   
  1   HLA   用的就是   masm32   的汇编器,只不过内部有个"翻译器"将含有   HLA   语法  
      的   .hla   文件翻译成   标准的   masm   语法的   .asm   文件。  
   
  2   HLA   旨在探讨汇编对高级语言中一些功能的实现,比如   低级条件语句和高级      
      条件语句的转换,汇编对高级语言中类与对象的支持,在HLA   的编译时语言中  
      还讨论了编写高级语言语法器的可能性。  
   
  3   我同意楼上的观点,在大部分的工作中,的确不需要汇编的存在,而我也只在  
      研究或追求速度空间的   cool   时才摆弄汇编。  
      若楼上有兴趣,可以看看我写的关于   五角星问题和背包问题的汇编解法。  
   
  Top

20 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2006-07-13 11:09:59 得分 0

强烈的支持楼主的工作,最好也能发到自己的blog上。  
  Top

21 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2006-07-13 11:18:34 得分 0

to   windindance(风舞轻扬·白首为功名)   :  
   
  观点基本站同  
   
  to   mydo(侯佩|hopy)   :  
    对你的第一个回复,我的看法:  
   
  既然还是做了一层包装  
  效率要缩水是很自然的  
  所以我觉得不如直接使用ASM了  
   
  当然就如windindance(风舞轻扬·白首为功名)   所说  
   
  去了解他的架构也不为过  
  呵呵  
  小弟也支持贴主的做法  
  当然我对这个技术的看法就是  
   
  他不应该能走得很远  
  顶多有一些用户研究玩玩而已  
  不能登上大雅之堂  
   
  而且很多IDE还是不支持他的  
  你说呢?Top

22 楼wudi_1982(向伴水学习|胃出血,住院中)回复于 2006-07-13 11:19:04 得分 0

我喜欢汇编Top

23 楼mydo(侯佩|hopy|ks)回复于 2006-07-13 11:24:37 得分 0

to   huzhangyou(信仰(http://blog.libing.net.cn))    
   
  没错,尽管有   RadAsm   ,editplus2   +   asm语法,但还是要借助其他的工具,比如  
  处理资源文件等等。Top

24 楼chang_bo(夜鹰 MS MVP http://blog.sina.com.cn/changbo)回复于 2006-07-13 12:36:39 得分 0

学习!Top

25 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2006-07-13 12:41:45 得分 0

呵呵  
  其实真正的开发很少用到这些  
   
  前几天买了一本   于渊   写的   自己动手写操作系统  
  我也推荐兄弟买一本  
  当然我不是做广告哦  
  他和我非亲非故  
  只是我觉得很好  
  这本书我认为在同行中已经达到了相当的水平  
   
  这本书我其实是买下来收藏的  
  并不是一定要看  
   
   
  那些什么Linux源代码分析乱七八糟的书籍  
  其实根本不适合一些读者的  
  只是被超作才如此的  
   
  真正的好的书籍  
  其实是一些年轻的作者写出来的  
   
  比如林锐   myan,Littleboy等等  
   
  当然我不排除一些好的老师  
   
   
  请看我这篇文章  
  http://www.libing.net.cn/boblog/read.php?359  
  中国教育的悲哀和期盼   [原创]Top

26 楼treeroot(旗鲁特)回复于 2006-07-13 13:40:33 得分 0

upTop

27 楼mydo(侯佩|hopy|ks)回复于 2006-07-13 13:46:27 得分 0

to   huzhangyou(信仰(http://blog.libing.net.cn))  
   
  请看我这篇文章  
  http://www.libing.net.cn/boblog/read.php?359  
  中国教育的悲哀和期盼   [原创]  
   
  good!Top

28 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2006-07-13 13:55:13 得分 0

呵呵  
  非常谢谢你的夸奖  
  或许我去评价这种教育事业  
  有点太嫩了  
  呵呵Top

29 楼fim(阿初)回复于 2006-07-13 14:43:55 得分 0

mark,我来学习的Top

30 楼constantine(飘遥的安吉儿)回复于 2006-07-13 15:04:02 得分 0

汇编?世界每天都在变化着Top

31 楼pomelowu(羽战士)回复于 2006-07-13 15:49:14 得分 0

谢谢,markTop

32 楼bobob(静思)回复于 2006-07-13 15:52:46 得分 0

markTop

33 楼lfchen(一条晚起的虫--床上用品[家纺]专卖)回复于 2006-07-13 16:03:53 得分 0

现在就在搞小单片机的时候摆弄一下汇编,都是好几年前的老古董了。现在的汇编发展基本上没关注了。  
  支持楼主的工作。Top

34 楼halfdream(哈欠)回复于 2006-07-13 16:21:24 得分 0

好歹以前学过汇编.就算99%不懂..还是懂是1%的.  
  .支持之......Top

35 楼CoolSlob()回复于 2006-07-13 17:38:50 得分 0

收到消息~   UP之~~Top

36 楼lexchou(龍子龍孫)(本人已死)(有事烧纸)回复于 2006-07-13 17:46:50 得分 0

没用过HLA,以前经常在masmforum.com转,也经常看到过Randall   Hyde在那出没,对HLA的理解不深,仅限于了解HLA是Randall   Hyde在教书的时候为了让学生更容易理解汇编而做出来的。  
   
  Top

37 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2006-07-13 17:55:32 得分 0

CoolSlob(CSDN论坛浏览器http://CoolSlob.ys168.com/)    
  lexchou(龍子龍孫)(本人已死)(有事烧纸)  
   
  两个都是高人啊  
  好像是哪个地方的大牛Top

38 楼xyjdn(项有建^_^)回复于 2006-07-13 17:59:00 得分 0

可以看看我写的关于   五角星问题和背包问题的汇编解法。  
   
  //楼主也对人工智能有兴趣?  
   
  //近些日子也看了点人工智能相关的资料,不过不涉及代码层面(主要是看不懂代码)Top

39 楼kugou123(酷狗)(彪悍的人生,不需要解释 www.xiaozhou.net)回复于 2006-07-13 20:27:52 得分 0

有意思,这个语法和win32   汇编差别很大,看起来又有点类似delphi的语法Top

40 楼striking(庸人自扰)回复于 2006-07-14 09:27:30 得分 0

不懂,upTop

41 楼handsomerun(毛毛)回复于 2006-07-14 09:41:01 得分 0

不错,做个记号,学习Top

42 楼codewarrior(会思考的草)回复于 2006-07-14 10:31:20 得分 0

被楼主召唤过来的:)  
  我没有学过HLA,《汇编语言艺术》这本书虽然是如雷贯耳的名作,但是我一直没有买,主要是我不太喜欢这种高低不就的半吊子语言,何况喜欢用ASM写OO程序的话,完全可以用TASM5,它和MASM差别比较大,TASM通篇贯彻了一种OO的思想,而MASM越来越象过程化的C语言。喜欢写OO的coder可以尝试一下TASM,唯一的缺点就是用它写Windows程序的话,相应的库和inc文件都很缺乏,不过似乎有志愿者在做整理收集的工作——当然还是比不上MASM的那个包。Top

43 楼alex6520(还有不明,请短信联系)回复于 2006-07-14 18:23:41 得分 0

不懂程序Top

44 楼supergreenbean(超级绿豆(MSMVP - VB) - 升级归来~)回复于 2006-07-15 11:03:00 得分 0

amen,相当的深奥,偶是菜鸟..........  
  Top

45 楼casazaft()回复于 2006-07-15 17:07:13 得分 0

ding   .......  
  我学masm   masm32   c   pascal   c++   delphi   java   c#   ......一个比一个的马甲大......  
  好不容易把他们分清........Top

46 楼YuLimin(阿敏总司令:简单就是美—钻石闪闪您快结贴!)回复于 2006-07-17 20:02:41 得分 0

:(Top

47 楼mydo(侯佩|hopy|ks)回复于 2006-07-20 10:13:15 得分 0

[续2]  
   
  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;  
   
  procedure lm1(var   mb:byte);  
  var  
  tmpa:byte;  
  tmpb:byte;  
  tmpi32:int32;  
  begin lm1;  
  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);  
  jnz t0;  
  not(al);  
  and(al,tmpb);  
  jmp t1;  
  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;  
   
  (未完待续...)  
  Top

48 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2006-07-20 23:25:39 得分 0

继续关注这个帖子  
  呵呵  
  Top

49 楼flyforlove(吾将远去)回复于 2006-07-21 10:08:22 得分 0

anyway,   先mark一下。Top

50 楼mydo(侯佩|hopy|ks)回复于 2006-07-25 16:40:24 得分 0

希望各位多交流心得~Top

51 楼gemhop(真美好)回复于 2006-08-01 12:33:17 得分 0

lw549(那个孩子他爹)   (   )   信誉:100     2006-7-13   9:08:07     得分:   0      
     
     
         
  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.eduTop

52 楼mydo(侯佩|hopy|ks)回复于 2006-08-02 18:02:11 得分 0

好~Top

53 楼pzt2004(冰块)回复于 2006-08-02 20:07:56 得分 0

看大侠们过招,偶在一边偷着乐   :)Top

54 楼mydo(侯佩|hopy|ks)回复于 2006-08-05 19:25:51 得分 0

[续]  
   
  5   我在上面说过了   HLA   的编译时语法的功能是很强的,现在做一个小的实例是通过  
      编译时宏将   ascii字符串   转换成   宽字符串。要说明的是这个转换很简单,只是一  
      个小例子其中还有很多没考虑到的地方:  
   
  program test0;  
  #include("stdlib.hhf");  
   
  #macro ctrlstr(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;  
  Top

55 楼fishboy007()回复于 2006-08-05 23:47:17 得分 0

受益匪浅啊   搬个板凳学习!Top

56 楼tomtom123(abc)回复于 2006-08-07 13:07:39 得分 0

MARKTop

57 楼junki(『.NET技术争霸天下』)回复于 2006-08-07 18:41:47 得分 0

Very   Good.Top

58 楼jc()回复于 2006-08-08 22:20:01 得分 0

可以下载fhlasetup.exe,那个程序。那个不需要下MASM32的东西。Top

59 楼daishengs(横舟摆渡)回复于 2006-08-11 10:50:19 得分 0

markTop

60 楼lielvbu()回复于 2006-08-16 12:42:50 得分 0

wooTop

61 楼mydo(侯佩|hopy|ks)回复于 2006-09-03 12:59:30 得分 0

upTop

62 楼zxy_net()回复于 2006-09-04 10:56:43 得分 0

有些象DELPHI语法,我以前也看过,还用了不少IDE,RADASM,HIDE,MASM,WINASM等等,不错,有些内核需要用这些东西,但既然是HLA,高级汇编,为什么不用类C的语法呢,非要用DELPHI,不是我感情上过不去,而是习惯上不太好改,动不动就会因为变量声明,赋值而出现错误.  
   
  提外话:MASM也不错,特别是INVOKE功能,但是动不动就要在字符串前加ADDR,或者OFFSET,什么时候加什么时候不加,不太清楚,不是太懂,汇编,呵呵,搞的云里雾里,瞎摸Top

63 楼mydo(侯佩|hopy|ks)回复于 2006-09-24 10:15:31 得分 0

顶起~Top

64 楼lj860603(跑吧,键键)回复于 2006-09-24 12:34:20 得分 0

顶!Top

65 楼Knight94(愚翁)回复于 2006-09-26 18:54:37 得分 0

好帖子。  
  文章涉及的点不错,汇编语言是好东西。  
   
  不过现在用它写东西的人比较少了,除非是做硬件相关的。  
   
  现在习惯了高级语言编写的人,很难再返回去使用汇编语言写程序,这种观念转换一时很难适应。  
   
  而且现在程序开发来说,整个程序用汇编写得可能性并不大。一般比较合理的是,用汇编来写某个核心算法,然后在应用程序中进行嵌入。Top

66 楼Knight94(愚翁)回复于 2006-09-26 18:58:07 得分 0

给个建议,你可以写一篇文章,关于如何把HLA写的模块嵌入到其他高级语言中,这样可能更有用。Top

67 楼mydo(侯佩|hopy|ks)回复于 2006-10-07 18:11:22 得分 0

了解~希望正在学 hla 的朋友也说说自己的体会~Top

68 楼mydo(侯佩|hopy|ks)回复于 2006-10-19 12:53:55 得分 0

en~upTop

69 楼freshairfly(无知的虾米)回复于 2006-10-20 09:08:25 得分 0

前一阶段买了《汇编语言编程艺术》,英文版的,看了一两百页,说实话写的很不错。不过我学习汇编的目的主要还是为了在程序crash时能够从反汇编代码中找到问题的所在,可能由于我急功近利的心态,我没有看下去,因为我只想学习纯粹的汇编,不想花太多的时间学习被别的东西包装一层的汇编。Top

70 楼swimmer2000(时间是用来浪费的,所以每当我做了一点事都觉得很自豪)回复于 2006-10-20 15:35:16 得分 0

不错Top

71 楼qing_li73(Vincent Lee)回复于 2006-10-20 17:05:53 得分 0

"What   do   I   Need   to   Know   to   Learn   Assembly?  
  The   Art   of   Assembly   Language   Programming   assumes   that   the   reader   already   knows   at   least   one   high   level   programming   language   like   Visual   BASIC,   C/C++,   Java,   or   Pascal/Delphi.   If   you   understand   the   basics   of   computer   programming,   you're   ready   to   learn   assembly   language   programming!"  
   
  pieces   from   the   official   site,   it   sounds   interesting....reverse   method   ...//ponderTop

72 楼mydo(侯佩|hopy|ks)回复于 2006-10-31 21:45:48 得分 0

enTop

73 楼ciahi(爪哇乞丐)回复于 2006-10-31 23:18:16 得分 0

我从图书馆借了一本关于HLA的书,就是汇编语言编程艺术  
   
  看了下,确实就是高级语言。  
   
  我想问一下,HLA跟其他的语言比起来有什么优点?有什么缺点?HLA适合开发大型的工程不?还有,我现在也想学Win32汇编(以前没有Windows编程的经历),应该先学哪个?  
   
  谢谢楼主了Top

74 楼mydo(侯佩|hopy|ks)回复于 2006-11-01 09:23:19 得分 0

1   hla   中有很多高级语言的特征比如语法套接函数:  
   
      fuc1(fuc0(),eax,ebx);  
   
      但在一般的汇编中除非用宏之类的咚咚,一般无法做到  
      这只是一个简便的例子。还有很多。它可以来了解很多高级语言的特征实现,比如  
      类、对象、构造函数底层如何实现等等。缺点就是感觉很像高级语言,有时反而  
      失去了原来汇编的简洁性。  
   
  2     HLA   我觉得不太适合写大型的工程,至少现在是这样原因有如下:  
   
        a.   他本身只是叫你如何学好汇编的一个工具  
        b.   书中有很多地方实际中是无法实现的,比如我在此贴中的一个地方。  
        c.   该书有大量的内容没有讲到,你必须运用你无与伦比的E文查阅参考手册  
   
        但用它来写小型的程序还是可以的。  
   
  3     学   win32汇编的话建议从   masm32   入手,因为有现成的很好的中文参考书:  
        <<win32汇编语言程序设计>>。但用   hla   也可以学习   win32   汇编,如果  
        想的话,当然也可以试试,可以看此贴中的一个例子。  
   
  总的来说,这本书适合比较牛的人看,哇哈哈(当然只是开玩笑了)  
   
  Top

75 楼ttf345(345*别傻了)回复于 2006-11-01 10:00:47 得分 0

學習學習Top

76 楼ciahi(爪哇乞丐)回复于 2006-11-01 13:12:20 得分 0

谢谢楼主了~Top

77 楼mydo(侯佩|hopy|ks)回复于 2006-11-06 10:09:43 得分 0

不客气Top

78 楼dongyi940333(科斯塔)回复于 2006-11-06 23:12:03 得分 0

一个字,牛,奋斗!!!Top

79 楼qixiaorui(戚利)回复于 2006-11-07 13:48:45 得分 0

因为从dos和dbase时代走过来,曾经痴迷于把二进制地图写进程序,修改boot   straper,往教师机上猛灌TSR,后来学多了OOP,什么都来得太简单,天天重复无聊的业务逻辑开发,没有以前用脑子构思的乐趣了.所以没有事情的时候还是喜欢汇编.喜欢脑子一刻不停地转动.呵呵,就是喜欢,没有办法.  
   
  孩子上小学了,用汇编给孩子写了个拼音助读小工具,不用每天晚上指着拼音,掐着秒表让孩子读了,压缩后大小才50K,绿色方便.  
  源代码在这里可获得:  
  http://blog.csdn.net/qixiaorui/archive/2006/11/07/1370893.aspxTop

80 楼mydo(侯佩|hopy|ks)回复于 2006-11-07 17:17:09 得分 0

楼上最近好像不怎么来了~谢谢捧场Top

81 楼qixiaorui2000()回复于 2006-11-08 12:33:34 得分 0

呵呵,下乡了~谢谢关注,支持原创,支持开源Top

82 楼mydo(侯佩|hopy|ks)回复于 2006-11-13 15:54:42 得分 0

upTop

83 楼thinkSJ()回复于 2007-01-08 20:12:39 得分 0

完全不懂这个,对我来说汇编是用来应急的,一般用不到它,这贴正好扫盲了:)  
   
  UP   hopy  
   
  Top

84 楼mydo(侯佩|hopy|ks)回复于 2007-01-14 18:22:29 得分 0

up   againTop

85 楼mydo(侯佩|hopy|ks)回复于 2007-01-25 12:52:01 得分 0

up   exTop

相关问题

关键词

得分解答快速导航

  • 帖主:mydo
  • aspower_

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问