主题:[讨论]关于QB调用汇编的参数传递(拙见,请大家指正)
例如:调用汇编取得系统的日期(月、日)
CALL ABSOLUTE (X,Y,ASMPROGRAM())
我想应该是把X,Y这两个在QB中定义过的变量的地址先压入堆栈,而BP这个寄存器因为在执行完汇编代码之后要用它来寻址而传递参数,所以在汇编代码的最开头我们要自己把BP入栈,并且在转到汇编子程序时系统自动把QB主程序的CS:IP入栈,这样的话当汇编子程序刚执行完PUSH BP后堆栈的内容应该是:
……(堆栈内先前的内容,省略),X,Y(我们定义的变量,保存汇编子程序传递的数值用),CS,IP,BP。
而汇编语言返回的值一般都在寄存器中,这样就要求我们在汇编子程序中把寄存器中的值存到X,Y变量的地址中,这样才能返回月,日(我所举的例子中)怎么返回呢?
还是在这个例子中说,当汇编子程序执行完中断之后,月保存在DH寄存器中,日保存在DL寄存器中。
在把X,Y压入堆栈后又压入CS,IP,BP分别占两个字节一共六个字节,所以当我们编写的汇编代码的先头和最后应该这样写:
PUSH BP(BP入栈,保存BP,刚才提到过)
MOV BP,SP(把栈顶地址传到BP寄存器中,SP指向栈顶是固定的,不能用来寻址)
…………(省略号代表中间自己写的汇编代码,省略号以上是汇编子程序的开头部分,以下是汇编子程序的结束部分)
MOV BX,[BP+6](本句的意思是把Y变量的地址传送到基址寄存器BX中,刚才提到过MOV BP,SP后BP指向的就是栈顶,[BP+6]里面存放的就是我们定义的Y变量的地址,注意一点堆栈是由高地址向低地址发展的,所以先入栈的要比后入栈的地址高,而Y入栈之后又有CS,IP,BP入栈一共六个字节,所以Y的地址就是栈顶地址加6)
MOV [BX],DH(因为BX存放的是Y的地址,所以[BX]即是Y,此句意思是把DH(月)放入Y中
MOV BX,[BP+8](此句和MOV BX,[BP+6]一样,因为X比Y更早入栈所以要加8,我试过加7,但是结果不正确,我想是因为QB中X,Y定义的时候分别占两个字节吧)
MOV [BX],DL(把日期放到X变量的地址中,即:X=日期)
POP BP(刚才把BP入栈了,现在把它出栈,要不会出错的)
RET 2(返回QB主程序时把CS,IP出栈)
最后在QB中PRINT X,Y就输出日期和月份了
同理,想返回更多的参数可以以此类推
昨天研究时的一点想法,有错误的话请高手们定告诉我!谢谢大家。
CALL ABSOLUTE (X,Y,ASMPROGRAM())
我想应该是把X,Y这两个在QB中定义过的变量的地址先压入堆栈,而BP这个寄存器因为在执行完汇编代码之后要用它来寻址而传递参数,所以在汇编代码的最开头我们要自己把BP入栈,并且在转到汇编子程序时系统自动把QB主程序的CS:IP入栈,这样的话当汇编子程序刚执行完PUSH BP后堆栈的内容应该是:
……(堆栈内先前的内容,省略),X,Y(我们定义的变量,保存汇编子程序传递的数值用),CS,IP,BP。
而汇编语言返回的值一般都在寄存器中,这样就要求我们在汇编子程序中把寄存器中的值存到X,Y变量的地址中,这样才能返回月,日(我所举的例子中)怎么返回呢?
还是在这个例子中说,当汇编子程序执行完中断之后,月保存在DH寄存器中,日保存在DL寄存器中。
在把X,Y压入堆栈后又压入CS,IP,BP分别占两个字节一共六个字节,所以当我们编写的汇编代码的先头和最后应该这样写:
PUSH BP(BP入栈,保存BP,刚才提到过)
MOV BP,SP(把栈顶地址传到BP寄存器中,SP指向栈顶是固定的,不能用来寻址)
…………(省略号代表中间自己写的汇编代码,省略号以上是汇编子程序的开头部分,以下是汇编子程序的结束部分)
MOV BX,[BP+6](本句的意思是把Y变量的地址传送到基址寄存器BX中,刚才提到过MOV BP,SP后BP指向的就是栈顶,[BP+6]里面存放的就是我们定义的Y变量的地址,注意一点堆栈是由高地址向低地址发展的,所以先入栈的要比后入栈的地址高,而Y入栈之后又有CS,IP,BP入栈一共六个字节,所以Y的地址就是栈顶地址加6)
MOV [BX],DH(因为BX存放的是Y的地址,所以[BX]即是Y,此句意思是把DH(月)放入Y中
MOV BX,[BP+8](此句和MOV BX,[BP+6]一样,因为X比Y更早入栈所以要加8,我试过加7,但是结果不正确,我想是因为QB中X,Y定义的时候分别占两个字节吧)
MOV [BX],DL(把日期放到X变量的地址中,即:X=日期)
POP BP(刚才把BP入栈了,现在把它出栈,要不会出错的)
RET 2(返回QB主程序时把CS,IP出栈)
最后在QB中PRINT X,Y就输出日期和月份了
同理,想返回更多的参数可以以此类推
昨天研究时的一点想法,有错误的话请高手们定告诉我!谢谢大家。