重阳 ChongyangLee

_____关注可编程技术______

导航

几条伪指令的分析

Posted on 2008-07-29 23:33  ChongyangLee  阅读(244)  评论(0编辑  收藏  举报

      使用.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,为什么