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

汇编语言学习笔记1

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

查看( 1675 ) / 评论( 5 )
最近觉得汇编语言挺有意思的,就寻思着学下!后来在网上,逛着.找了一些相关资料,但是不是很好.最后找到一本叫《The Art of Assembly Language》(汇编语言编程艺术),作者是美·Randall Hyde,听说这本书很牛的.在网上的评价也很高,所以我就用这本书开始汇编的学习,看看它是否有这么好?!
:W5BH;^EZ0LUPA开源社区%]vZ4JCk"_ Z
    这本书采用的编程环境是:HLA+masm32;(具体的搭建方法,可在网上找到,如果实在找不到,请看本篇最后的附录.)LUPA开源社区1b%NSWz3}9j!L&\
LUPA开源社区/J Z ywZ(zt
    下面是我前几天的笔记,因人而宜.呵呵.LUPA开源社区vIRa@ dVl9?
LUPA开源社区Q PD6PAG
    1.HLA结构:            例:LUPA开源社区;~2V._qd;z

R~8t(Q8[T:@0    program pgmID;        program helloWorld;
#vS|9\$|5l6`8A1Yo0LUPA开源社区;J2^ \E9dE!D c+{
          声明部分           #include("stdlib.hhf");
+CG5?HkSI0LUPA开源社区},^'N3\qC#qA^
    begin pgmID;          begin helloWorld;LUPA开源社区6o$U G]'O2G
LUPA开源社区r@ Z t4u;J
          主程序可执行语句    stdout.put("Hello,world!",nl);
Ogdk`0LUPA开源社区5{V*B@` ? @4Szw ^"I3i
    end pgmID;            end helloWorld;LUPA开源社区1zcKop%c \q)p
LUPA开源社区0d0J:O"xh Y;`
    关于例子的说明:#include("stdlib.hhf");这里的“;”可以不用加,stdout.put();语句引号中的内容可以多行表示,"nl"表示换行且它前面的","也可以省略.LUPA开源社区1YO8`!Uw'Oq8S6oq FH
LUPA开源社区&X0iUEb
    2.HLA数据声明LUPA开源社区Y~2hEfTh%t

j\LFd3_"y5h&Afz0    格式:                     例:
7K%T#s9IX2cq0
a9I!?F1d'a A0    static                        static  LUPA开源社区l^U"]q

p3bav-^#H1b0      变量名:数据类型[:=初值];            i8:int8:=8;LUPA开源社区 G{'^,F+VW&_
LUPA开源社区B {}$MeR YR
                                       i16:int16:=1600;
t(C E"HLIF0LUPA开源社区mZT{vpQ.a
                                       i32:int32:=320000;
P2csN|0LUPA开源社区7a F/L0@9s ~en9uk
    int8,定义一个字节(即8位)带符号的整型数;LUPA开源社区9bY K/y$E
LUPA开源社区3Qsf-[cf
    int16,定义两个字节(即16位)带符号的整型数;
J#C0~;lUeX0LUPA开源社区 i e2P,J K4]w
    int32,定义四个字节(即32位)带符号的整型数;LUPA开源社区/_GF$ce5m| e1a
LUPA开源社区@O;H?)d \
    布尔值:1 真 true,0 假 false; 关键字:boolean,可初始化true或false.未进行初始化的默认为false.输出语句:stdout.put(布尔变量); 结果为true或false.
1@"c%uzJ8r0LUPA开源社区tKY'GB t
    字符值:单字节的ASCII字符对象,关键字:char.
?$LlSN.y;qY Gb0
}j VmJ+Se g.eT0    3.Intel 80X86处理器
5w-A%m3X Tz$A fa0LUPA开源社区&WUiy h+I4_S_
    Intel系列CPU:归为冯·诺依曼式机器;
fl$TM6U'mSd0
4^+p9n.C#T T0    中央处理器、存储器和输入/输出设备(I/O),通过系统总线相连,其中寄存器是其最主要的特征.LUPA开源社区 `M vo'l*nk:d
LUPA开源社区 c S p l~ H0K2O
    80X86 CPU寄存器:通用寄存器,特殊目的寄存器,段寄存器,特殊目的核心模式寄存器.(段寄存器:32位操作系统中用的不多;核心模式寄存器:用来编写操作系统、调试器及其他系统级的软件时会用到.)
/pLj7Fyr:Vs~0LUPA开源社区2] E9};j'zO4y&`
    80X86 CPU的8个32位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP;
