当前位置:文档之家› 汇编语言学习

汇编语言学习

汇编语言学习
汇编语言学习

汇编教程(1):如何学习汇编

2008-11-01 15:43

想想我自己玩电脑也是不少时间了,也经常在各大论坛灌水,得到过很多人的帮助。

但是非常遗憾的事一直都没有为别人贡献过什么,现在我有点时间所以写了几篇关于汇编的文章,我以后还会继续更新。路线是:先写点16位汇编-32位汇编-解密知识-外挂制作。希望大家关注,同时多给点意见,在下将非常感激,同时希望大家多多回复不要让帖子沉下去。希望多多支持

如果大家有什么问题可以给我发Email:424608@https://www.doczj.com/doc/e5126843.html,

我将尽全力帮助你解答问题!

写这篇文章(我准备把他写成一个系列),我想讲述如何从零开始学汇编语言程序设计,请千万相信汇编其实是很简单的,只要自己努力一定是可以学会的。可能由于我的技术(编程和写作)也很不到家在很多方面都写的不是很好甚至是胡说八道(但愿你不会这样认为)。如果你对此有什么意见可以给我发Email:424608@https://www.doczj.com/doc/e5126843.html,给我我将竭尽全力的回复每一封邮件同时希望大家多给我提提

意见,让我把文章写的更好。。!

这篇文章里不会有太多技术方面的东西,我想在这章先和大家一起探讨如何学习汇编的问题,也许有些内容让你觉得我很啰唆。那是以为我为了照顾大部分的读者所以写的比较详细。。请大家多支持我,看了之后多给我意见。如果没有意外我会坚持每个礼拜发表一篇。今天写的是第一章,只是个引子,还没具体涉及到编程。

罗云彬说的好啊,学汇编就像千军万马过独木桥,能够坚持到最后的很少。这个不禁让我想起了高考啊。汇编这东西如果你真的学精通的话可以让计算机做很多别人不能够做的事情,因此很多人都想学习汇编。掌握这方面技术,对自身的提高确实有好处。你可以通过反汇编别人的程序跟踪别人的软件,了解别人的编程思路。通过了解别人的程序思路,使自己写出更加好的程序。而且写病毒,木马和外挂等等的一些软件~~~都必须用汇编才能够写的漂亮。研究汇编还有助于掌握一些系统底层知识,系统底层知识绝对是构造起大型软件的坚实基础。许多程序发展,都经历了这一锻炼过程的。而大多数人可能认为汇编是一门高深的学问。很难学,我前几天在网上拿了个软件给我朋友用。他问我用什么写的,我说用汇编。。他不信以为汇编根本就写不出强大复杂的软件,其实这都是老皇历了(现在的汇编其实我感觉和C差不多都是调用windows API来编程)。造成这种原因我觉得是以前在dos下面用汇编来写程序太麻烦,所以给人的感觉就成了很复杂,(以前在dos下汇编没有很多API可以调用)就将汇编神话了,造成初学者在心理上就承认了汇编很难学的”事实”其实不是这样现在其他编程语言可以做的比如C,用汇编做起来也不是很麻烦。再一方面由于学习资料比较匮乏学。初学者一般不知从何下手,由于没方向,花费了大量时间和精力,走了不少弯路。

这里我就给想学汇编的指下学习方向(根据我自己的学习经历)。

在学汇编前,最好先掌握一门高级语言编程,这样再学汇编应容易些,如果你学校或者在其他地方学了C语言的学起来就比较轻松了,很多书上都是用C语言程序做范例来讲解的,如果你没有学也没有关系这里我给你推荐个视频: <<尚学堂科技java系列视频教程>>,这个教程可比那些什么什么大学跟这课本念PPT的好多了,你或者会问我为什么学汇编要去看java的视频啊,这里我只是推荐你去看下他视频的前3章,也就算基础知识,这在所有的程序设计语言里面都适用,看完了再学习汇编坡度就不会那么陡了。

看完视频我想再向大家介绍几本书都是中国人写的(我觉得国人计算机方面的著作就算汇编比较有出席拉) 一本是王爽写的<<汇编语言>>和罗云彬写的windows环境下32位汇编语言程序设计,这2本书在学习汇编的人心中地位都非常高现在都出了第2版了,而且网上都有电子版,google下就能找到。其他还有一些书比如: 温冬蝉,沈美明:清华大学出版社,《IBM PC 汇编语言程序设计教程》,。【美】Kip R。Irvine 著,温玉杰等译:《Intel 汇编语言程序设计》(第四版),都是比较经典的,如果有机会可以看看!!

学习汇编要多动手,不要只看书和书上的例子,有条件就把例子弄到电脑上试一试,如果成功了,不要高兴,你的工作只完成了一半,把例子改一改,按你的意思,想想改了之后的结果,与上机对照一下,你会有收获的。写汇编程序难免会出错,老一辈的人都还在讲解着dubug的使用,其实现在windows环境下的汇编调试器已经非常的完善了,我平时一般是用Rad ASM里面自带的调试器,他已经可以给我解决大部分由于编程粗心而引起的错误,还有一些是逻辑错误我一般

用ollydbg进行调试,这里我再给大家推荐个编辑器Rad ASM,这是一个非常棒的汇编IDE编程环境掌握他的使用可以让安心的写汇编程序而不用把心思在记忆复杂的一些编译指令上,我准备写篇Rad ASM的教程,但是现在还没有动笔。现在比较好的讲解Rad ASM可能是jhkdiy写的 Win32汇编开发环境介绍和RadAsm简明教程

学习汇编其实很累的,需花费大量的时间,而且经常会遇到很多的问题,资料又比较匮乏。这时你可能有点想退却,其实你不要着急,只要你认真学习,成功就在眼前。没有人是生来就什么都会的,如果你有问题,就大胆的去问你周围的人。而且现在网上也有很多的专门讨论汇编的站点比较好的应该是aogo的汇编小站和罗云彬的编程乐园,学汇编的秘诀就是勤奋+执着!记住并能做到这两点,你会变得很优秀的。

不管你学汇编是出于什么目的,如果你在学习汇编的过程中如果遇到了问题可以发邮件给我探讨,我非常的欢迎邮件是:424608@https://www.doczj.com/doc/e5126843.html,。同时在学习汇编的时候如果突然觉得学的很痛苦,可以在看雪学院下点东西玩玩解密,培养培养下兴趣也未尝不可啊!多在机子上试试底层的东西,如bios调用,IO操作,对显卡,硬盘的控制。那样你会体会到学习汇编语言的快乐。

总之要记得想学会汇编,你需要自立自强,以及自学能力。现在开始吧……

转载请注明出自暗组技术论坛https://www.doczj.com/doc/e5126843.html,/bbs/

汇编语言(2):如何学习汇编

2008-11-01 15:44

准备提笔写的时候好像不知道怎么下笔啊,毕竟以前我都没有写过技术方面的文章,怕自己技术不够让高手笑话,又怕表达不清楚自己的意思.但是心一横死就死吧!在上一篇如何学习汇编中没有给大家扯太多技术话题,但是我觉得那也是非常重要的,学习什么事有了信心就成功了一半,所以还希望大家继续坚定要把汇编学好的思想,要相信自己汇编是很简单的,我们通过自己的努力一定可以把汇编学好

那么让我们开始今天的话题…..

今天主要扯点计算机的工作方式,因为汇编是面向机器的语言,所以非常有必要了解下计算机的结构,CPU的工作方式.这里我假设你只有一点点最基本的电脑基础啊,最好自己去弄懂那个什么进制转换的,我觉得特麻烦,不过却也比较简单..我这里就不和大家扯了自己了解下~~那么既然假设你没有什么电脑知识就会显得有些啰唆,高手别见笑啊!

说到汇编语言啊,就扯远拉,远到哪里呢, 嗯很远, 汇编语言和机器语言是很亲密的,所以要聊下汇编语言那就不得不又扯下机器语言了,^_^.真远啊!!

机器语言

