回 帖 发 新 帖 刷新版面

主题:关于在QB主程序中向汇编子程序传递参数的一点想法

CLS
DEFINT A-Z
DIM asmprog(30)
INPUT n
DATA &h55,&h89,&He5,&H8b,&h5e,&H06,&H8a,&h17
DATA &hb4,&h02,&Hcd,&h21,&h5d,&hca,&h02
RESTORE
DEF SEG = VARSEG(asmprog(0))
p = VARPTR(asmprog(0))
FOR i = 0 TO 14
READ j
POKE p + i, j
NEXT i
CALL absolute(n, p)
DEF SEG
END
===========================================================================
以上DATA中的机器码的含意为:
&h55             PUSH BP          BP入栈
&h89,&He5        MOV BP,SP       栈顶值存入BP,将来用BP寻址
&H8b,&h5e,&H06   MOV BX,[BP+6]   把N的地址存入BX中
&H8a,&h17        MOV DL,[BX]     把[BX]的值存入DL
&hb4,&h02        MOV AH,2        AH=2
&Hcd,&h21        INT 21           调用21中断
&h5d             POP BP           BP出栈
&hca,&h02        RET 2            返回主程序
============================================================================
这是个在QB主程序中输入ASCII码,之后在内嵌的汇编子程序中输入对应的字符的小程序,在这个程序中涉及到了如何从QB主程序向汇编子程序传递参数的问题。这个问题比较有实际意义,举一个简单的例子,如果想在自己编的QB程序中实现格式化磁道,就涉及到调用汇编,并且把要格式化的磁道的地址传到寄存器中,从QB主程序向汇编子程序传递和以前说过的从汇编子程序向QB主程序传递参数基本一样,在本程序中N已经赋值,所以在以上的汇编代码中就要有把N的值存到DL中的一部分(MOV BX,[BP+6]、MOV DL,[BX]),之后在汇编子程序中输出相应的字符。
=============================================================================
今天突然想到的一个问题,有不对的地方请大家指正,谢谢。

回复列表 (共12个回复)

沙发

玩QB的越来越厉害了~~

板凳

谢谢,不过我还是喜欢听批评的语言,高手请帮我找找错误

3 楼

C语言里内嵌汇编挺方便的吧,不过我太本分,学汇编的唯一用处到目前为止还只是看一下反汇编。我会一点点QB,我看不懂LZ写的,只能说你厉害了~!

4 楼

对于QB我只是个菜鸟,把这个帖子发上来只是希望大家能帮我找找错误,只有这样才能进步,真诚的希望大家帮我。

5 楼

我觉得有两个地方有问题:

asmprog(0):QB的下标一般是从1开始的;

CALL absolute(n, p):这个absolute过程没有定义吧?

我乱说的,不知道对不对

6 楼

谢谢staa
不过很报歉我觉得你说的不对,下标是可以从0开始的,不信你可以写一个小程序验证一下.
再有CALL ABSOLUTE是QB语句,不用定义的.

7 楼

staa太老了,年轻人都不认得他,

他也有点想退休的感觉了,(呵呵,说笑,别介意)
该享受点不用动脑的生活了.

QB里的数组默认是从0开始的,也可以用某一个命令OP****(我也老了)设置从1开始的.

ABSOLUTE 是QB4.0以上外加的调用系统中断例程的一个命令,
它并不是QB语言里的正统命令,只是一个外挂子程序.
好像是需要在启动 QBX 的时候加上 /L 参数包含调用.

8 楼

rickone太谦虚了,你能看反汇编,我也看过,最多不到五句就找不着北了,呵呵

9 楼

今天才看了你的程序,有点想法:

dim asmprog as string*15
asmprog=chr$(&h55)+chr$(&h89)+chr$(&He5)+chr$(&H8b)+chr$(&h5e)+chr$(&H06)+chr$(&H8a)+chr$(&h17)+chr$(&hb4)+chr$(&h02)+chr$(&Hcd)+chr$(&h21)+chr$(&h5d)+chr$(&hca)+chr$(&h02)
input n%
DEF SEG = VARseg(asmprog)
CALL absolute(n%, VARPTR(asmprog))
DEF SEG

其实事情有的时候不一定只有一种方法,
只要你明白它传递的只是地址和地址里的内容,
你就可以有很多很多的方法
你有了数组的地址,甚至直接对数组赋值都可以了,无需要POKE操作.

10 楼

有见解,佩服
谢谢MOZ这么长时间了还看我的这个小程序
发它上来就是想请高手指点的。再次感谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册