回 帖 发 新 帖 刷新版面

主题:关于在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个回复)

11 楼

不光是用数组,象moz一样用字符串也可以
用数组有时会出现远程调用或近程调用

如果用DATA先定义就更方便。
我的方法有点复杂,但是一劳永逸。
1、在DEBUG中写好汇编代码,保存为COM文件(参阅相关DEBUG命令)
2、用QBASIC写一个COM转DATA的小程序。
  功能,打开COM,用字节的方式读入,然后写入一个BAS文件

写完了就是下面这样的效果
DATA 55,89,E5,C6   等等.....
当然,写入DATA的也可以是10进制
3、在这个BAS上直接写程序,也可以另存为以后再写程序
程序中用READ读出来
如:
FOR I=0 TO  。。。
  READ R
----------------------------
  如果是16进制的DATA格式
  asmprog(I)=VAL("&h"+CHR$(R))
---------------------------------
  如果是10进制的DATA格式
  asmprog(I)=R
---------------------------------
如果是用定长字符串,也可以,这里就不详细叙述了.
---------------------------------
NEXT 

做成DATA还是有好处的,如果有很多的的功能的汇编嵌入就更方便了
例如
'调用时间
GetTime:
data xx xx xx xx.......
'调用日期
GetDate:
data xx xx xx xx......
在用的时候只要把DATA定位到相应的标号即可

建议你把QB调用中断也详细的研究一下,在qb中内嵌汇编只有迫不得已的时候采用
我自己在写获得物理硬盘的序列号用到过,原因是qb中的INP与OUT语句只支持字节,但是序列号返回的是字.
在大多数的情况下都可以用中断调用来解决底层问题.



12 楼

谢谢QB45
同时我也想问一下,如果象MOZ那样操作的话在机器码中就不用加返回指令了吗??(RET)

我来回复

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