什么叫机器语言呢,机器语言就是一些机器指令的集合拉,也就是一些二进制的数字什么010010的,这就是机器指令,计算机呢可以把这些010010什么的转变为高低电平,使计算机的电子器件收到驱动,进行运算..嗯,搞的好像很复杂似的,其实简单理解就是计算机也有一门语言(机器语言)就像我们的汉语一样,我们汉语的构成呢是由字来构成的,机器语言(也就是电脑自己的语言,就是一些01001什么的来构成的.当初我理解的时候就想啊,机器语言不是人发明的么,为什么不教他学汉语啊要教他学什么01001的那么麻烦^_^.呵呵其实现在很多人都在做着这样的努力呢, 诶~~又扯远了.

给大家扯了机器语言的那就再给大家扯一下计算机吧,你有跟朋友去过电脑城装过电脑吗?或者见过别人把电脑机箱打开后里面的情况吗? 对里面有一个大风扇,大风扇下面知道是什么吗? 那是CPU就是电脑的心脏,那家伙就像我们脑袋一样是指挥部.其实我们见到的那CPU叫微处理器,是它控制着电脑的显卡啊,声卡什么的,当然我们不能够直接去控制这些东西那些玩意不听我们的,但是他们的指挥官(CPU)听我们,我们编程的任务就是指挥CPU(嗯,你可以把这想象成一场战争)去控制显卡显示图像,声卡发声.是不是很兴奋,可是我要跟你说的是他们的指挥官(CPU)是个莽夫特别讨厌学习国家的语言(这个和我倒是有些类似

啊).所以我们想要和CPU沟通就要学习他的语言,可是他的语言实在是太难学了(有点向英语那么难学^_^)所以我不准备去学习他的语言,同时我也不建议你去学它的语言,那你要问我怎么办拉,嘿嘿很好办,你看过胡锦涛和布什谈话的时候是怎么谈的吗? 对拉有翻译,毛主席说人人都是平等的,胡主席可以请翻译,我们也可以~~~~我们的翻译的就是汇编, 汇编是个好同志啊,他帮我们把指令翻译成很长很长的0101001,从此我们就离开了机器语言的怀抱,而用汇编来控制CPU 拉,这是什么,这是世界的进步啊,是不是又感觉这世界又美好了一些!!

汇编语言

那么,我们现在已经理解了汇编语言和机器语言的相同和区别了,要说相同的话他们都好像是4个汉字,区别就是前2个字不同,倒下一片~~~~~~“, 其实汇编和机器语言在我理解是没有什么区别的,汇编只是把机器语言的010010对应的翻译了一下,就像我学英语一样,老是喜欢做硬式翻译,所以此时此刻我不得不再打击你一下,因为汇编只是硬式翻译了下机器语言,所以造成了汇编的指令过多,和过于复杂了.当然后来为了解决这个问题又出了C语言对吧,你不会想当叛徒去投靠C吧,晕,张三丰说过,千万不能够当叛徒,这不,现在的32位汇编就有宏汇编,搞的和C都差不多了,所以你也别想着要跑C那里去,现在我们只要学习下DOS下的汇编理解了那些指令的用处,到时候我们在windows下面写程序的时候都有很多宏可以调用了..

汇编语言的组成

那么我们现在把机器语言扯完了,(其实我还想再扯一会的).但是怕你不满意!!下面就是汇编闪亮登场了,你也许会问我汇编长什么样子呢?? 这不好说啊,但是我可以肯定的是他绝对没有我帅^_^…其实汇编不能够说长什么样子,应该说汇编由什么东西构成呢, 那么我告诉你汇编是由一些指令比如你看着头晕的mov啊什么的, 还有就是伪指令了,伪指令就是些段标记啊什么,现在不知道没

有关系,到时候我再跟你扯..

存储器(内存)

现在我假设你已经把汇编指令学完了,那么你肯定是命令计算机执行几条指令对吧,理论上说的过去,但是现在还有个小问题就是..你在什么地方给计算机发布命令呢? 计算机可不是很随便的人啊, 计算机很死板死板到什么程度呢,它只能够在内存(存储器)中接受我们的指令.其他地方…sorry不行.所以我们必须把

我们的指令放到内存里面让CPU来读取和执行,所以知道内存的作用了吧,很重要吧,那么我们当然要了解下CPU是如何来读取我执行我们的指令的对吧..所以我们的学习环节里面又多了个,了解CPU是如何在内存中读取指令和写入指令..

那么到底CPU是如何去读取指令呢,是这样的,CPU把内存划分成一个一个的单元,单元里边的编号是从0开始的,比如有128个存储单元,那么第一个就是0 最后一个就是127,你现在肯定想问拉,那一个存储单元可以存多少信息呢?? 计算机把一个2进制位称为一个比特(bit)8个就是一个字节了,(Byte)实际上现在的电脑啊它的内存是大的不得了的,我们只有了解这个概念就成,比如我现在写文

章这台的电脑就有512M内存,那么换算下来是多少呢?

1KB = 1024 B(Byte) 1MB = 1024 KB 1GB = 1024 MB 1TB = 1024 GB

你可能要问了,我这是不是在讲硬盘啊,硬盘上面才用多少个G啊这样标示啊,其实内存和硬盘是一样的,他们的计量单位都是按照上面那些公式来的.

存储单元

刚才给大家扯到,内存被分为多个存储单元,存储单元是从0开始编号.你可能有疑问为什么要编号呢,这里就可以给你回答了,这就向一条街啊,你找一户人家肯定不好找对吧, 但是给他们的房子都弄个编号那就好找了..其实CPU读数据就向找人一样啊,根据门牌号(存储单元编号)这样找就非常快拉.

地址总线

既然说到了编号啊,就给大家聊点编号的问题吧,CPU本是有限啊,只能够指定特定多的存储单元,为什么啊,这个就是由于CPU的地址总线的限制了,比如啊我们的身份证是18位的,当我们国家的人口啊超过18为数字能够容纳的范围的话是无法标示的对吧(不过估计目前是无法达到这个数字的,这都是计划生育搞的好啊),那么现在是CPU有多少地址总线的话就只能够对特定多的内存进行寻址,如果再多出来的内存是没有用的,我们假设CPU有10根地址总线那么我们来看下他的寻址情况,在电子计算机中,一根导线可以传送的稳定状态只有2种,0和1

那么10根地址总线可以标示的范围为, 2的10次方个,最小就是0,那么最大就是1023了.所以可以得出结论,一个CPU有N跟地址线,则可以寻址的范围为2的N次方个内存单元.

数据总线

既然聊了关于存储器(内存)的那么多,不妨再聊点比较有趣的事情,聊什么呢,聊点关于CPU读取指令的问题,首先我想向大家提个问题,比如我现在在内存中有1000条指令啊, CPU来读取这些指令的时候可以一次全部读完吗? 这个问题啊,据我所知啊我们现在用的CPU是没有办法一次全部读完的,那么它怎么办呢,你也想到了,就是分多次来读取对吧.那么问题又来了CPU一次可以读取多少条指令呢? 这要看CPU的数据总线的宽度了,8086的CPU数据总线宽度为16位,是16位2进制的数据比如现在传送 89D9H 8086CPU就可以一次传送完,如果是89D898那么这个数字16位就标示不完了,所以要分两次来传送.

你看到这里我不得不佩服你的勇气,你是一个精神可嘉的人,虽然我写着很累,但是相信你看着也不轻松啊,诶..主要是因为我文采不好写的很烂,让人不大容易明白,其实这些东西都是概念性的东西,我这人最讨厌概念性的东西了,所以我学汇编的时候也是囫囵吞枣就过去了,所以现在给大家讲起来也底气不足..不过没有关系这些概念性的东西没有弄懂也没有关系,了解下就成了,等你到时候把汇

编学个入门后再倒回来看就会获益匪浅的.

回忆下我们吹了什么东西, 机器语言, 汇编语言明白了吗? 存储器(内存)的作用明白了吗?存储单元和地址总线还有数据总线这些明白了吗? 如果明白了就过关了,如果没有诶~~~~不是你有问题就是我有问题了..

这段终于给大家吹完了,我也松了一口气,以后的扯淡应该会更加轻松些.所以别紧张.下一篇可能要过几天了,这几天比较忙啊!下一篇就给大家真刀实枪的干了,我们就要接触汇编指令了,期待吧! 请多多支持我的blog,你们的支持是我最大的动力..有动力马才跑的快啊!

汇编教程(3):寄存器CPU工作原理①

2008-11-01 15:54

你真的弄懂了汇编语言基础?? 真的吗? 如果是那么就继续今天的话题啊!!在对CPU读取指令方面有了一个感性的了解后,我们就应该学学寄存器了,寄存器可以说是汇编代码里面必然存在的东西,不然这汇编程序就没法写了,那寄存器是什么呢?CPU到底是怎么样操作寄存器的呢??…

现在的孩子真幸福啊,今天我一个18岁的朋友来象我请教如何配置电脑的问题,呵呵,想象一下啊我18岁都在做些什么呢? 不过非常不幸的是,我那朋友想买电脑来打完美世界.这不得不让我吃惊啊,现在的孩子虽然得到的东西多了,也不知道他们是否知道珍惜啊!!

好了不跟大家扯这些家常了,我本来文采就不怎么好,写这个教程权当自娱自乐啊,希望高手要求不要放太高,但是有错误是一定要提的! 上次写的那篇汇编基础收到了不少朋友的反馈,他们说我取的名字不好,不应该叫汇编精通啊(前两篇这个教程叫汇编精通),和我这样的写作风格不相配,想想也是哦,所以改成了现在这个名字.还有不少朋友给我提了很宝贵的意见,其中有位朋友说我写的跑题了..其实我写这个教程不打算教会你汇编,我也没有那个本事,我只是想大家对汇编有个感性的认识.. 或者是你在阅读其他书籍的时候有什么概念上的东西觉得干涩的,我给大家做个感性的介绍而已,我的想法是: 如果你想学习汇编,你手里起码得有几本书吧,比如我在如何学习汇编那篇文章中给大家介绍那本王爽写的汇编语言就非常不错,我就是靠这本书带入门的,所以希望阁下学习汇编还是以书本为主啊, 我本来技术就有限.甚至连一些概念上的东西弄错了都不知道, 惭愧惭愧啊..

上节课给大家介绍了机器语言和汇编语言,并且对CPU读取指令有了一个感性的认识,如果你没有读懂的话请给我发送邮件或者参看王爽写的汇编语言..其实那篇文章说的东西你不懂也没有关系,我觉得和写汇编程序关系不大,特别是写

win32汇编程序.. 既然如此就让我们了解今天的话题 CPU的工作原理..

CPU的工作原理

其实CPU从不亲自去作显卡显示图像,声卡发出声音这些事情,而是CPU在自己的逻辑存储器(这是假想中的,这个操作对我们是透明的)地址空间里通过控制总线进行操作,那些外部器件自己在逻辑存储器里面找块地方让CPU分个地址..这个说起来好像比较拗口啊,没有关系如果你不懂也关系不大,如果觉得我讲的不太明白可以参考王爽汇编

对于一个汇编程序员来说不必要深入的了解这些东西,我们在写程序的时候主要是和寄存器打交道我们通过操作寄存器来达到控制CPU的目的.所以不了解以上讲的问题不是很大的..

寄存器:

既然我们用汇编写程序主要打交道的是寄存器,那么我们有必要深入的了解下寄存器了,寄存器是什么呢? 它其实和内存是一样的东西,只是更加快而已,所以别被他吓倒,那么有多少个寄存器呢? 我可以非常难过的告诉你,寄存器的个数非常多,诶当初我就是看到这个才放弃学习汇编的,不过后来有幸看到了王爽的汇编语言后,才发觉原来寄存器也不过如此啊,我知道你现在想深入的了解寄存器,但是请别急慢慢来,,我们先了解4个寄存器 AX BX CX DX..这4个我们用的最多了,我知道你现在又非常的想了解寄存器到底有什么用,但是请听我说,你还需要具备一点东西,来伙计,我再给你介绍2条常见的汇编指令,非常容易理解:

mov指令,add指令..它们的用法是这样的:

mov ax,19 将19送入AX AX = 19

add ax,18 将寄存器AX的值+18 AX = AX + 18

简单吧,学过高级语言的优势就出来咯,如果你还不懂高级语言赶紧去看下尚学堂那个视频啊! 那来考虑下我们在高级语言里面这样一段代码

int a = 10;

int b = 20;

int c;

c = a + b;

我们用汇编该怎么来表示呢?? 我想应该是这样的

mov ax, 10

mov bx, 20

add cx, ax

add cx, bx

明白了吧,寄存器是什么玩意,现在不嫌弃寄存器的个数多了吧,也不觉得寄存器多有什么问题了吧, 毛主席说:代码就能够说明一切问题啊,这应该是有道理的..那么到底有多少寄存器呢,总共只有4个AX, BX CX DX..但是对我们的编程来说一点问题也没有有了4个就够了~~~..

在8086以前的CPU都是8位的..8086是16位的机器上面的那些寄存器都是16位的(明白什么叫16位了吧),那以前8086以前的CPU呢怎么办呢?intel向了个折中的办法,就是把这些16位的寄存器再进行分家,就分成了高8位和低8位比如

AX 就分为 AH AL

BX 就分为 BH BL

CX 就分为 CH CL

DX 就分为 DH DL

这里H 和L的意思分别表示High和Low好理解了吧,其实它们的用法也是一样的,我们就挑AX来讲讲, 比如现在有一个数字43E4储存在AX中那么AH的值为43,AL为E4为什么呢?intel的CPU是把数据按照高位到低位排列的所以AH(高8位)就存储了43,AL(低8位)就存储了E4,就那么简单,由上我们也可以看出CPU 可以处理的数据只有2种,一种是字(word占16位)一种是字节(byte 8位),一个字存放在16位寄存器中,这个字的高位字节和低位字节自然就存储在这个寄存器的高8位和低8位了..比如

AX = 3454H

那么自然的 AH = 34H AL = 54H

同时我们又可以把AH和AL当作单独的两个寄存器来使用它们都互不影响的!如:

AH = 42H

那么 AL还是为54H 但是AX却改变了 AX = 4254H,那么寄存器的内容就这些了,只是有些细节要注意下,请看代码:

mov ax, 8F35H

add ax, 4E34H

add ax, 9F45H

那么现在AX的值为多少呢? 你可能会认为是17CAF,但是我告诉你AX=7CAF,为什么呢如果一个值超过了它所能表示的范围,那么它将把进位丢弃(不是真的丢弃,但是我们现在可以这样认为)同样的事情发生在8位寄存器上,请看:

mov al, 8FH

add al, 4EH

add al, 45H

那么AL的值是22,它同样丢失别以为他会进位到AH或者其他地方,这里我们如果进行的8位运算CPU就只认识8位寄存器,其他的不管,所以以下这些指令都是错误的:

mov ax, bl ‘把16位和8一起用是错的

mov bh, ax ‘把8位和16为一起用也是错的

mov ax, 20000000 ‘把一个大于寄存器的值赋给寄存器也是错的

add al, 10000 ‘将一个大于8位的数据加到8位寄存器也是错的

嗯,终于完了,这是一场攻坚战啊,学汇编和学C不同如果上来就Hello World的话估计大部分人都的晕,所以我们还是要先打下基础啊,虽然现在还是纸上谈兵,但是我们毕竟已经接触到了汇编指令了,再过两结课我们就可以上机写写指令了,但是现在还不行,先好好体会下..接下来我们还要讲下CPU是怎么给出物理地址..好好体会,如果觉得我讲的哪里不对和不明白一定要告诉我!! 我建议你学习的时候结合下书本,效果肯定要好很多的.

汇编教程4:寄存器CPU工作原理②

2008-11-01 15:55

最近在网上看了长篇小说<<疯狂的程序员>>。。嗯不错不错,看来这做程序员的人还大多有些相似的,不过每个人却还是有些不同的,就象我。。诶到现在还是一无所有,人财两空啊~~~~~~命苦不能怪政府。。

上一篇寄存器CPU工作原理1,给大家介绍了几个寄存器,那几个寄存器因为

是最常用的所以也叫通用寄存器,相信大家对这寄存器还是有了一个感性的认识了,但是CPU不能够只访问寄存器的,它要做更多的事情,比如读取内存。这应该说是CPU的基本功能之一吧,所以我们不了解下CPU访问内存的方法确实有点那个啊。。。既然这样我们还是有必要了解下的。。。。。

CPU要访问内存它必须给出内存单元的地址,同时这些单元都是一维线性的。每一个内存单元都有一个唯一的地址。。这在前面的章节有所提及,那么CPU是怎么样给出内存单元的地址呢??想要了解这个问题,我们还得看看CPU的结构。。

我们通常说的8086CPU是16位的,那么这个16位代表了什么概念呢? 这个嘛。。概括起来的讲啊主要是这几点。。

寄存器一次最多只能处理16位的数据。

寄存器的最大宽度为16位

寄存器和运算器之间的通路为16位

但是问题就来了,8086有20位地址总线(20位地址总线的寻址能力就有1M了),而CPU内部只能够处理16位的数据那改怎么办呢??这个问题嘛,当然不可以浪费了地址总线对吧。。~~如果是地址总线也改成16位的那么我们的CPU寻址能力就只有64K了,那可是天壤之别啊。。当然的想个办法对不。。别人说intel 里面的人都是天才,从这方面说的话还是有些道理的。。他们想到了在CPU内部做一个加法器来进行合成一个20位的物理地址。。那么合成过程是怎么样的呢??嗯,,,好的请听我细细道来。

首先CPU中的相关部件(这个部件我们马上要提到)提供2个16位的地址,然后送入一个叫地址加法器的部件,然后地址加法器再把两个地址合成为一个20位物理地址。。那么现在问题又来了对吧。。。他是怎么样合成物理地址的呢??没有关系这里有个公式。。。套公式总是比想问题简单些的。。。额。合成地址的规则是这样的:

物理地址 = 段地址 * 16 + 偏移地址。。

毛主席说过,实践才是硬道理啊,给大家套个公式就明白了,比如现在CPU要访问内存地址单元124C8H的内存单元,那么我们就可以让段地址为1240H,然后让偏移地址为00C8H,套用公式就比较简单了:

124C8H = 1240H * 16 + 00C8H

注意拉,这里别弄错了,这里我们讨论的数据都是16进制的,所以*16只是把小数点移动了一位而已,嗯。。是不是已经感觉到了16进制的好处了。。当你在感叹16进制是多么好之余有没有想过。。我刚才写的那公式里面讲了什么。段。。段地址。。什么的!这个段地址又是什么概念呢?? 千万别以为是一段一段的地址啊!,其实内存里面是绝对没有分段的,分段只是来自CPU自己。其实分段以后是有好处的,这样我们就可以把一些连续的内存当作一个段来使用,套用上面的公式,段地址不变。。只是改动偏移地址。。哈哈这样就方便多了。我们知道偏移地址也是16位的,那么一个段最长呢也只能有64KB而已,明白了吗? 以为偏移地址只能够表示64KB的内存而已。。。

前面我们讲到了”CPU的相关部件提供两个地址”,这么一句话。。那到底是什

么东西在提供段地址呢??又是什么东西提供偏移地址呢??,这又不得不让我想到了寄存器,回忆我们前面学习的(应该还不至于忘记吧)4个通用寄存器,那么是不是CPU内部只有那么多寄存器呢?不是的。。呐。我这里就再给你说一个寄存器。这个寄存器就是专门用来放段地址的,它就是CS寄存器,不过好像叫寄存器就俗了些,不可以体现出它和其他那些寄存器的区别来,因为那些寄存器都是放一般性数据,,这CS寄存器可就不同咯。。所以又给它改个名字,就叫段寄存器吧。。这样理解应该比较好理解吧!!

现在还有个小问题,我们有了一个叫CS的段寄存器,,那还得有一个放偏移地址的寄存器啊,这次倒霉的就是CPU中一个叫IP的寄存器(嗯,别和IP地址的IP弄混了)。。啊,原来是这样啊。现在是万事俱备只欠东风啊。。就让我们来套用这个公式吧。。

物理地址 = CS * 16 + IP

就这样,给出了物理地址,事实上当你为CS为什么不叫EX或者其他的名字的时候,我得告诉你一个天大的秘密:

在8086的CPU上,任意时刻,设CS中的内容为M,IP的内容为N,那么8086将从内存:

M * 16 + N 单元开始执行。。

你可能不以为然呐,这有什么了不起啊,我跟你说这就错了,有了这玩意可以玩的事情可就多了。。你想啊我们想让CPU执行一条指令我们要怎么办呢? 想到了吧,嘿嘿。。让我值得高兴的是,我比你先想到~~~~我们只要设 M * 16 + N 的值为我们想要的内存单元地址那不就得了吗? 对的,确实是这样。。

在任意时刻 CPU将CS : IP指向的内容当作指令执行

为了让你有个更感性的认识我非常有必要举个例子,这是毛主席说的,实践才是硬道理啊,比如我在内存20000 -20003处有条指令,那么我们想让这条指令执行一下该这么办呢?我想应该是这样的

1。让CS : IP的值指向 20000处

2。读取并执行指令,同时IP值要加3

我说的第一点可能比较好理解了,可为什么要加3呢,其实是这样的,你想想啊。。。CPU从20000处开始读取指令,读取到指令后就会返回,然后呢执行,CPU在执行完了这条指令后当然知道这条指令是占几个字节,这里是3个字节。。所以CPU就会把IP的值加3。。。嗯,明白了吧,原来是这样啊。

知识这东西啊,确实是好东西。当然你得先把它学会对吧。。现在让我们回想一下,那个电脑为什么在一按电源就会呼啦啦自动执行指令。。那么我们由此可以判断出,一定是有什么东西在修改着CS : IP的值对吧。。那么事实上是这样的。。8086在加点启动后(或者重启了电脑) CS : IP的值被分别设置为CS=F000H,

IP=FFFFH也就是说CPU在启动的时候从FFFF0H单元开始执行第一条指令,有趣吧。。

所以我们可以得出结论:

想要让指令执行必须让CS:IP指向它,反过来,一条指令如果被执行了,那么CS:IP一定指向过它。。

是不是已经按耐不住了,忍不住想写几条指令给CPU执行了??事实上我是一个不

喜欢调人胃口的人,但是此时此刻我不得不提醒你,你还记得mov, add。指令吗?不会那么快就把这两条指令忘了吧,如果忘记了。那么你应该再回头看看寄存器(CPU工作原理1),如果你还记得那么就比较简单了,例如我们还是在内存20000-20003处有条指令,那么我们可以这样写代码:

mov cs, 2000H

mov ip, 0H

如果你这样写的话,是要出错的,因为intel公司不给你这样干,这样写的指令是错误的。。你可能想问下为什么不行,那么我可以给你电话,你打电话去intel 问下就清楚了,那么既然intel不给我们这样干,他总的提供让我们怎么修改CS和IP的值的方法吧,那么我可以明确的告诉你,方法是有的,就是用另外一条指令,它就是 jmp,使用方法:

同时修改CS 和IP的值: jmp 段地址 : 偏移地址

jmp 1000:2

只修改IP的值: jmp 某一合法寄存器

jmp ax ‘这条指令执行的效果和 mov ip, 0H的效果差不多

如果你看到了这里,并且前面的教程你都看了,并且明白了,那么我不得不佩服你的勇气,与毅力,好好努力,相信自己一定可以把汇编学好的。相信你看到这里也开始心里甜了吧,很多奥秘开始向你解开,我当初就是学到这里的时候想,我一定要把汇编学下去,并且要学好。。相信你也是一样,下一篇我就要给大家将debug的使用了,虽然那东西简陋但是还是有必要了解下的。。因为它简单,学起来方便。。OK今天就到这里吧,晚上2点了!

汇编教程5:debug的使用

2008-11-01 15:56

嗯,这次距离上次文章发布快两个礼拜了,今天我终于痛下决心了。要再写一篇。写到一半,好友“冰横”,来向我介绍黑莓手机,,黑莓??什么是黑莓手机。诶!看来啊,落后拉。。后来查下资料才发现,这东西确实好啊,又便宜,功能又多。。有时间挑一个。然后在写这篇文章的时候,要找一个屏幕截图的软件,我用的是SangIt这个软件我可是用了好几年了6.0就开始用了,现在都9.0了。非常不错。在WP里面上传的时候弄了好几次都没有成功,不过最后还是成功拉!废话少说,开始今天的话题:debug的使用

上次我们讲了CPU给出物理地址的方法、和介绍了2个段寄存器 CS 和IP。虽然我已经写了好几篇了,但是还没有涉及到任何的编程知识,这在学习高级语言里面是不敢想象的,学高级语言就是好啊,比如C。哈哈上来就写“hello world”,汇编可不行,,写完这篇,我们还不能写出“Hello World”,还要

下几篇才可以,不过别泄气。通用寄存器那章都挺过来了,这两篇不难。

本来我是想直接和大家讲“Rad ASM”想想还是作罢,还是讲讲“debug”吧,让大家了解下计算机内部的原理。实际上你以后在编程工作中根本就用不到“debug”,至少我是很少用到,我都是用“Rad Asm”里面集成的调试器,直观,方便。所以这章也不用死记,只要了解原理就成。

“debug”是什么呢?debug是一个软件,是一个调试其他软件的软件,既然是软件,当然要启动拉,在windows 2000/xp下启动可以这样,[开始]-[运行]-[cmd]。打开命令行窗口,然后输入命令 [debug],这样就启动了程序

debug是古老的命令行方式运作,命令繁多,一下介绍怕消化不完,那么我们只学习几个常用的。

-R

查看,改变寄存器的值。

-D

查看内存中的内容

-E

改写内存中的内容

-U

将内存中的机器指令翻译为汇编指令

-T

执行一条汇编指令

-A

以汇编的指令的格式在内存中写入一条汇编指令

这就是我们最常用的debug指令了。这样罗列出来给大家看,非常的不直观。。我们就来做几个实例虽然我个人非常不喜欢用图片来讲解计算机的原理性的东西,但是不可否认,这样更容易让人理解:

-R:查看和修改寄存器的值:我们已经学过6个寄存器了,4个通用的,2个段寄存器。。

上面是在命令行里面显示的信息,,非常简单、你在自己电脑上试试就可以了,

告诉你一个小密码,这个命令是系统自带的,所以别问我哪里下载(这个软件在MS-DOS的时候就是系统自带了,所以现在的系统里面都有这个软件。如果你看不明白请在自己的电脑中试验下,实在不明白请看王爽《汇编语言》,首先最上面是输入了-R命令,然后显示出了很多寄存器的值,有几个我们是认识的,有几个我们还不认识,不过没有关系,我们会在以后的时间介绍,现在就先不管了,反正记得这是显示寄存器的值就是拉,左下角这里显示的 CA12:0100你仔细看看就明白了,刚好对应CS:IP的值对吧。旁边的ADD DH[ DI +48 ] 这就是当前CS:IP指向地址的指令。同样的右下角还有个DS: 0048 = 00这个也不用深究,现在不用了解。。

命令就是这样,很简单,自己试验试验就直观了,如果要改变一个寄存器的值可以这样:

输入命令-R接着要修改的寄存器,然后回车,就输入想要修改寄存器的值就成,然后你要记得举一反三,修改其他寄存器的值方法也是一样的,包括CS:IP寄存器。所以说是非常简单的。。

-R命令:查看内存中的内容:我们可以用 d 段地址:偏移地址的方式查看,使用方法如下:

输入命令后,默认是显示从你输入的物理地址开始128个内存单元的内容,右边全是点…的这里是该内存单元内容所对应的ASCII码。如果你嫌弃它给你显示的内存单元少了或者多了,比如现在我们要显示1000:0-1000:23内存单元的内容该怎么做呢?我们可以试试这样: d:1000:0 23 。这样就把1000:0-1000:23内存单元的内容全部显示出来了,一个不多,一个不少。这里就不截图了,自己试试。

-E命令:改写内存单元的内容:这个比较简单,截图一看你就明白了:

非常简单吧,我们先用d命令查看了1000:0处的内容,然后用e命令修改内存单元的内容,总共修改了11个从43开始到32结束。当然你也可以写入ASCII 码值,道理和写入数字是一样的,不过记得字符串要加冒号”"。是英文的冒号。

-U命令:查看内存中该地址对应的汇编指令:

可以看出来,这条命令是非常简单的,这条命令和-D很像,-D是查看内存中的ASCII码,-U是查看对应的汇编指令。非常简单。所以看到这里你就应该明白,在内存中执行指令和数据是没有区别的,关键是CPU如何解释了,如果你让CS:IP 指向它,那么这个地方就是执行指令,如果你让~~~,呵呵那个还没有讲呢,下次再讲。

-A命令:以汇编的形式在内存中写入指令:使用方法也是非常简单:

我们首先用-A在2000:0处写入了3条指令,然后用-U查看了2000:0-2000:10的汇编指令,结果当然是显示我们刚才写入的指令了,所以说非常简单。看也看

了,写也写了,追究是为了执行,所以我们来看看如何执行汇编指令。

-T命令:执行一条指令,如果没有给出CS:IP,那么就执行默认的CS:IP处的指令:

T命令也是非常简单的,上图我们是先用-R命令查看了寄存器的值,然后用-R 修改了CS和IP的值,然后用-A在2000:0处写入了一条指令,最后用-T执行了一下,注意看AX的值,是不是加1了,非常简单吧。。

到这里debug最简单的使用方法就讲完了,这篇我写的特别累,主要是截图,我喜欢安静的写,这样可以让自己的思绪有条理,所以我喜欢汇编,不喜欢用VB,或者delphi这样的可视化工作界面,用汇编你想做什么就做什么,只要你能够想到,限制你的只有你的知识和你的想象空间。debug就已经讲完了,是不是意见有了一些成绩了?你可能不以为然,说这debug能够做什么呢??其实可以做的事情多了,如果你是在没有任何开发工具的情况下,又需要写个小程序做点事情(好像只有黑客这么干),那么debug是非常不错的选择,在网吧或者其他别人的电脑里面想做点破坏你就可以写点汇编指令。非常不错、什么开发工具都不用。当然现在你还没有那个能力,等你再深入的学习下你就可以做到了。

这一篇又写完了,下面我们主要讲下栈,等讲完了栈就可以开始用记事本写自己的“hello World”了,在如何学习汇编就已经讲过,学习汇编是很吃苦的事情,但是,如果你越过了这道槛,你就会获得很大的收获。有听过“浴火重生”的故事吗?传说中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于人世间的所有不快和仇恨恩怨,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和和幸福。同样在肉体经受了巨大的痛苦和轮回后它们才能得以更美好的躯体得以重生.

脱壳的艺术!(1)

2008-11-01 20:27

概述:脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键。这个挑战既牵涉到壳的创建者,也牵涉到那些决心躲过这些保护的脱壳者。

本文主要目的是介绍壳常用的反逆向技术,同时也探讨了可以用来躲过或禁用这些保护的技术及公开可用的工具。这些信息将使研究人员特别是恶意代码分析人员在分析加壳的恶意代码时能识别出这些技术,当这些反逆向技术阻碍其成功分析时能决定下一步的动作。第二个目的,这里介绍的信息也会被那些计划在软件中添加一些保护措施用来减缓逆向分析人员分析其受保护代码的速度的研究人员用到。当然没有什么能使一个熟练的、消息灵通的、坚定的逆向分析人员止步的。

关键词:逆向工程、壳、保护、反调试、反逆向

1简

在逆向工程领域,壳是最有趣的谜题之一。在解谜的过程中,逆向分析人员会获得许多关于系统底层、逆向技巧等知识。

壳(这个术语在本文中既指压缩壳也包括加密壳)是用来防止程序被分析的。它们被商业软件合法地用于防止信息披露、篡改及盗版。可惜恶意软件也基于同样的理由在使用壳,只不过动机不良。

由于大量恶意软件存在加壳现象,研究人员和恶意代码分析人员为了分析代码,开始学习脱壳的技巧。但是随着时间的推移,为防止逆向分析人员分析受保护的程序并成功脱壳,新的反逆向技术也被不断地添加到壳中。并且战斗还在继续,新的反逆向技术被开发的同时逆向分析人员也在针锋相对地发掘技巧、研究技术并开发工具来对付它们。

本文主要关注于介绍壳所使用的反逆向技术,同时也探讨了躲过/禁用这些保护措施的工具及技术。可能有些壳通过抓取进程映像(dump)能够轻易被搞定,这时处理反逆向技术似乎没有必要,但是有些情况下加密壳的代码需要加以跟踪和分析,例如:

需要躲过部分加密壳代码以便抓取进程映像、让输入表重建工具正确地工作。深入分析加密壳代码以便在一个反病毒产品中整合进脱壳支持。

此外,当反逆向技术被恶意程序直接应用,以防止跟踪并分析其恶意行为时,熟悉反逆向技术也是很有价值的。

本文绝不是一个完整的反逆向技术的清单,因为它只涵盖了壳中常用的、有趣的一些技术。建议读者参阅最后一节的链接和图书资料,以了解更多其他逆向及反逆向的技术。

笔者希望您觉得这些材料有用,并能应用其中的技术。脱壳快乐!

2 调试器检测技

本节列出了壳用来确定进程是否被调试或者系统内是否有调试器正在运行的技术。这些调试器检测技术既有非常简单(明显)的检查,也有涉及到native APIs 和内核对象的。

2.1 PEB.BeingDebugged Flag : IsDebuggerPresent()

最基本的调试器检测技术就是检测进程环境块(PEB)1中的BeingDebugged标志。kernel32!IsDebuggerPresent() API检查这个标志以确定进程是否正在被用户模式的调试器调试。

下面显示了IsDebuggerPresent() API的实现代码。首先访问线程环境块(TEB)2得到PEB的地址,然后检查PEB偏移0x02位置的BeingDebugged标志。

mov eax, large fs: 18h

mov eax, [eax+30h]

movzx eax, byte ptr [eax+2]

retn

除了直接调用IsDebuggerPresent(),有些壳会手工检查PEB中的BeingDebugged 标志以防逆向分析人员在这个API上设置断点或打补丁。

示例

下面是调用IsDebuggerPresent() API和使用PEB.BeingDebugged标志确定调试器是否存在的示例代码。

;call kernel32!IsDebuggerPresent()

call [IsDebuggerPresent]

test eax,eax

jnz .debugger_found

;check PEB.BeingDebugged directly

Mov eax,dword [fs:0x30] ;EAX

= TEB.ProcessEnvironmentBlock

movzx eax,byte [eax+0x02] ;AL = PEB.BeingDebugged

test eax,eax

jnz .debugger_found

由于这些检查很明显,壳一般都会用后面章节将会讨论的垃圾代码或者反—反编译技术进行混淆。

对策

人工将PEB.BeingDebugged标志置0可轻易躲过这个检测。在数据窗口中Ctrl+G (前往表达式)输入fs:[30],可以在OllyDbg中查看PEB数据。

另外Ollyscript命令"dbh"可以补丁这个标志。

dbh

最后,Olly Advanced3 插件有置BeingDebugged标志为0的选项。

2.2 PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags

PEB.NtGlobalFlag PEB另一个成员被称作NtGlobalFlag(偏移0x68),壳也通过它来检测程序是否用调试器加载。通常程序没有被调试时,NtGlobalFlag 成员值为0,如果进程被调试这个成员通常值为0x70(代表下述标志被设置):FLG_HEAP_ENABLE_TAIL_CHECK(0X10)

FLG_HEAP_ENABLE_FREE_CHECK(0X20)

FLG_HEAP_VALIDATE_PARAMETERS(0X40)

这些标志是在ntdll!LdrpInitializeExecutionOptions()里设置的。请注意PEB.NtGlobalFlag的默认值可以通过gflags.exe工具或者在注册表以下位置创建条目来修改:

HKLM\Software\Microsoft\Windows Nt\CurrentVersion\Image File Execution Options

Heap Flags 由于NtGlobalFlag标志的设置,堆也会打开几个标志,这个变化可以在ntdll!RtlCreateHeap()里观测到。通常情况下为进程创建的第一个堆会将其Flags和ForceFlags4分别设为0x02(HEAP_GROWABLE)和0 。然而当进程被调试时,这两个标志通常被设为0x50000062(取决于NtGlobalFlag)和

0x40000060(等于Flags AND 0x6001007D)。默认情况下当一个被调试的进程创建堆时下列附加的堆标志将被设置:

HEAP_TAIL_CHECKING_ENABLED(0X20)

HEAP_FREE_CHECKING_ENABLED(0X40)

示例

下面的示例代码检查PEB.NtGlobalFlag是否等于0,为进程创建的第一个堆是否设置了附加标志(PEB.ProcessHeap):

;ebx = PEB

Mov ebx,[fs:0x30]

;Check if PEB.NtGlobalFlag != 0

Cmp dword [ebx+0x68],0

jne .debugger_found

;eax = PEB.ProcessHeap

Mov eax,[ebx+0x18]

;Check PEB.ProcessHeap.Flags

Cmp dword [eax+0x0c],2

jne .debugger_found

;Check PEB.ProcessHeap.ForceFlags

Cmp dword [eax+0x10],0

jne .debugger_found

对策

可以将 PEB.NtGlobalFlag和PEB.HeapProcess标志补丁为进程未被调试时的相应值。下面是一个补丁上述标志的ollyscript示例:

Var peb

var patch_addr

var process_heap

//retrieve PEB via a hardcoded TEB address( first thread: 0x7ffde000) Mov peb,[7ffde000+30]

//patch PEB.NtGlobalFlag

Lea patch_addr,[peb+68]

mov [patch_addr],0

//patch PEB.ProcessHeap.Flags/ForceFlags

Mov process_heap,[peb+18]

lea patch_addr,[process_heap+0c]

mov [patch_addr],2

lea patch_addr,[process_heap+10]

mov [patch_addr],0

同样地Olly Advanced插件有设置PEB.NtGlobalFlag和PEB.ProcessHeap的选项。

2.3 DebugPort:

CheckRemoteDebuggerPresent()/NtQueryInformationProcess()

Kernel32!CheckRemoteDebuggerPresent()是另一个可以用于确定是否有调试器被附加到进程的API。这个API内部调用了

ntdll!NtQueryInformationProcess(),调用时ProcessInformationclass参数为ProcessDebugPort(7)。而NtQueryInformationProcess()检索内核结构EPROCESS5的DebugPort成员。非0的DebugPort成员意味着进程正在被用户模式的调试器调试。如果是这样的话,ProcessInformation 将被置为

0xFFFFFFFF ,否则ProcessInformation 将被置为0。

Kernel32!CheckRemoteDebuggerPresent()接受2个参数,第1个参数是进程句柄,第2个参数是一个指向boolean变量的指针,如果进程被调试,该变量将包含TRUE返回值。

BOOL CheckRemoteDebuggerPresent(

HANDLE hProcess,

PBOOL pbDebuggerPresent

)

ntdll!NtQueryInformationProcess()有5个参数。为了检测调试器的存在,需要将ProcessInformationclass参数设为ProcessDebugPort(7):

NTSTATUS NTAPI NtQueryInformationProcess(

HANDLE ProcessHandle,

PROCESSINFOCLASS ProcessInformationClass,

PVOID ProcessInformation,

ULONG ProcessInformationLength,

PULONG ReturnLength

)

示例

下面的例子显示了如何调用CheckRemoteDebuggerPresent()和NtQueryInformationProcess()来检测当前进程是否被调试:

; using Kernel32!CheckRemoteDebuggerPresent()

lea eax,[.bDebuggerPresent]

push eax ;pbDebuggerPresent

push 0xffffffff ;hProcess

call [CheckRemoteDebuggerPresent]

cmp dword [.bDebuggerPresent],0

jne .debugger_found

; using ntdll!NtQueryInformationProcess(ProcessDebugPort)

lea eax,[.dwReturnLen]

push eax ;ReturnLength

push 4 ;ProcessInformationLength

lea eax,[.dwDebugPort]

push eax ;ProcessInformation

push ProcessDebugPort ;ProcessInformationClass(7) push 0xffffffff ;ProcessHandle

call [NtQueryInformationProcess]

cmp dword [.dwDebugPort],0

jne .debugger_found

对策

一种方法是在NtQueryInformationProcess()返回的地方设置断点,当这个断点被断下来后,将ProcessInformation 补丁为0。下面是自动执行这个方法的ollyscript示例:

var bp_NtQueryInformationProcess

// set a breakpoint handler

eob bp_handler_NtQueryInformationProcess

// set a breakpoint where NtQueryInformationProcess returns

gpa "NtQueryInformationProcess","ntdll.dll"

find $RESULT,#C21400# //retn 14

mov bp_NtQueryInformationProcess,$RESULT

bphws bp_NtQueryInformationProcess,"X"

run

bp_handler_NtQueryInformationProcess:

//ProcessInformationClass == ProcessDebugPort?

cmp [esp+8],7

jne bp_handler_NtQueryInformationProcess_continue

//patch ProcessInformation to 0

mov patch_addr,[esp+c]

mov [patch_addr],0

// clear breakpoint

bphwc bp_NtQueryInformationProcess

bp_handler_NtQueryInformationProcess_continue:

run

Olly Advanced插件有一个patch NtQueryInformationProcess()的选项,这个补丁涉及注入一段代码来操纵NtQueryInformationProcess()的返回值。

2.4 Debugger Interrupts

在调试器中步过INT3和INT1指令的时候,由于调试器通常会处理这些调试中断,所以异常处理例程默认情况下将不会被调用,Debugger Interrupts就利用了这个事实。这样壳可以在异常处理例程中设置标志,通过INT指令后如果这些标志没有被设置则意味着进程正在被调试。另外,kernel32!DebugBreak()内部是调用了INT3来实现的,有些壳也会使用这个API。

示例

《汇编语言》课程培训心得体会

《汇编语言》课程培训心得体会 各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢 2011年6月17日至19日,本人参加了教育部全国高校教师网络培训中心举办的汇编语言课程培训,曹老师和毛老师所做的精彩讲解,令本人深有感触,有非常大的收获。 汇编语言是计算机专业的一门重要专业课,是很多其他课程的先导课程,比如数据结构、操作系统、编译原理等,一般来说,开设汇编之前学生们之前一般已经学习了至少一门高级语言,比如C 语言。学好汇编语言,能够指导学生们学习和理解计算机系统以及程序设计思想。汇编语言在计算机专业课程中处于重要的地位。 在学习汇编之前,学生没有一点底层编程经验,汇编语言中的内容,学生们基本上都没有概念,尤其对于二本的

学生来说,理解和掌握汇编语言还是比较困难的。这就需要授课教师不断改进自己的教学思想,提高自己的教学水平,以适应学生的需求。 这里,本人很认同曹教授所说的。可以按照学生的类型分班进行教学,这样,对不同的学生可以有不同的要求,做到因材施教,令所有学生都能在课程中有所收获。而不是很多学生觉得课程过难,听不懂,接受不了;另外一些同学又觉得对课程的学习意犹未尽。当然,在大部分学校,现在时机可能还不成熟,需要学校和授课教师改变思路,付出更多。课程中对学生的考核是很重要的,考试成绩应该说是一个比较客观的衡量方式,但又不足以让老师完全学生的情况。除了期末考试之外,平时上课和上机的考查也非常重要。在课堂上,可以用提问和随堂留题目当堂上交的方法来代替点名,这样,在督促学生上课的同时,也掌握了一些学生的学习情况,及时得到学生的反馈。上机的时候,可以

挑选内容让学生讲解或重做,督促学生学习,同时掌握学习情况,分析教学中的问题,以便解决。而实验报告,个人认为,更应该侧重于学生的收获和遇到问题的总结上面,这样可以为改进教学提供素材,同时掌握学生上机的情况。 另外,对于二本院校的学生来说,个人认为教学中需要注意很多问题,教学中不应过于追求难度和广度,而是应该让学生实实在在学到一些知识,激发学生的兴趣,增强学生的信心。需要老师在备课过程中精心准备,要求学生掌握的基本知识应该用不同方式反复强调,教学中重点要突出。汇编中的有些概念,学生是比较难理解的,所以例题要认真挑选,讲解的PPT要更生动形象,便于帮助学生理解。 以上就是这门课程学习后,我的一点不成熟的想法和体会。 梁琦 各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢

《汇编语言》在线作业二

请同学及时保存作业,如您在20分钟内不作操作,系统将自动退出。 《汇编语言》在线作业二 一、单选题(共 20 道试题,共 100 分。) V 1. 在多重循环程序中,每次通过外层循环进入内层循环时,其内层循环的初始条件(B )。 A. 不必考虑 B. 必须重新设置 C. 必须置1 D. 须清0 满分:5 分 2. 伪指令是(C)规定的汇编说明符,它在源程序汇编时进行说明。 A. DEBUG B. LINK C. MASM D. EDIT 满分:5 分 3. 下列描述正确的是(D)。 A. 在多重循环程序中,内层循环只能有一个 B. 在汇编语言程序设计中,二重循环程序之间的关系可以交错 C. 在汇编语言程序设计中,每次循环应返回到置初值部分之前 D. 在汇编语言程序设计中,每次循环应返回到置初值部分之后 满分:5 分 4. 下列指令会影响标志位的指令是(D)。 A. JMP L

B. JC L C. MOV AL,L D. SHL AL,1 满分:5 分 5. LINK命令执行后可以生成一个以(B)为扩展名的文件。 A. ASM B. EXE C. OBJ D. COM 满分:5 分 6. 如果0100H单元存放条件转移指令的操作码,0101H单元存放条件转移指令的相对位移量 13H,那么转移后的指令的偏移地址为(C)。 A. 0102H B. 0113H C. 0115H D. 00FEH 满分:5 分 7. 若DS=1000H,BX=2000H,(12000H)=56H,(12001H)=78H,AX=1000H,执行“ADD AX,[BX]”指令后,AX=(A)。 A. 8856H B. 6678H C. 8800H D. 6600H 满分:5 分 8. 下列叙述正确的是(A )。 A. 执行一条段间调用指令,先将CS、IP的内容压栈,然后将目的地址送CS和IP。 B. 执行一条段间调用指令,先将目的地址送CS和IP,然后将CS、IP的内容压栈。

汇编语言程序设计期末考试试卷及参考答案

【汇编语言程序设计】期末考试-试卷及参考答案

执行上述两条指令后,正确的结果是( B )。 A.(AX)=1001H; B.(AX)=0FFFH; C.(AX)=1000H; D.(AX)=0111H。 6.串指令中的目的操作数地址一定是由____A_ _提供。()A.ES:[DI] ; B.SS:[BP]; C.DS:[SI] ; D.CS:[IP]。 7.将DX的内容除以2,正确的指令是( C )。 A.DIV 2 ; B.DIV DX,2 ; C.SAR DX,1; D.SHL DX,1。 8. 用户为了解决自己的问题,用汇编语言所编写的程序,称为( B )。 A.目标程序; B.汇编语言源程序; C.可执行程序; D.汇编程序。 9.用一条指令仅实现将AX←BX+SI的方法是( D )。 A.XCHG AX,[BX][SI] ; B.MOV AX,[BX+SI]; C.LEA AX,BX[SI] ; D.LEA AX,[BX][SI]。 10.设SP初值为2000H,执行指令“PUSH AX”后,SP的值是( C )。 A.1FFFH; B.1998H; C.1FFEH; D.2002H。 2. C 二、指出下列指令的出错原因,并改正。(每小题2分,共12分) 1.MOV BX,DL;操作数类型不匹配,改正为:MOV BL,DL 或MOV BX,DX 2.MOV CS,AX;代码段寄存器CS不能作目的操作数,改正为MOV DS,AX 3.ADD AX,DS;段寄存器DS的内容不能作为加法指令的操作数,改正为 MOV BX,DS ADD AX,BX 4.TEST BX,[CX];不能使用CX实现寄存器间接寻址,改正为 MOV SI,CX TEST BX,[SI] 5.SUB [BX],[BP+SI];两个操作数不能同为存储器操作数,且两个操作数的数据类型不确定,改正为:MOV AX,[BX] SUB AX,[BP+SI] 或:MOV AL,[BX] SUB AL,[BP+SI] 6.SHL DX ;没有给出移位次数,改正为SHL DX,1或 SHL DX,CL 三、程序填空题(注意:每空只能填一条指令,并注释说明所填指令的作用!每空3分,共18分) 1.在表TABLE处存放着N个无符号字节数,求表中前10个字节数的总和并

《汇编语言》段总结

《汇编语言》段总结 我们可以可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们自己的安排。 “段地址”这个名称中包含着“段”的概念。这种那个说法可能对一些学习者产生了误导【呵呵,曾经有一段时间真的误导了我,有时我禁不住在想为什么会被误导,那是因为我没有真懂。】,使人误以为内存被划分了一个一个的段,每一个段有一个段地址。如果我们在一开始形成了这种认识,将影响以后对汇编语言的深入理解和灵活应用。 其实,内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址x16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。 这就好比水杯,水杯并没有给自己刻度,刻度的划分来自于人类。 我们为什么进行这样的安排?因为这可使得我们可以用分段的方式来管理内存,即为了方便、有序的管理内存。 这就是人类的伟大之处,一个没有生命的东西,如果我们给它一个设定,并对这个设定赋予思想,这个被我们设定的没有生命的东西就会以生命的形式存在。 我们可以用一个段存放数据,将它定义为“数据段”; 我们可以用一个段存放代码,将它定义为“代码段”; 我们可以用一个段当作栈,将它定义为“栈段”; 我们可以这样安排。但若要让CPU按照我们的安排来访问这些段,就要: 对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当作数据来访问; 对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令; 对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,比如执行push、pop指令等,就将我们定义的栈段当作栈空间来使用。 其实,CS相当于一个指挥部,负责勘探,作战计划的制定、部署等。即任意时刻,CPU将CS:IP指向的内容当作指令执行。 而DS就相当于一个中转部,负责将CS制定出的计划传达,比如作战人员、物质等。 SS就相当于最终的实际的执行者,因为战场在内存中,SS接收到DS传送的CS制定出的计划,及作战人员、物质等开始作战。 总结:CPU相当于一个作战机构,而内存相当于战地。CS、DS及SS用的是望远镜原理,但这个望远镜带有照相功能,其实质是数字记位法。 可见,不管我们如何安排,CPU将内存中的某段内容当作代码,是因CS:IP指向了那里;CPU将某段内存当作栈,是因为SS:SP指向了那里。 我们一定要清楚,什么是我们的安排,以及如何让CPU按我们的安排行事。要非常清楚CPU的工作机理,才能控制CPU按照我们的安排运行的时候做到游刃有余。

汇编语言程序设计教学大纲

《汇编语言程序设计》课程教学大纲 二、课程简介 汇编语言是计算机能够提供给用户使用的最快最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言,因而,对程序的空间和时间要求很高的场合及需要直接控制硬件的应用场合,汇编语言的应用是必不可少三、课程目标 汇编语言课程是计算机专业的一门专业选修课。通过本课程的学习,应使学 生系统地了解计算机组成原理与内部的运行机理,掌握汇编语言程序设计及相关 知识,为学习本专业后继课程和进行与硬件有关的技术工作打下良好基础。通过 上机实验,使学生受到软硬件实验的初步训练,并培养学生分析问题和解决问题 的能力。 四、教学内容及要求 第一章基础知识 1.教学内容 (1) 为什么要用汇编语言编写程序 (2) 进位计数制与不同基数的数之间的转换 (3) 二进制数和十六进制数运算 (4) 计算机中数和字符的表示 (5) 几种基本的逻辑运算 2.基本要求 了解机器指令、代码指令、机器语言、汇编指令、汇编语言、汇编语言源程 序、汇编程序、汇编等概念;掌握进位计数制与不同基数的数之间的转换及

运算;计算机中数和字符的表示;“与”、“或”、“非”、“异或”等几种基本的逻辑运算; 第二章80X86计算机组织 1.教学内容 计算机系统概述、存储器、中央处理机和外部设备。 2.基本要求 理解计算机的硬件和软件系统及其关系。掌握计算机的基本结构及总线;存储器的内容、地址及存储器的分段;中央处理机的组成、80X86系列CPU工作寄存器构成和功能,特别是段寄存器和标志寄存器;外设接口、端口和8086/8088的端口地址范围和访问方法。 第三章80X86的指令系统 1.教学内容(重点内容) IBM PC机的寻址方式、IBM PC机的指令系统。 2.基本要求 熟练掌握IBM PC机寻址方式及物理地址的计算;数据传送、算术、逻辑、串处理、控制转移和处理机控制指令六组中的所有指令的格式、操作、及影响的标志位。了解机器语言的指令组成; 第四章汇编语言程序格式 1.教学内容 汇编程序功能、伪操作、汇编语言程序格式、汇编语言程序的上机过程。 2.基本要求 掌握DEBUG程序和命令及能用DEBUG 程序调试和运行简单小程序;汇编语言上机步骤、汇编程序的功能;数据定义及存储器分配、表达式赋值“EQU”和“=”、段定义、程序开始和结束、对准、基数控制等六类伪操作;汇编语言程序格式中的名字、操作、操作数和注释等项。 第五章循环与分支程序设计 1.教学内容 程序设计的一般步骤和基本结构、循环程序设计和分支程序设计 2.基本要求 掌握汇编语言程序的编制步骤和结构化程序设计的三种基本结构;循环的设计方法和多层循环的设计;分支程序的设计方法,并能编制相应的程序。第六章子程序结构 1.教学内容 子程序的设计方法、嵌套与递归子程序、子程序举例和DOS系统功能调用

汇编语言-期末考试-试题讲课教案

一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.CPU要访问的某一存储单元的实际地址称() A.段地址B.偏移地址 C.物理地址D.逻辑地址 2.某存储单元的物理地址是12345H,可以作为它的段地址有() A.2345H B.12345H C.12340H D.1234H 3.执行后使BX=0的同时也使CF=0,OF=0的指令是() A.XOR BX,BX B.OR BX,BX C.AND BX,BX D.CMP BX,BX 4.循环控制指令LoopNZ/LoopNE控制循环继续执行的条件是() A.CX≠0且ZF=1B.CX≠0且ZF=0 C.CX≠0或ZF=1D.CX≠0或ZF=0 5.在执行DAA指令,当高四位BCD码校正时产生进位,如要把此进位值送入AH中,对这进位值的操作应是() A.DAA校正指令的功能已自动加在AH中 B.进位值在AF中,校正后根据AF内容再加在AH中 C.进位值在CF中,校正后根据CF内容再加在AH中 D.进位值在AL最高位上,校正后根据AL最高位内容再加在AH中 6.AND,OR,XOR,NOT为四条逻辑运算指令,下面的解释正确的是() A.指令XOR AX,AX执行后,AX内容不变,但设置了标志位 B.指令OR DX,1000H执行后,将DX最高位置1,其余各位置0 C.指令AND AX,OFH执行后,分离出AL低四位 D.NOT AX,执行后,将AX清0 7.在执行下列指令时,需要使用段寄存器DS的指令是() A.STOSW B.ADD AL,CL C.NEG BX D.INC DA[BX] 8.无论BH中原有的数是奇数或偶数,若要使BH中的数一定为奇数,应执行的指令是()A.ADD BH,01H B.OR BH,01H C.XOR BH,01H D.TEST BH,01H 9.完成对CL寄存器的内容乘以4的正确操作是() A.ROL CL,1B.MUL4 ROL CL,1 C.SHL CL,1D.MOV CL,2 SHL CL,1SHL CL,CL 10.下面各传送指令中,正确的是() A.MOV[DI],[SI]B.MOV[DX+DI],AL C.MOV WORD PTR[BX],0100H D.MOV AL,BX 11.汇编语言语句格式中对名字项的规定如下,请找出其中错误的说法() A.名字的第一个字符可以是大写英文字母及小写英文字母 B.名字的第一个字符可以是字母、数字及、@、_ C.名字的有效长度≤31个字符 D.在名字中不允许出现$

汇编语言-王爽-完美高清版视频教程

汇编语言》-王爽-完美高清版-零基础汇编语言入门书籍PDF格式 同时按ctrl+要下载的地址既可下载对应的视频 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f61cb107c8 001第一章- 基础知识01 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6806f45b8 002第一章- 基础知识02 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6ec42d4d3 003第一章- 基础知识03 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6deb05ec4 004第一章-基础知识04 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6e51f6838 005第一章- 基础知识05 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f66edaf8d3 006第二章- 寄存器(CPU工作原理)01 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6d07e07b9 007第二章- 寄存器(CPU工作原理)02 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6d7f585a8 008第二章- 寄存器(CPU工作原理)03 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f639d8b3cf 009第二章- 寄存器(CPU工作原理)04 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6dcadbde6 010第二章- 寄存器(CPU工作原理)05 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6ea3f01c1 011第二章- 寄存器(CPU工作原理)06 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f65b96a06f 012第二章- 寄存器(CPU工作原理)07 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f682da085a 013第三章- 寄存器(内存访问)01 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6486e698 014第三章- 寄存器(内存访问)02 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6b7491d9f 015第三章- 寄存器(内存访问)03 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f622b7f9a7 016第三章- 寄存器(内存访问)04 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f64e2424b9 017第三章- 寄存器(内存访问)05 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6e5132d4d 018第三章- 寄存器(内存访问)06 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f655c10e86 019第三章- 寄存器(内存访问)07 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6b22e64e6 020第四章- 第一个程序01 下载地址:https://www.doczj.com/doc/e5126843.html,/file/f6812126a4

《汇编语言程序设计》学习心得自主学习报告.doc

自主学习报告书 题目:学习汇编语言程序设计报告学习课程:《汇编语言程序设计》姓名: 专业: 学号: 福建工程学院国脉信息学院教务处制 二○一二年六月

学习汇编语言程序设计报告书 由于实际工作中对汇编语言程序设计应用较多,在业余时间我自主学习了北京大学出版社出版的《汇编语言程序设计》一书。这一本书介绍了80x86汇编语言程序设计的方法和技术,共分为两个部分:第一部分介绍80x86cpu的编程结构,汇编语言程序的格式和伪指令,80x86cpu的寻址方式和指令系统;第二部分深入讨论分支程序、循环程序、子程序基本程序设计方法,以及以中断为主的i/o程序设计,其中包括宏指令、多模块连接技术、汇编语言与高级语言的混合编程、dos和bios提供的常用中断调用,以及文件系统等内容。 通过本书,我深入的掌握了汇编语言的编程方法、思路和技巧,并对计算机的底层编程有一定认识;还对计算机底层运行程序的机制及计算机的工作原理有了深入的了解。 在学汇编的过程中,最重要的就是要掌握汇编语言中的指令的一些基本用法。当然要能够真正的了解其中的内涵,这样在实际的编程中也能够像运用高级语言一样灵活的变通。汇编语言作为一种低级程序设计语言,既然是低级所以应该是最底层的,与计算机内部的结构联系应该联系很密切,而且我在学习中也深刻的了解到了这一点。比如说后来学到的寄存器、中断、还要各种寻址方式以及进栈出栈,好多的就是设计到计算机硬件。前面几章都是对计算机内部结构和一些常用的指令以及寻址方式的寻址方式。到后面学到子程序以及宏的作用才真正发现到其实跟高级语言差别不大。以C语言为例,C语言也

是由一个一个的函数组成的。没想到想汇编这样的低级语言也可以这样。在汇编语言的子程序和宏中,我个人更感觉宏的运用更像我们高级语言的子函数,通过定义好的宏,我们在后面直接调用就可以了。尤其是宏带参数的宏跟C语言中带参数的函数真的很像,根据参数的不同调用宏就能得到不同的结果。而汇编中的子程序没有这个传递参数这个功能。在调用子程序的时候要注意各寄存器中的内容。子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间,他不仅是源程序级别简化,形成的目标代码较短;而宏调用则是在汇编期间展开的,每调用依次进把宏定义体展开一次,它是源程序级的简化。因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间越大。如果宏调用次数较多的话,则其空间上的开销也是应该考虑的因素 汇编程序给人感觉最烦的就是好多程序的结果不能直接通过运行EXE文件显示出来,而更多的是经过DEBUG单步调试才能看到其内在变化,看是否正确。汇编程序不像其他的高级语言一样需要编译器,而是直接的就能在记事本上编写,然后进行汇编和连接就可以了。学习汇编调试,关键就是要掌握DEBUG的运用。汇编程序把汇编语言翻译成机器语言的过程称为汇编。是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。比机器语言易于读写、调试和修改,同时具有机器语言全部优点。但在编写复杂程序时,相对高级语言代码量较大,而且汇编语言依赖于具体的处理器体系结构,不能通用,因此不能直接在不同处理器体系结构之间移植。

汇编语言课程标准-李新

重庆工程职业技术学院 课程标准 (工作过程系统化设计课程) 课程名称:汇编语言 适用专业:计算机控制技术、计算机系统维护技术 课程代码:16604020 学 时:72 学 分:4 编制单位:信息工程学院 编 制 人:李新 审 核 人: 编制时间:2012年7月1日

汇编语言课程标准 1.课程定位和设计思路 1.1 课程定位 《汇编语言程序设计》是计算机控制技术专业 和计算机系统维护技术专业必修的专业基础课程之 一。 本课程主要介绍IBM PC计算机CPU的结构, 存储器的组织方式;掌握IBM PC计算机的寻址方 式;掌握8086/8088指令系统,并了解80x86、 Pentium增强和扩充指令;掌握基本的汇编语言程序设计方法和技能;掌握汇编语言程序的上机方 法;了解高级汇编语言技术。它对于学生进一步了 解计算机的内部工作过程、掌握程序设计技术、掌 握DOS中断的使用、熟练上机操作过程和程序调试 都有着重要的作用。 《C语言程序设计》等课程,是《汇编语言》 的先修课程。而《计算机组装与维护》、《单片机 原理与应用》、《笔记本电脑维修》等课程是它的 后续课程。 表1 课程定位 课程性质2个专业专业必修 课程功能本课程在计算机专业教学中为以后专业课的基础课程前导课程C语言程序设计 平行课程X 后续课程计算机组装与维护、单片机原理与应用、笔记本电脑 维修 1.2 设计思路 全面贯彻党的教育方针,遵循高等职业教育规

律,突出高等职业教育特色。准确把握本门课程在人才培养方案中的作用和地位,教学内容、方法、手段的选择必须以培养社会需求的计算机应用人才的目标和要求为依据。 在“项目引导,任务驱动”的人才培养模式的理念和方法指导下,选择适合项目,以认识项目开始,学习必须够用的理论知识,在教师引导下,完成项目设计。以实际项目开发流程中的典型工作任务设计学习情境,建立真实工作任务与专业知识、专业技能的联系,增加学生的直观体验,激发学生的学习兴趣。 要坚持学生为主体,教师为主导的教学理念。发挥学生主体作用,让学生主动探索,通过自己的努力来解决问题。教师是教学过程的组织者、指导者、促进者和咨询者。突出学生学习的主体地位,充分发挥学生的积极性和学习潜能,形成适合自己的个性化学习方法,提高学习效率和学习水平。2.课程描述 表2 课程描述 课 程 名 称 汇编语言学期安排建议学时72 学 习 任 务 本课程学习3个教学情景, 9个子教学情景。 课程总目 本课程的总体目标是:知道《汇编语言程序设计》这门学科的性质、地位和独立价值。知道这门学科的研究范围、分析框架、研究方法、学科进展和未来方向。理解这门学科的主要概念、基本原理和基本方法。了解16位/32位和奔腾系列微机

《汇编语言程序设计》在线测试

《汇编语言程序设计》第01章在线测试 《汇编语言程序设计》第01章在线测试剩余时间:59:54 答题须知:1、本卷满分20分。 2、答完题后,请一定要单击下面的“交卷”按钮交卷,否则无法记录本试卷的成绩。 3、在交卷之前,不要刷新本网页,否则你的答题结果将会被清空。 第一题、单项选择题(每题1分,5道题共5分) 1、一个字节的二进制位数是____位。 A、4 B、8 C、16 D、32 2、微机中每个存储单元具有一个地址,其中存放一个____量。 A、比特(1位) B、字节(8位) C、字(16位) D、双字(32位) 3、设段地址为5788H,偏移地址为94H,该字节的物理地址_____。 A、57974H B、5883H C、58ECH D、57914H 4、汇编语言源程序中,每个语句由4项组成,不影响语句功能的是_____。 A、名字项 B、助记符(操作码) C、操作数 D、注释 5、执行INT 21H指令后,8086CPU将转入_____号中断服务程序。 A、20 B、20H C、21 D、21H 第二题、多项选择题(每题2分,5道题共10分) 1、如下________名称属于8086的16位通用寄存器。 A、IP B、DS C、BP D、DX E、AX 2、采用汇编语言进行程序开发,可以使用的工具软件有______。 A、文本编辑程序 B、汇编程序 C、调试程序 D、集成化开发环境 E、连接程序 3、使用MASM 6.x版本的“ML /Fl eg101.asm”命令,如果源程序eg101.asm没有语法错误,则将生成_________文件。 A、目标代码文件

汇编语言入门教程

汇编语言入门教程 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设定了四个段寄存器,专门用来保存段地址:CS(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),有九个有意义的标志,将在下文用到时详细说明。

汇编语言学习心得

汇编学习心得 08网工(一)班李锐 0804031002 在大三接触汇编语言之前,我们在计算机组成原理课程中就已经有所了解了,但也只是略微明白一些如jmp,mov这样的指令,极度缺乏系统性的学习。 在接触这门课程后,感到汇编语言并不是很容易就可以弄懂的。相比较以前学过的高级语言如C、C++等,电脑等于在迁就人的思维方式,但学汇编,人却必须要去迁就电脑的思维方式,要设身处地地用电脑的角度去思考问题,这就是我们学习汇编语言时遇到的最大的障碍。 另外,在C语言中不到10个语句构成的程序,用汇编语言却要好几十行甚至上百行。这不得不让我们对汇编产生一种恐惧感。事实上,这是完全不必要的。一旦对它的原理掌握后,编写程序就容易多了。另外,学习汇编语言能让我们更加了解计算机内部的组织结构,对我们计算机专业的学生来说,学习汇编也是提升综合能力的关键环节。 汇编的学习不仅仅是学习其语法,而更多的是学习计算机基本的体系结构。其中遇到很多新的概念,名字。如寄存器、中断、寻址方式等。这些概念在刚接触汇编这门课的时候难以理解,但在之后的学习中通过老师的讲解,自己亲手编程的方式也就渐渐清晰明了。 我们在学习之前都需要明确什么是汇编语言。计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。 经过一个学期的学习,我也慢慢摸出了汇编学习的规律。 首先,学习这门语言时如果能联系上以前学过的其他高级语言的知识,则会起到良好的效果。例如C语言程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF...THEN...ELSE...),循环结构(FOR...NEXT)三种结构,也通过C 语言了解并掌握了什么是子程序,什么是调用。事实上,汇编语言中有关程序结构,子程序等等的知识都是跟C语言十分相似的,只是在编程时用到的语言不同:汇编语言完全面向机器,需要指明数据在寄存器、内存中的流向。 第二,学习汇编语言,首要问题是学习80X86指令系统。如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。如果不熟悉汇编指令的功能及其有关规定,那肯定不能灵活使用汇编语言。 指令的种类十分繁杂,但其格式却是统一的。 其中方括号中的内容为可选项。指令助记符决定了指令的功能,对应一条二进制编码的机器指令。指令的操作数个数由该指令确定,可以没有操作数,也可以有

汇编语言课程教学大纲

《汇编语言》课程教学大纲 一、课程的性质和任务 《汇编语言》是计算机及相关专业的一门专业必修课。 本课程教学应达到的基本要求是: 1、加深对于微机结构及其内部运行过程的理解。 2、掌握Intel80x86汇编语言的语法、程序结构,能读懂和编写汇编语言程序。 3、了解BIOS、MS—DOS的功能调用方法,并掌握和运用主要的功能调用。 4、了解PC机主要外设的工作原理及简单编程方法。 5、掌握汇编语言的编程、调试技术,能够以汇编语言为工具,解决一些实际问题。 二、课时分配 本课程教学总时数为72学时,4学分,具体课时分配见课时分配表。 课时分配表 三、 课题一:基础知识 数制及数制间的转换(二进制、八进制、十进制、十六进制数概念及相互转换);二进制数的算术、逻辑运算;计算机中数和字符的表示(数值数据:原码、补码、反码的表示,字符数据的表示,数据类型等)。 重点:进位计数制及转换,ASCII码表示,数值数据表示等。 课题二:IBM PC 计算机组织 微型计算机系统基本结构(硬件、软件);中央处理器(组成、寄存器组);存储器等。

重点:8086CPU内容结构、寄存器组,存储器的地址和内容,内存地址的分段。 难点:逻辑地址和物理地址。 课题三:寻址方式与指令系统 寻址方式、指令格式、8086/8088指令系统(数据传送、算术运算、逻辑运算和移位运算、控制指令等)。 重点内容:1、掌握8086/8088CPU的寻址方式。 2、掌握8086/8088的常用指令。 了解内容:8086/8088指令系统的特点。 课题四:汇编语言程序格式 程序结构(分段式、简化式);伪操作;汇编语言程序格式;汇编、连接和运行;程序的调试与DEBUG。 课题五:分支与循环程序设计 顺序程序设计;分支程序设计;循环程序设计;串处理。 重点内容:顺序、分支和循环程序基本方法,能编写、运行、调试简单的汇编语言程序。 课题六:子程序与宏指令 子程序的设计方法;子程序嵌套;子程序举例;宏汇编。 课题七:输入与输出程序设计 输入与输出指令;输入输出控制方式;中断控制方式;中断处理程序举例。 课题八:BIOS和DOS中断 BIOS中断调用;DOS中断调用;键盘I/O调用;显示器I/O调用;其它调用(发声和时间中断等调用);显示方式;字符显示缓冲区的组织;图形方式下的编程。 重点内容:掌握DOS和BIOS中断方法。 四:说明 1、教材与参考书:教材选用《汇编语言》人民交通出版社 参考书选用《IBM PC 汇编语言程序设计》清华大学出版社 2、其它要求: (1)、该课程平时作业以课后习题为内容,由任课教师自行选择,次数在五次以上。 (2)、根据实验内容,填写实验报告8次,实验成绩计入课程总评分中。 3、预修课程:《C语言程序设计》、《计算机电路基础》 《汇编语言》课程实验教学大纲 一、实验教学目的

《汇编语言程序设计》期末复习题答案_57431457509182192

《汇编语言程序设计》复习题(答案指导/带页号)一、选择(30题) 1.下列是8位带符号二进制数的补码,其中最大的是( B )。参见P22 A、10001000 B、00000001 C、00000000 D、11111111 2.在一段汇编语言程序中多次调用另一段程序,用宏指令比用子程序实现 ( C )参见P157、158 A、占内存空间小,但速度慢 B、占内存空间相同,速度快 C、占内存空间大,但速度快 D、占内存空间相同,速度慢 3.数据定义为:EE DB 3,4 CC DW 3456H,6789H 执行指令“MOV CX,WORD PTR EE+1”后,(CX)= ( B )参见P27、63、64 A、0304H B、5604H C、3404H D、3456H 4.有如下指令序列: MOV AL,95H MOV CL,2 SAR AL,CL 上述指令序列执行后,AL的内容是( D )参见P95 A、05H B、25H C、24H D、0E5H 5.设A=18610,B=2738,C=0BB16,把这三个数看成无符号数,则它们之间的关系是( D )参见P23、15 A、A>B>C B、 A

汇编学习心得体会

《汇编语言程序设计》学习心得和体会 在接触这门课程初始,就感到汇编语言并不是很容易就可以弄懂的。相比较以前学过的程序语言如C、C++等,电脑等于在迁就人的思维方式,但汇编却是接近机器语言的一门语言,我们学习和编写程序时必须要去迁就电脑的思维方式,要设身处地地用电脑的角度去思考问题,这就是我学习汇编语言时感受最深的地方,想起来很简单,写起来相当的不易。 汇编的学习不仅仅是学习其语法,而更多的是学习计算机基本的体系结构。其中遇到很多新的概念,名字。如寄存器、中断、寻址方式等。这些概念在刚接触汇编这门课的时候难以理解,但在之后的学习中通过老师的讲解,自己亲手编程的方式也就渐渐清晰明了。 我们在学习之前都需要明确什么是汇编语言。计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。 经过一个学期的学习,我也慢慢摸出了汇编学习的规律。 首先,学习这门语言时如果能联系上以前学过的其他高级语言的知识,最重要的是一些思考问题,实现功能的逻辑的思考,会帮助我们很快的找到编写程序的思路和方向。例如C语言程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF...THEN...ELSE...),循环结构(FOR...NEXT)三种结构,也通过C 语言了解并掌握了什么是子程序,什么是调用。事实上,汇编语言中有关程序结构,子程序等等的知识都是跟C语言十分相似的,只是在编程时用到的语言不同:汇编语言完全面向机器,需要指明数据在寄存器、内存中的流向。 第二,学习汇编语言,首要问题是学习80X86指令系统。如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。如果不熟悉汇编指令的功能及其有关规定,那肯定不能灵活使用汇编语言。 指令的种类十分繁杂,但其格式却是统一的。 其中方括号中的内容为可选项。指令助记符决定了指令的功能,对应一条二进制编码的机器指令。指令的操作数个数由该指令确定,可以没有操作数,也可以有一个或多个操作数,大多数指令要显示写出来,还有些操作数是隐含的。当指令包含操作数的时候,书写时必须遵守:1、指令助记符和操作数之间有分隔符,比如几个空格;2、如果含有多个操作数,操作数之间用逗号分隔。 现在简单总结汇编语言指令的分类:1、数据传送指令;2、标志位操作指令; 3 、算术运算指令;4、逻辑运算指令;5、移位运算指令;6、位操作指令;7、