/d[K y7cjx |6K E0LUPA开源社区*i I"C`0M#IN
    8个16位通用寄存器:AX,BX,CX,DX,SI,DI,BP,SP;LUPA开源社区aR SpYH(U.l

@mv_x0    8个8位通用寄存器:AL,AH,BL,BH,CL,CH,DL,DH;LUPA开源社区\;H.L e&um7D

'V`D*? Z]U:X7D]0    注意:8位寄存器是叠加于16位之上的,而16位则叠加于32位上,并未提供独立的24个寄存器.所以在编程时,修改一个寄存器里的内容可能会影响其他三个寄存器,如EAX中的内容修改了,则会影响AX,AL和AH.
5o$O+^*Sxv{2A0
E5pw\5Y?"U*O5t/x0    EFLAGS:32位寄存器,其中有8位编程时会用到,分别为溢出、方向、中断禁止、符号、辅助进位、奇偶、进位标志。(其中用下划线表示的特别重要),称为条件码.
~'P6G-|Q"p&nuY0LUPA开源社区1\3g&kiG
    大多数的汇编程序可能只用到大约30条不同的机器指令.LUPA开源社区%r}6C;Hu%l&T3C}

3|7rRKQ;T;W0    (1). mov(source_operand,destination_operand);
#h%TW7AHD0LUPA开源社区*z(]v(\ U
     source_operand:可以为一个寄存器,内存变量,常量;LUPA开源社区,z+g*YV3kOv h3]f
LUPA开源社区(E/N-M o6?-RI
     destination_operand:可以为一个寄存器,内存变量;LUPA开源社区4{E{ e m+q6\|

5{3|zO&N]L6E l0     该语句类似于其他语言中的:LUPA开源社区8T]dR|1NEpo

U:?9Y-Z.V%~0     destination_operand=source_operand;LUPA开源社区6MBF2i6fxwkJ
LUPA开源社区(mjY'ZS^e
    80X86中不允许两个操作数都为内存变量,两个操作数的长度必须相同.LUPA开源社区e+?7T%n6y d3p
LUPA开源社区0VmmB-w&~ ~j
    (2). add(source_operand,destination_operand);LUPA开源社区]5|9H$w1p%nxD
LUPA开源社区 [0}0VY5z a/V8i;l
         sub(source_operand,destination_operand);LUPA开源社区!Y.d _iz({'Q
LUPA开源社区E#E/SzY@ Q]!x
     add();相当于:destination_operand+=source_operand;
,G|7_n3Cd#S,^0LUPA开源社区.taL3m$[a+Z-?!I
     sub();相当于:destination_operand-=source_operand;LUPA开源社区/d{,_4Yi-[

,ep&O{'u`,t0     在程序中它们的结构一般为:
}$s\ ^'hjP,b)A0LUPA开源社区 u3WH] u
     mov(0,al);  //al=0;       add(8,al);  //al+=8;LUPA开源社区Pf$J T2X~ Jg2H,x)F
LUPA开源社区7^xrf4ht ?-f;D}
     sub(i8,al); //al-=i8;     LUPA开源社区 L8T Gh'C}v"P,bB

"NS\K%Z n}0Nc0     mov(al,i8); //i8=al;
(F~;Y7K} Z i.`0
7Pv7u[VDO V)Y-_,y0附录:HLA简介及安装、使用 LUPA开源社区F&H? z"rF/ST(B7a#[
LUPA开源社区 nrlb%H4J.Uj
    ○HLA简介  LUPA开源社区n[5T1bH
   LUPA开源社区Fyc ZD)AV
    HLA,英文"High Level Assembler"(高阶汇编)的缩写,即所谓高级语法的汇编,它将一些高级语言中的特性加入汇编编写中,但它在最终的编译连接时还是要用到MASM的编译器和连接器.LUPA开源社区`"_X @3a1?W
   
/XcE6m!? ^ G0    更进一步的解释请参看:
cQA5LvOW0    http://webster.cs.ucr.edu/AsmTools/HLA/index.html  LUPA开源社区Ip O.p'[7B-W9J|r

Lh)k VG.\!U0    ●HLA的安装  
|TXh l9s0   LUPA开源社区_e2d3c4e
    1.下载并安装MASM32:到http://www.masm32.com,去下载一个MASM32,并安装它. LUPA开源社区kW']Wb"N)j+[H
   
VZ"o+o4o2DmXC e0    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,然后下载它.
E-EC&Qz0   LUPA开源社区 n6I1S&P8U2e\5F
    再安装它,安装时选择的目录不要带空格,比如不要装在C:\Program   Files,而装在C:\Inetpub可以.
E"kAMQ8sH3m0   LUPA开源社区` ZOk!|
    3.设置HLA  
9p tR'v&R[PS0v&SK-Q0   
)A-t)tY x#U0    到MASM32的bin子目录下,把其中的ml.exe、ml.err、link.exe、mspdb50.dll四个文件复制到HLA所在目录.注意是复制而不是移动. LUPA开源社区rz]jJ
   LUPA开源社区9EC7af'p ]j
    然后再到MASM32\lib目录下,把其中的gdi32.lib、kernel32.lib、user32.lib三个文件复制到hla\hlalib目录下(如果原本就有这些文件,可覆盖它们).注意是复制而不是移动. LUPA开源社区0y1Mgf@NV;v
   LUPA开源社区7eLDa:z\
    设置并确认以下四个系统环境变量:  LUPA开源社区5p%B/?kB
   
w t|#E'@3Bl x"S r4d0    set hlainc=c:\hla\includeLUPA开源社区!U(MKp W^9x:@
    set hlalib=c:\hla\hlalib\hlalib.lib
_Yo?~Em:\@ }0   LUPA开源社区ncsV)Rt0d H
    (安装程序可能已把以上两个系统环境变量设好,不必再改动了)  
