主题:关于在QB主程序中向汇编子程序传递参数的一点想法
强强
[专家分:4740] 发布于 2007-02-19 14:15:00
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]),之后在汇编子程序中输出相应的字符。
=============================================================================
今天突然想到的一个问题,有不对的地方请大家指正,谢谢。
最后更新于:2007-02-19 14:17:00
回复列表 (共12个回复)
沙发
rickone [专家分:15390] 发布于 2007-02-22 22:00:00
玩QB的越来越厉害了~~
板凳
强强 [专家分:4740] 发布于 2007-02-22 22:56:00
谢谢,不过我还是喜欢听批评的语言,高手请帮我找找错误
3 楼
rickone [专家分:15390] 发布于 2007-02-24 01:10:00
C语言里内嵌汇编挺方便的吧,不过我太本分,学汇编的唯一用处到目前为止还只是看一下反汇编。我会一点点QB,我看不懂LZ写的,只能说你厉害了~!
4 楼
强强 [专家分:4740] 发布于 2007-02-24 12:22:00
对于QB我只是个菜鸟,把这个帖子发上来只是希望大家能帮我找找错误,只有这样才能进步,真诚的希望大家帮我。
5 楼
staa [专家分:3690] 发布于 2007-02-26 15:22:00
我觉得有两个地方有问题:
asmprog(0):QB的下标一般是从1开始的;
CALL absolute(n, p):这个absolute过程没有定义吧?
我乱说的,不知道对不对
6 楼
强强 [专家分:4740] 发布于 2007-02-26 15:32:00
谢谢staa
不过很报歉我觉得你说的不对,下标是可以从0开始的,不信你可以写一个小程序验证一下.
再有CALL ABSOLUTE是QB语句,不用定义的.
7 楼
moz [专家分:37620] 发布于 2007-02-26 23:46:00
staa太老了,年轻人都不认得他,
他也有点想退休的感觉了,(呵呵,说笑,别介意)
该享受点不用动脑的生活了.
QB里的数组默认是从0开始的,也可以用某一个命令OP****(我也老了)设置从1开始的.
ABSOLUTE 是QB4.0以上外加的调用系统中断例程的一个命令,
它并不是QB语言里的正统命令,只是一个外挂子程序.
好像是需要在启动 QBX 的时候加上 /L 参数包含调用.
8 楼
强强 [专家分:4740] 发布于 2007-02-27 21:01:00
rickone太谦虚了,你能看反汇编,我也看过,最多不到五句就找不着北了,呵呵
9 楼
moz [专家分:37620] 发布于 2007-03-02 00:08:00
今天才看了你的程序,有点想法:
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 楼
强强 [专家分:4740] 发布于 2007-03-02 17:56:00
有见解,佩服
谢谢MOZ这么长时间了还看我的这个小程序
发它上来就是想请高手指点的。再次感谢
我来回复