汇编语言程序设计第一二三阶段在线作业

第一次在线作业)单选题 (共40道题 2.51.(分)8086CPU在基址变址的寻址方式中,变址寄存器可以为:?CX或、BX A?SI B、CX或?SI C、DX或?DI D、SI或我的答案:D 此题得分:2.5分的源操作数的位置是:,,则指令SI=1234H MOV AX,[BX+SI+2]2.52.(分)已知BX=2000H?的字节、数据段中偏移量为3236H A?的字节、附加段中偏移量为3234H B?的字节、数据段中偏移量为3234H C?的字节D、附加段中偏移量为3236H我的答案:分A 此题得分:2.5IP(2.5分)在程序执行过程中,寄存器中始终保存的是: 3.?、上一条指令的首地址A?、下一条指令的首地址B ?、正在执行指令的首地址C ?、需计算有效地址后才能确定地址D我的答案:2.5分B 此题得分:,那32K16分)位二进制)是某系列微机对存储器的分段,如果每一个段最多的字存储单元(2.54.(么表示段内字节单元偏移地址的二进制位数应是:?位20 A、?位16 B、?位C、15 ?位12 D、我的答案:B 此题得分:2.5分(2.5分)可用作寄存器间接寻址或基址、变址寻址的地址寄存器,正确的是:5.?DXCX,AX A、,BX,?SS,CSB、DS,ES, ?BXBP,IP,,C、SP?BXBP,,D、SIDI,我的答案:分D 此题得分: 2.5 . . . . 顺序存放在连续两个字存储单元中,可选用Ⅱ码两个字符的ASC41H,42H分)6.(2.5 要求将A,B的语句是:?‘AB'B A、DA1 D ?‘AB'DW B、DA1 ?ABHB C、DA1 ?ABHW D、DA1 我的答案:2.5分A 此题得分:下面语句中有语法错误的语句是:7.(2.5分)?5HDB A、?ABCDHB、DW ?‘ABCD'C、DW ?‘AB'、DDD 我的答案:分2.5C 此题得分:(2.5分)寄存器间接寻址方式中,操作数存放在:8.?、通用寄存器A?、堆栈B?、程序计数器C?、主存单元D 我的答案: D 此题得分:2.5分 2.5(分)操作数地址存放在寄存器的寻址方式称为:9.?、变址寻址A ?、寄存器寻址B?、相对寻址C?、寄存器间接寻址D我的答案:此题得分:2.5分D 操作数的物理地址是:BYTE PTR[DI](10.2.5分)设DI=3942HDS=8225H,,指令NEG ?85B92H、A?86192H、B?BB690H C、?12169H、D我的答案:2.5分A 此题得分:下列寄存器组中在段内寻址时可以提供偏移地址的寄存器组是:分)(2.5 11.?DX,BXCX,,、 AAX . . . . ?DI,SI,、BBX,BP?DXBP,,C、SP,IP ?SSES,、DCS,DS, 我的答案:2.5分B 此题得分:分配的存,10H),3BUF5) 上述语句汇编后,为变量12.10H (2.5分)BUF DW DUP(3 ,DUP(2储单元字节数是:?80HA、 ?100HB、 ?124C 、?192、D我的答案:此题得分:2.5B 分13.发出的访问存储器的地址是:(2.5分)CPU?、物理地址A?、偏移地址B?、逻辑地址C?、段地址D我的答案:分A 此题得分:2.5]指令中的操作数的数据类型是:BYTE DEC PTR[BX14.(2.5分) ?、字A?、双字B?、字节C?、四字D我的答案:C 分此题得分:2.5BUFFER称为:,0AH 中,15.(2.5分)在语句BUFFER DB 01H?、符号A?、变量B?、助记符C?、标号D我的答案:B 此题得分:2.5分将数据5618H存放在存储单元中的伪指令是:16.(2.5分)?1856HDATA1 DW A、

相关主题
文本预览
相关文档 最新文档