没有合适的资源?快使用搜索试试~ 我知道了~
简单介绍汇编的入门知识,是初步学习的葵花宝典
资源推荐
资源详情
资源评论
汇编语言入门教程
2007-04-29 22:04 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个
漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学
汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩 DEBUG,有时
CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高
深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇
编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几
个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈
何容易,所以本人整理了这篇超浓缩(用 WINZIP、WINRAR…依次压迫,嘿嘿!)教程。
大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下 DEBUG,很有
成就感的,试试看!那么――这个接下来呢?―― Here we go!(阅读时看不懂不要紧,
下文必有分解)
因为汇编是通过 CPU 和内存跟硬件对话的,所以我们不得不先了解一下 CPU 和内存:
(关于数的进制问题在此不提)
CPU是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语
言只能用于特定的 CPU。也就是说,不同的 CPU 其汇编语言的指令语法亦不相同。个人电
脑 由 1981 年 推 出 至 今 , 其 CPU 发 展 过 程 为 : 8086→80286→80386→80486→PENTIUM
→……,还有 AMD、CYRIX 等旁支。后面兼容前面 CPU 的功能,只不过多了些指令(如
多能奔腾的 MMX 指令集)、增大了寄存器(如 386 的 32 位 EAX)、增多了寄存器(如
486 的 FS)。为确保汇编程序可以适用于各种机型,所以推荐使用 8086 汇编语言,其兼
容性最佳。本文所提均为 8086 汇编语言。寄存器(Register)是 CPU 内部的元件,所以在
寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于
寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边
设备。8086 有 8 个 8 位数据寄存器,这些 8 位寄存器可分别组成 16 位寄存器:AH&AL
=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;
CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数
据传递。为了运用所有的内存空间,8086 设定了四个段寄存器,专门用来保存段地址:C
S(Code Segment):代码段寄存器;DS( Data Segment):数据段寄存器;SS
(Stack Segment):堆栈段寄存器;ES( Extra Segment):附加段寄存器。当一个程序
要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器
CS,DS,SS 来指向这些起始位置。通常是将 DS 固定,而根据需要修改 CS。所以,程序
可以在可寻址空间小于 64K 的情况下被写成任意大小。 所以,程序和其数据组合起来的大
小,限制在 DS 所指的 64K 内,这就是 COM 文件不得大于 64K 的原因。8086 以内存做为
战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功
能的寄存器:IP(Intruction Pointer):指令指针寄存器,与 CS 配合使用,可跟踪程序的
执行过程;SP(Stack Pointer):堆栈指针,与 SS 配合使用,可指向目前的堆栈位置。
BP(Base Pointer):基址指针寄存器,可用作 SS 的一个相对基址位置;SI(Source
Index ) : 源 变 址 寄 存 器 可 用 来 存 放 相 对 于 DS 段 之 源 变 址 指 针 ; DI ( Destination
Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存
器 FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。
内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存
放数值的储存位置,叫“地址”。8086 地址总线有 20 位,所以 CPU 拥有达 1M 的寻址空间,
这也是 DOS 的有效控制范围,而 8086 能做的运算仅限于处理 16 位数据,即只有 0 到
64K,所以,必须用分段寻址才能控制整个内存地址。完整的 20 位地址可分成两部份:1.
段基址(Segment):16 位二进制数后面加上四个二进制0,即一个 16 进制0,变成 20 位二
进制数,可设定 1M 中任何一个 64K 段,通常记做 16 位二进制数;2.偏移量(Offset):直接
使用 16 位二进制数,指向段基址中的任何一个地址。如: 2222(段基址):3333(偏移
量),其实际的 20 位地址值为:25553。除了上述营养要充分吸收外,你还要知道什么是
DOS、BIOS 功能调用,简单的说,功能调用类似于 WIN95 API,相当于子程序。汇编写程
序已经够要命了,如果不用 MS、IBM 的子程序,这日子真是没法过了(关于功能调用详
见《电脑爱好者》98 年 11 期)。
编写汇编语言有两种主要的方法:1.使用 MASM 或 TASM 等编译器;2.使用除错程序
DEBUG.COM。DEBUG 其实并不能算是一个编译器,它的主要用途在于除错,即修正汇
编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG 更是
最佳的入门工具。因为 DEBUG 操作容易:只要键入 DEBUG 回车,A 回车即可进行汇编,
过程简单,而使用编译器时,必须用到文本编辑器、编译器本身、LINK 以及 EXE2BIN 等
程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源
程序,必须加入许多与指令语句无关的指示性语句,以供编译器识别,使用 DEBUG 可以
避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外,还可用来检
查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说, DEBUG
是为了让我们接触硬件而设计的。(8086 常用指令用法将在每个汇编程序中讲解,限于篇
幅,不可能将所有指令列出)。
DEBUG 的的 A 命令可以汇编出简单的 COM 文件,所以 DEBUG 编写的程序一定要由地址
100h(COM 文件要求)开始才合法。FOLLOW ME,SETP BY SETP(步步回车):
输入 A100 ; 从 DS:100 开始汇编
2.输入 MOV DL,1 ; 将数值 01h 装入 DL 寄存器
3.输入 MOV AH,2 ; 将数值 02h 装入 DL 寄存器
4.输入 INT 21 ; 调用 DOS 21 号中断 2 号功能,用来逐个显示装入 DL 的字符
5.输入 INT 20 ; 调用 DOS 20 号中断,终止程序,将控制权交回给 DEBUG
6.请按 Enter 键
7.现在已将汇编语言程序放入内存中了,输入 G(运行)
8.出现结果:输出一个符号。
ㄖ ←输出结果其实不是它,因 WORD97 无法显示原结果,故找一赝品将就着。
Program terminated normally
我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。你将发现每一
行右边的汇编指令就是被汇编成相应的机器码,而 8086 实际上就是以机器码来执行程序。
1.输入 U100,106
1FED:0100 B201 MOV DL,01
1FED:0102 B402 MOV AH,02
1FED:0104 CD21 INT 21
1FED:0106 CD20 INT 20
DEBUG 可以用R命令来查看、改变寄存器内容。CS:IP 寄存器,保存了将执行指令地址。
1.输入 R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC
1FED:0100 B201 MOV DL,01
当程序由 DS:100 开始执行,那么终止程序时,DEBUG 会自动将 IP 内容重新设定为
100。当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。但一定
要为 COM 文件,否则无法以 DEBUG 载入。
输入 N SMILE.COM ;我们得告诉 DEBUG 程序长度:程序从 100 开始到 106,故占用 7
;字节。我们利用 BX 存放长度值高位部分,而以 CX 存放低位部分。
2.输入 RBX ;查看 BX 寄存器的内容,本程序只有 7 个字节,故本步可省略
3.输入 RCX ;查看 CX 寄存器的内容
4.输入 7 ;程序的字节数
5.输入 W ;用W命令将该程序写入(Write)磁盘中
修行至此,我们便可以真正接触 8086 汇编指令了。 当我们写汇编语言程序的时候,通常
不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些符号
剩余14页未读,继续阅读
资源评论
ldc1197260487
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
- 音乐展示网页、基于Stenography的图像数字水印添加与提取,以及基于颜色矩和Tamura算法的图像相似度评估算法py源码
- 基于EmguCV(OpenCV .net封装),图像数字水印加解密算法的实现,其中包含最低有效位算法,离散傅里叶变换算法+文档书
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功