喜欢Linux的朋友,交流交流呐......
汇编语言学习笔记1
查看( 1679 ) /
评论( 5 )
最近觉得汇编语言挺有意思的,就寻思着学下!后来在网上,逛着.找了一些相关资料,但是不是很好.最后找到一本叫《The Art of Assembly Language》(汇编语言编程艺术),作者是美·Randall Hyde,听说这本书很牛的.在网上的评价也很高,所以我就用这本书开始汇编的学习,看看它是否有这么好?!
Fy?"I&g\0
u Ymm%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\ EmG9Z
声明部分 #include("stdlib.hhf");LUPA开源社区5z(B"NhI1e
LUPA开源社区V)q:U?D2JY6Ghi-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开源社区ju}C`bNS4w
格式: 例:
(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开源社区8D Ka/o)ET
int16,定义两个字节(即16位)带符号的整型数;
9j*T%b,xsp0LUPA开源社区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.
Fy?"I&g\0
u Ymm%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\ EmG9Z
声明部分 #include("stdlib.hhf");LUPA开源社区5z(B"NhI1e
LUPA开源社区V)q:U?D2JY6Ghi-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开源社区ju}C`bNS4w
格式: 例:
(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开源社区8D Ka/o)ET
int16,定义两个字节(即16位)带符号的整型数;
9j*T%b,xsp0LUPA开源社区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.