喜欢Linux的朋友,交流交流呐......

汇编语言学习笔记1

上一篇 / 下一篇  2008-03-10 09:51:41

查看( 1679 ) / 评论( 5 )
最近觉得汇编语言挺有意思的,就寻思着学下!后来在网上,逛着.找了一些相关资料,但是不是很好.最后找到一本叫《The Art of Assembly Language》(汇编语言编程艺术),作者是美·Randall Hyde,听说这本书很牛的.在网上的评价也很高,所以我就用这本书开始汇编的学习,看看它是否有这么好?!
Fy?"I&g\0
u Ym m%p zj0l0    这本书采用的编程环境是:HLA+masm32;(具体的搭建方法,可在网上找到,如果实在找不到,请看本篇最后的附录.)LUPA开源社区"|5G*P+x m:rIjT

(P1A'c#c+C/z-W0    下面是我前几天的笔记,因人而宜.呵呵.LUPA开源社区'lQl O7XF3d#{i
LUPA开源社区J8E:MpViy2Q
    1.HLA结构:            例:
\a!K,w#bP2|8I0
{(Q5y:fs Py0    program pgmID;        program helloWorld;LUPA开源社区IGzfr
LUPA开源社区$T9I\ Em G9Z
          声明部分           #include("stdlib.hhf");LUPA开源社区5z(B"N hI1e
LUPA开源社区V)q:U?D2JY6Gh i-O
    begin pgmID;          begin helloWorld;LUPA开源社区q#\6T5rwh.wp
LUPA开源社区*b@]9RR+s9K h
          主程序可执行语句    stdout.put("Hello,world!",nl);LUPA开源社区/z!WyU!a

)@2Wu9e.u%b&Gz0    end pgmID;            end helloWorld;
3Z0}#Z&c X%j5_0
X#jq1A4k3i6ts|4x0    关于例子的说明:#include("stdlib.hhf");这里的“;”可以不用加,stdout.put();语句引号中的内容可以多行表示,"nl"表示换行且它前面的","也可以省略.
XV;Z IK1n#m0
{ PtW%EQjr g1n |7f,x0    2.HLA数据声明LUPA开源社区&^+o(LM4QO
LUPA开源社区j u}C`bN S4w
    格式:                     例:
(a.}b^1bx9fwd!l0
Z3S'S,i@P)j.F;?0    static                        static  LUPA开源社区4FE]wC{ls

q)p` \)A;h*g)f0      变量名:数据类型[:=初值];            i8:int8:=8;LUPA开源社区R a+u!b"Qg
LUPA开源社区 cOC5t3]Nt9\A
                                       i16:int16:=1600;
K6Fy-F)R |0?"O$A*f3?nM0LUPA开源社区7S,}(l`$s
                                       i32:int32:=320000;
hF%{G.~8^6i~0
_CsFV0    int8,定义一个字节(即8位)带符号的整型数;LUPA开源社区K O ~ W)v%gh
LUPA开源社区8DKa/o)ET
    int16,定义两个字节(即16位)带符号的整型数;
