使用.startup来作为汇编语言的初始伪指令,到底完成了什么呢,仅仅是初始化ds和指定程序执行入口吗?当然不是!这句伪指令还将ss赋予ds的值,也就是说保证ds和ss是同一个段。改变了ss后,那sp怎么办,为了不改变堆栈段,必须有(ss*10H)+sp=(ds*10h)+x,x就是新的sp,显然,新的sp=(ss-ds)*10h+sp,乘以10h就是左移4位。有了这些分析,让我们来看看真实的汇编代码是什么吧。当你写下.startup时,你做了:
start:
mov dx, dseg;dseg 是数据段段地址,我们一般用ax,但汇编程序却在此处用了dx
mov ds, dx;此处初始化了ds
mov bx, ss
sub bx, dx;就是ss - ds了
mov cl, 04h;我们准备移动4位
shl bx, cl;当然我们可以学汇编程序写4个shl bx, 1
cli;我们不希望在此处被其它中断
mov ss, dx;ss等于ds了
add sp, bx;新的sp诞生了
sti;开中断
;你的代码在此处
使用.startup后写end时不需要标号。.exit xx就简单多了:
mov ax, 4cxxh
int 21h
我们写子程序时,如果有参数传递,汇编程序怎么汇编的呢?假如我们写下了下面的代码
proc1 proc NEAR C, para1: WORD, para2: WORD
我们实际上在使用堆栈来传递参数,也就是使用bp来访问具体的参数,如果这个过程是near调用,那么[bp+04h]就是访问para1,为什么是加04h呢?[bp+08]就是访问para2,为什么