喜欢Linux的朋友,交流交流呐......
汇编语言学习笔记1
查看( 1675 ) /
评论( 5 )
最近觉得汇编语言挺有意思的,就寻思着学下!后来在网上,逛着.找了一些相关资料,但是不是很好.最后找到一本叫《The Art of Assembly Language》(汇编语言编程艺术),作者是美·Randall Hyde,听说这本书很牛的.在网上的评价也很高,所以我就用这本书开始汇编的学习,看看它是否有这么好?!
:W5BH;^EZ0LUPA开源社区%]vZ4JCk"_Z
这本书采用的编程环境是:HLA+masm32;(具体的搭建方法,可在网上找到,如果实在找不到,请看本篇最后的附录.)LUPA开源社区1b%NSWz3}9j!L&\
LUPA开源社区/JZ ywZ(zt
下面是我前几天的笔记,因人而宜.呵呵.LUPA开源社区 vI Ra@ 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\q C#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{v pQ.a
i32:int32:=320000;
P2csN|0LUPA开源社区7a F/L0@9s ~e n9uk
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'GBt
字符值:单字节的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#TT0 中央处理器、存储器和输入/输出设备(I/O),通过系统总线相连,其中寄存器是其最主要的特征.LUPA开源社区`Mvo'l*nk:d
LUPA开源社区c S p l~H0K2O
80X86 CPU寄存器:通用寄存器,特殊目的寄存器,段寄存器,特殊目的核心模式寄存器.(段寄存器:32位操作系统中用的不多;核心模式寄存器:用来编写操作系统、调试器及其他系统级的软件时会用到.)
/p L j7Fyr:Vs~0LUPA开源社区2] E9};j'zO4y&`
80X86 CPU的8个32位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP;
/d[K y7cjx |6K E0LUPA开源社区*iI"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*YV3kOvh3]f
LUPA开源社区(E/N-Mo6?-RI
destination_operand:可以为一个寄存器,内存变量;LUPA开源社区4{E{ e m+q6\|
5{3|zO&N]L6El0 该语句类似于其他语言中的:LUPA开源社区8T]dR|1N Epo
U:?9Y-Z.V%~0 destination_operand=source_operand;LUPA开源社区6MBF2i6fxwkJ
LUPA开源社区(mjY'Z S^e
80X86中不允许两个操作数都为内存变量,两个操作数的长度必须相同.LUPA开源社区e+?7T%n6yd3p
LUPA开源社区0Vmm B-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_n3C d#S,^0LUPA开源社区.ta L3m$[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开源社区 L8TGh'C}v"P,bB
"N S\K%Z n}0Nc0 mov(al,i8); //i8=al;
(F~;Y7K } Zi.`0
7Pv7u[VDOV)Y-_,y0附录:HLA简介及安装、使用 LUPA开源社区F&H? z"rF/ST(B7a#[
LUPA开源社区 nrlb%H4J.U j
○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+o4o2DmXCe0 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)tYx#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"Sr4d0 set hlainc=c:\hla\includeLUPA开源社区!U(MKpW^9x:@
set hlalib=c:\hla\hlalib\hlalib.lib
_Yo?~E m:\@ }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&W
:W5BH;^EZ0LUPA开源社区%]vZ4JCk"_Z
这本书采用的编程环境是:HLA+masm32;(具体的搭建方法,可在网上找到,如果实在找不到,请看本篇最后的附录.)LUPA开源社区1b%NSWz3}9j!L&\
LUPA开源社区/JZ ywZ(zt
下面是我前几天的笔记,因人而宜.呵呵.LUPA开源社区 vI Ra@ 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\q C#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{v pQ.a
i32:int32:=320000;
P2csN|0LUPA开源社区7a F/L0@9s ~e n9uk
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'GBt
字符值:单字节的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#TT0 中央处理器、存储器和输入/输出设备(I/O),通过系统总线相连,其中寄存器是其最主要的特征.LUPA开源社区`Mvo'l*nk:d
LUPA开源社区c S p l~H0K2O
80X86 CPU寄存器:通用寄存器,特殊目的寄存器,段寄存器,特殊目的核心模式寄存器.(段寄存器:32位操作系统中用的不多;核心模式寄存器:用来编写操作系统、调试器及其他系统级的软件时会用到.)
/p L j7Fyr:Vs~0LUPA开源社区2] E9};j'zO4y&`
80X86 CPU的8个32位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP;
/d[K y7cjx |6K E0LUPA开源社区*iI"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*YV3kOvh3]f
LUPA开源社区(E/N-Mo6?-RI
destination_operand:可以为一个寄存器,内存变量;LUPA开源社区4{E{ e m+q6\|
5{3|zO&N]L6El0 该语句类似于其他语言中的:LUPA开源社区8T]dR|1N Epo
U:?9Y-Z.V%~0 destination_operand=source_operand;LUPA开源社区6MBF2i6fxwkJ
LUPA开源社区(mjY'Z S^e
80X86中不允许两个操作数都为内存变量,两个操作数的长度必须相同.LUPA开源社区e+?7T%n6yd3p
LUPA开源社区0Vmm B-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_n3C d#S,^0LUPA开源社区.ta L3m$[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开源社区 L8TGh'C}v"P,bB
"N S\K%Z n}0Nc0 mov(al,i8); //i8=al;
(F~;Y7K } Zi.`0
7Pv7u[VDOV)Y-_,y0附录:HLA简介及安装、使用 LUPA开源社区F&H? z"rF/ST(B7a#[
LUPA开源社区 nrlb%H4J.U j
○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+o4o2DmXCe0 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)tYx#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"Sr4d0 set hlainc=c:\hla\includeLUPA开源社区!U(MKpW^9x:@
set hlalib=c:\hla\hlalib\hlalib.lib
_Yo?~E m:\@ }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&W