本教程将会通过一个一个例子来教会大家如何写汇编程序,今天就从最简单的加法程序开始。(本文只为了让读者能容易理解并自己写出程序,所以语言简化,并不具有专业性和权威性,具体解释请自己参考文献,同时也多包涵文中出现的学术性错误)
首先是本程序要实现的是两个数x,y相加,然后把结果,存到z里。
先给出程序 的源码:
datas segment
x dw 1234h
y dw 5678h
z dw ?
datas ends
codes segment
assume cs:codes,ds:datas
start:
mov ax,datas
mov ds,ax
mov ax,x
add ax,y
mov z,ax
mov ah,4ch
int 21h
codes ends
end start
我们来逐条分析一下这个程序。
datas segment
一开始这一个预算是定义数据段的开始,这个datas
是可以自己随便写的,但是为了方便理解我们就用数据的英语,这个segment
是固定格式不能乱改。
在这条代码后面就开始我们的变量的定义,变量定义的格式是:
[变量名] [db,dw,dd] 表达式1,表达式2.....
变量名就类似于C语言的中int x=10;
中的x,是编程人员自己定义的。第二参数相当于其中的int是定义数据类型的,db是定义字节,dw是定义字,dd是定义双字,这些都是表示这个变量的长度。表达式就是其中的10,就是传入参数,可以是二进制,八进制,十进制,十六进制。如果不确定的可以输入?。比如这个代码中的z dw ?
就相当于C语言中的int z;
最后把所以变量定义完了后,就要用datas ends
来结束定义,注意这个datas必须和你定义数据段开头的段名一致。
然后就是定义代码段了,首先codes segment
和上面一样,codes是可以自己定义的,但后面ends前面的一定要一样,然后assume cs:codes,ds:datas
就是把代码段和数据段放进段寄存器中,这段代码的具体意思就是,把codes段放进CS这个寄存器里,吧datas段放进ds寄存器里,assume是固定格式,不能改变和删除。
这条代码写完后,就是开始我们正式的指令的书写,先写start:
这就表示代码的开始。
mov ds,ax
这个也是固定格式,是为了把数据取出来,其中datas就是数据段的段名。接下来的代码主要用的是mov指令,就是把后面的数据传输到前面的指令。在写完代码后要写
mov ah,4ch
int 21h
来结束程序,也是固定格式,不能改变。
结束程序后,用codes ends来结束代码段,最后在末尾填上end start一个完整的程序就写完了。写完后就可以编译和链接来生成exe文件,具体的方法可以参考这篇文章。
最后祝大家身体健康。