;R`xr+x6^!x%T0   LUPA开源社区@yT? hz.~\$tb
    set lib=c:\hla\hlalib;
VP8`6z;adE0   
Q{9{ {M_uq4e,c"S `0    (安装程序可能已把以上这个系统环境变量设好,但需要检查设置的对不对,有没有重复的地方)  
z(y0kn&Wd-R!n0   LUPA开源社区yfE8Xe2F:p3Gpm0{)a
    set path=c:\hla;LUPA开源社区/eB `!~'tvb] s
   LUPA开源社区X0N!?UE"HY;}{
    (一般这个系统环境变量的新增部分需要手工添加,注意如果同时安装了Cygwin,要确保HLA的路径在Cygwin之前,否则Cygwin也带有link.exe,它会先于HLA被执行,导致HLA连接时出错)  
6g g!r%uOr0   
@_\3qpc#E0    4.运行HelloWorld测试HLA  LUPA开源社区V,ss |VX3IK
   
"z Uu@L#QyM.{T0    编辑并存盘一个HelloWorld.hla文件,把它存到c:\hla\test,内容如下:  
T9__L$e4d0   LUPA开源社区cKa'W l
    program   HelloWorld;  LUPA开源社区&|ztn"D:DG0BHG-Z
        #include("stdlib.hhf");  
W8`&op f U9^w0    begin   HelloWorld;  LUPA开源社区/GDv!tY)E jp;P
       stdout.put("Hello,World of Assembly  Language",nl);  
*{3z:x(|'|q0    end   HelloWorld;  LUPA开源社区y5\ VPL-ZxM VX
      
Z#C4X%M\"f:V0    编译并运行它:  
%N,V%cC*~LNK L0   LUPA开源社区Y7tp4ljM1`
    C:\hla\test>hla   HelloWorld.hla  LUPA开源社区9~"qIR4b f/K V[
    POLINK: warning: /SECTION:.bss ignored; section is missing.
p[U'j&Z?0
k'G$]p F(J/z#o0    编译时,我会出现这句不知道是怎么回事,我都是设置正确的.不过也不怎么会影响结果,先不管了.LUPA开源社区L4o_a*P |-Dpy"R
   LUPA开源社区.B9]C U4Gj;_
    C:\hla\test>HelloWorld  
(t+a:{ {+w"u0    Hello,World of Assembly Language  LUPA开源社区+Zd6Tc'U!{u;y)pd
   LUPA开源社区hgX4[ NO Y$t;K+C
    C:\hla\test> LUPA开源社区;~/]y1F i

)UQ{Z7qe1J0w0    到这里用来编程的环境就搭好了.

TAG:

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

(可选)

日历

« 2008-09-08  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 11977
  • 日志数: 48
  • 图片数: 25
  • 文件数: 3
  • 建立时间: 2007-02-27
  • 更新时间: 2008-08-31

RSS订阅

Open Toolbar