9j*T%b,x sp0LUPA开源社区G4A%\1je&[p"jz
    int32,定义四个字节(即32位)带符号的整型数;
H?9SC6e TmKm0
.gx3sR8L6c0    布尔值:1 真 true,0 假 false; 关键字:boolean,可初始化true或false.未进行初始化的默认为false.输出语句:stdout.put(布尔变量); 结果为true或false.
|d c4{ y)G h0
[u`MR3d'yM q0    字符值:单字节的ASCII字符对象,关键字:char.
vZ,C-^w3e#N0
A%s1D1H~6sSn0    3.Intel 80X86处理器LUPA开源社区#`;y#aSR@

ibD+E(Ehb0    Intel系列CPU:归为冯·诺依曼式机器;
6O;rY S%\2rU0
l1I NAv(eh9U#ix b0    中央处理器、存储器和输入/输出设备(I/O),通过系统总线相连,其中寄存器是其最主要的特征.LUPA开源社区1O'q*v7l{-t,c5l

4bu,[z'q0    80X86 CPU寄存器:通用寄存器,特殊目的寄存器,段寄存器,特殊目的核心模式寄存器.(段寄存器:32位操作系统中用的不多;核心模式寄存器:用来编写操作系统、调试器及其他系统级的软件时会用到.)
n8U|'S7A0
[~6]L!\;l/tR0    80X86 CPU的8个32位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP;
j!IMXfqe&d0
R _-Hj8K-v6b-Mm9|0    8个16位通用寄存器:AX,BX,CX,DX,SI,DI,BP,SP;
zX^6X.X|a|0LUPA开源社区+N {K CL~s
    8个8位通用寄存器:AL,AH,BL,BH,CL,CH,DL,DH;LUPA开源社区3tk)hzqG/yt3e

dLwgq~'x*?u0    注意:8位寄存器是叠加于16位之上的,而16位则叠加于32位上,并未提供独立的24个寄存器.所以在编程时,修改一个寄存器里的内容可能会影响其他三个寄存器,如EAX中的内容修改了,则会影响AX,AL和AH.
b]"In P fJ[,j0LUPA开源社区7zks6zAs
    EFLAGS:32位寄存器,其中有8位编程时会用到,分别为溢出、方向、中断禁止、符号、辅助进位、奇偶、进位标志。(其中用下划线表示的特别重要),称为条件码.
%xi8TQ-dn'^0LUPA开源社区0sQa#]*V
    大多数的汇编程序可能只用到大约30条不同的机器指令.LUPA开源社区N})w(Q'EVcj
LUPA开源社区Z%qO1~6t;{]l~xO
    (1). mov(source_operand,destination_operand);LUPA开源社区8@$?8^"yD*n7E$@ ek
LUPA开源社区m#_!N;}#t4{;@
     source_operand:可以为一个寄存器,内存变量,常量;LUPA开源社区8t,F(c |ri/l z
LUPA开源社区yS!A,D9enkj[
     destination_operand:可以为一个寄存器,内存变量;
.` @_ Mm!Y0LUPA开源社区8ZM6m5e#o1s%AgS_
     该语句类似于其他语言中的:LUPA开源社区v2O8?8q:XqN J vv

5]Wa i;_w0     destination_operand=source_operand;
[L(u:r^'M+N"e^#r2g#x0LUPA开源社区%u8[/h2m0L|
    80X86中不允许两个操作数都为内存变量,两个操作数的长度必须相同.
:dqdM*f0I0
f D,w+V#X"t0    (2). add(source_operand,destination_operand);
Y"Z6w@.M I3W0LUPA开源社区2{#|:{F6?N H&U'Y1S z&w
         sub(source_operand,destination_operand);LUPA开源社区0t"Ww [/vk'bL
LUPA开源社区B[,bKV`
     add();相当于:destination_operand+=source_operand;LUPA开源社区%Y!e n i*{4\ N
LUPA开源社区qa2pT1n_
     sub();相当于:destination_operand-=source_operand;LUPA开源社区` S~,gF+p fL4Ent

1]%}*}#XlLlc0     在程序中它们的结构一般为:LUPA开源社区'P"V!Ygw)M,[Z/Uxn
LUPA开源社区W!n/F? z,x%vd
     mov(0,al);  //al=0;       add(8,al);  //al+=8;
'ZP3_j,IW!Y0
B]2s&v2Is:`0     sub(i8,al); //al-=i8;     
y3j3s-D]a0
)yy4Z6q&Yv#v2W0     mov(al,i8); //i8=al;
Y @%vg]Mv0
f8aX{C]L:T7};m0附录:HLA简介及安装、使用 LUPA开源社区IC fjt)Sm9uc$yK
LUPA开源社区1@4Io [%j
    ○HLA简介  
"V\fm3bQTx'X0   
w z3L'[*q^7` C7F0    HLA,英文"High Level Assembler"(高阶汇编)的缩写,即所谓高级语法的汇编,它将一些高级语言中的特性加入汇编编写中,但它在最终的编译连接时还是要用到MASM的编译器和连接器.
:P0IBQ_l"Y~&F0   LUPA开源社区Wwilk$S
    更进一步的解释请参看:
%ud Oir0    http://webster.cs.ucr.edu/AsmTools/HLA/index.html  LUPA开源社区\!n c%T)s/L%H
LUPA开源社区9|.OX2vH)E
    ●HLA的安装  LUPA开源社区'zo R/wp{%S3r a
   LUPA开源社区%p%TLaON;?J
    1.下载并安装MASM32:到http://www.masm32.com,去下载一个MASM32,并安装它. LUPA开源社区&r nFX |E
   LUPA开源社区,hr wOJ
    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,然后下载它.LUPA开源社区 jhtb(VF F
   LUPA开源社区-{A5R2A!@$W&Yn`
    再安装它,安装时选择的目录不要带空格,比如不要装在C:\Program   Files,而装在C:\Inetpub可以.
^6jp7w9b H#p8u%g0   
\#C#x)D4c"A7Vv$E0    3.设置HLA  
zn4x e8XK0   LUPA开源社区J6a G/W$Bh'H
    到MASM32的bin子目录下,把其中的ml.exe、ml.err、link.exe、mspdb50.dll四个文件复制到HLA所在目录.注意是复制而不是移动.
#qcOWftn(h0   
v8vuqy&l0    然后再到MASM32\lib目录下,把其中的gdi32.lib、kernel32.lib、user32.lib三个文件复制到hla\hlalib目录下(如果原本就有这些文件,可覆盖它们).注意是复制而不是移动.
T V#yig3m0   LUPA开源社区5p Y)j,Bn1}x-p5bN
    设置并确认以下四个系统环境变量:  
\%a.F$H&M2^.x%H0   
#wl!s)}QZ0    set hlainc=c:\hla\include
p \z-B!T%g+G i0    set hlalib=c:\hla\hlalib\hlalib.lib
CF&Q\5n4b)`0   
:w1`8\$ua,Lx'CE0    (安装程序可能已把以上两个系统环境变量设好,不必再改动了)  
N0_ LXC0   LUPA开源社区j-mz h?![:RJ
    set lib=c:\hla\hlalib;LUPA开源社区u_`{3u
   LUPA开源社区3H:R0gQ j
    (安装程序可能已把以上这个系统环境变量设好,但需要检查设置的对不对,有没有重复的地方)  
AB~q }4mA0   
\"](V\0\5He C0    set path=c:\hla;
[X#z8h:I0   
dRC#p Ce y/x0    (一般这个系统环境变量的新增部分需要手工添加,注意如果同时安装了Cygwin,要确保HLA的路径在Cygwin之前,否则Cygwin也带有link.exe,它会先于HLA被执行,导致HLA连接时出错)  LUPA开源社区5d~p5ZAB
   LUPA开源社区NS&l%Eu2| Yi
    4.运行HelloWorld测试HLA  
:K j6z)}:fE^$t0   LUPA开源社区Ez2Aq`3Kv4x'B
    编辑并存盘一个HelloWorld.hla文件,把它存到c:\hla\test,内容如下:  
9L(k&v6o4mJ(|3K3?;{0   LUPA开源社区\7C'm_:T'as9k;p-om
    program   HelloWorld;  
_ m{8cZ|0        #include("stdlib.hhf");  
1W!{5heX-P$_\0    begin   HelloWorld;  LUPA开源社区7Lfn |.{3`OF
       stdout.put("Hello,World of Assembly  Language",nl);  
C ~2s-{ISvBN*_0    end   HelloWorld;  LUPA开源社区/g2_l'E:e Hp
      LUPA开源社区#}I-]2L5q%Z`?ZJ
    编译并运行它:  
E4H Zw&x6l0   LUPA开源社区?yH re%x/W
    C:\hla\test>hla   HelloWorld.hla  LUPA开源社区;v5x.p0v$[
    POLINK: warning: /SECTION:.bss ignored; section is missing. LUPA开源社区"bn@m:\.Cr

(f-D"| | BH Hx al7K0    编译时,我会出现这句不知道是怎么回事,我都是设置正确的.不过也不怎么会影响结果,先不管了.
M$Y.k{-J.x$Jk0   LUPA开源社区+vE:T-CRG
    C:\hla\test>HelloWorld  
;tOn7O/k8p_0    Hello,World of Assembly Language  
Ha^p!|*y$Tp h0   
0^X+\/Op:](mL0    C:\hla\test>
.Lm9whK0i*g0LUPA开源社区,rE]MbQwAn
    到这里用来编程的环境就搭好了.

TAG:

bones7456发布于2008-03-10 10:33:12
stdout.put("Hello,World of Assembly  Language",nl);  如今的汇编这么牛了啊?这比C语言的调用还强大了,哪还像汇编啊?
mathbox mathbox 发布于2008-03-10 10:58:40
这个是HLA里面的语句,不是汇编语句,HLA让学汇编语言看起来简单点,先学嵌入汇编功能的HLA语句,然后再学汇编就轻松多了。。。。呵呵
leninlee的个人空间 leninlee 发布于2008-03-10 22:56:09
汇编确实很有意思。。。。。。
mathbox mathbox 发布于2008-03-11 08:31:32
是的,努力学习中....
panhuan panhuan 发布于2008-06-18 21:00:46
继续搜索资料准备
我来说两句

(可选)

日历

« 2008-11-23  
      1
2345678
9101112131415
16171819202122
23242526272829
30      

数据统计

  • 访问量: 15379
  • 日志数: 48
  • 图片数: 28
  • 文件数: 3
  • 建立时间: 2007-02-28
  • 更新时间: 2008-10-23

RSS订阅

Open Toolbar