汇编教程8:hello world
刚才我已经写了一篇Radasm使用教程,为的就是让大家学起来不会遇到一点困难,不要让大家在玩第一个”hello World“就死机了,打击了兴趣、那就麻烦了!
今天我就要带大家走进汇编的”hello World“了,我个人觉得我写的是比较慢的,讲的有点细,写了7篇了才写到进入”hello World“,其实我本意是把主力放win32上的,所以我会加快进度了。
我可以想象你是绝对不会满足于到debug上小试牛刀的,一定想做更多的事情,也许你会觉得我那么晚都不推出写个”hello World“而愤愤不已,那么到现在我终于要劝你了,你应该平静下来,我们现在就看看”hello World“,其实还不能够算”hello world“只是一个最基本的汇编程序,连显示”hello world“也不行,不过总算是把程序憋出来了。
首先写程序嘛,你得有个编辑器,我个人推荐是IDE编程环境,我已经在Radasm使用教程中说明了怎么样建立”hello World“了,如果你执意要选择其他的编程环境、这也是可以的,比如“记事本”。但是“记事本”是不够方便的,还是选择Radasm吧。。我这里就按照Radasm 环境讲解了。
既然是写汇编程序,那么我们还是来看看别人的程序是怎么写的吧,刚开始学编程应该都是“照葫芦画瓢”吧,在汇编中,一个最简单的程序应该是下面这幅模样:
assume cs:code
code segment
start:
mov ax, 0132H
mov bx, 4522H
add ax, 1
add bx, 4
mov ax, 4c00H
int 21H
code ends
end start
汇编程序中包括指令和伪指令,伪指令是写给编译器看的,并没有直接对应的机器码,指令就相反。我们来慢慢讲解,一行一行来,首先看看红色的代码处,code segment ……code ends,这表示定义一个段code segment表示段的开始,code ends表示段的结束,你可能会问,为什么我们要把代码放在段里面呢?回忆我们前面给大家介绍段的概念,有了段我们才可以把代码,数据,栈,什么的分段来进行存放,所以我们前面学的知识没有白费吧,让我猜猜你现在想什么:一定是在感激我吧,@#¥¥#!
那么知道了段的定义了,我现在再告诉你一个坏消息,一个汇编程序中、你必须要有个段,所以你想省是不行的,前面的code是什么意思呢?这个嘛,没有意思的,你可以把它命名为ok或者什么的,都没有关系,随便你自己喜欢。象高级语言里面的变量命名。
蓝色部分就是指令了,应该不需要解释吧,应该都认识这几条指令的。
那么assume cs:code是什么呢?assume cs:code表示把CS寄存器和code段关联起来,assumen这条指令讲起来比较麻烦,在我们以后用的的时候再讲,只要记得加上那么一条指令就成。
绿色的指令是做什么的呢?简单说和高级语言里面的return是差不多的,表示返回成功,这样程序才可以退出,程序才可以把shell返回给dos系统,系统才可以去做其他的事情。现在只要记得在代码写完的时候加上这么一条就成,告诉下操作系统,“我返回成功了”。
start……end start是什么意思呢?我们知道在高级语言里面都是写程序都不用我们指定,从什么地方开始执行,但是汇编不同,编译器不知道你的代码要从什么地方开始执行,所以这条语句就是告诉编译器,我的程序在什么地方开始执行。这里是start处,也就是执行mov ax, 0132H指令。
那么程序是已经分析完了,我们来试试怎么样自己写呢?首先我们要有个段,我们给它取名为x,那么就是x segment…….x ends,中间就是我们要实现的指令了,你可以随便写几条,比如计算2+2+2、那么就是:
x segment
mov ax, 2
add ax, 2
add ax, 2
x ends
又以为x是代码段,所以我们把x段和CS关联起来,那么就又多了句 assume cs : x,然后我们还要指定指令的开始执行处,所以代码就成了这样了
assume cs : x
x segment
start:
mov ax, 2
add ax, 2
add ax, 2
x ends
end start
还没有完呢!我们的代码执行完后要返回给操作系统,所以要再加两句代码mov ax, 4c00h int 21h.到这里就已经把一个最小的汇编程序实现起来了,我们来看看长什么样子?
assume cs : x
x segment
start:
mov ax, 2
add ax, 2
add ax, 2
mov ax, 4c00H
int 21H
x ends
end start
本来想找个WP插件显示下代码的,可是没有找到ASM语言的插件啊,所以…..
这就是一个最基本的汇编程序了,应该说不能够再少了。编译和运行方法已经在汇编教程7:RadAsm使用教程中说明了,把程序运行起来吧。……怎么什么也没有???
呵呵..这个程序什么也还没有做呢,当然什么也没有做,我们只是修改了几个寄存器的值而已。那么这个到底算不算是程序呢??实际上是算的,不信我们用debug调试下,打开CMD切换到你编译好程序的目录,如果你用的和我一样是Radasm、并且也是cao_cong汉化的版本的话默认目录应该在C:\RadASM\Masm\Projects,然后进入你的建立的项目名称目录中输入命令debug 项目名称.exe 然后debug就装载了你那个exe文件。。
首先输入-R命令看看各寄存器的值,注意看了,这里AX的值是0,然后我们再看看其他的指令:
我们接着看看U命令,命令执行后,我们代码的3条指令确实是在的那么我们用T命令执行
这是我执行了3次T命令后的结果
仔细看AX的值,和我们预料中的是一样的,那么应该可以说我们这个程序是合格的,那么最基本的程序就算写出来了,最后我还要说明的一点就是,当执行到指令int21的时候就不能够用-T了,要改为-P,至于为什么现在我们还不用了解。到时候就明白了。那么玩够了就可以-Q退出debug。
那么这篇也就算写完了,本来我不想上传那么多图片的,大家都学汇编的人了应该这点常识我觉得还是有的,可是想了下、我的表达能力不是很好所以,还是上传点图片吧,反正也不管别人说是傻瓜教程了,这篇结束后,你应该好好在下面练习下我们讲过的’栈’,多练习下debug,没事写几条指令执行下,一定要多写多练。