汇编笔记---第一个程序
上一课讲了栈,现在开始写第一个程序吧。
assume cs:test
test segment
start:mov ax, 2
add ax,ax
add ax,ax
mov ax,4c00h
int 21h
test ends
end start
assume 是伪指令,用来和代码段建立一个连接,这个指令由编译器执行。cs:test cs是指向代码寄存器段地址,所以 assume cs:test 的意思就是连接test段,用来执行代码
segment 是段的意思,程序都是由一小段一小段代码组成的,因此,test是段名称,segment指示一个代码段。
与segment 配套使用的是 ends 表示一个段的结束。那和assume配对使用的是end.表示一个程序结束。
start:表示这个代码段里从这里开始执行。所以 end start表示执行完成。
通常,我们一个涵数或程序都有返回的,如没有返回,那这个程序也许没有意义或cpu不知在哪里返回,就结束不了的。所以
mov ax,4c00h
int 21h
就是返回代码,具体原因以后再讲,只要记住返回就是这个代码。
程序写完了,需要编译,然后才能执行。汇编程序也需要经过编译--》连接-->生成exe
编译器通常使用微软件的masm 连接器link.exe 具体方法可参考网上,我不说明了。或直接用一个汇编工具来编写代码。
再讲讲用dos 来加载汇编程序,在dos命下运行到debug,然后加载汇编生成的exe程序,加载后,在cpu寄存器cs:ip指向的地方就是程序的开始地址,但有一点要记住,dos系统会在cs:ip的内存地方增加256个字节的psp区域,用来与系统通信,具体不需要了解,这是系统原因,我们只讲汇编,而汇编编写就需要用到系统,而系统又是一个复杂的结构,所以,我们不希望被系统结构问题转移了视线。回到刚才, 那么程序真正运行的地址应该是cs:ip目前的地址+256个内存单元地址才是程序地址,也就需要先换算出psp的物理地址,再+256才到程序的物理地址。