assembly - 如何将 ASM 程序包含到我的 Turbo 基本程序中?
问题描述
我找到了这个 ASM 例程来按下键。获取按键的 ASM 例程现在我想将它包含到 Turbo Basic 例程中,但不知道如何执行此操作。这里有人可以告诉我它是如何完成的吗?谢谢
编辑:我找到了一种方法:$INLINE,但是如何将我的 asm 代码转换为机器语言,以便将其内联到我的基本程序中?
编辑:我没有成功地将这个带有 Asm 代码的 QBASIC 放入 TURBO BASIC 程序中。我会感谢任何帮助如何做到这一点:
DECLARE FUNCTION GetKeyH% ()
CLS
DO
LOCATE 10, 10
PRINT "Key = "; HEX$(GetKeyH%); " "
LOOP UNTIL INKEY$ = CHR$(27)
END
和 ASM 部分:
Dosseg
.model medium, basic
.286
.stack
.code
Even
public getkeyh ; make getkeyh public
getkeyh proc far basic uses bp dx ; save registers
in al,60h
xchg dx,ax
xor ax,ax ; assume no key
test dl,10000000b
jnz short getkeyhD
mov al,dl
getkeyhD: ret
getkeyh endp ; end of procedure
end ; end of assembly code
编辑:非常感谢下面 Michael Petch 先生的回答。此外,我可以看到这个 ASM 例程也是CTL 和 ALT KEYS 按下的解决方案
解决方案
您可以使用DEBUG.COM
输入汇编代码,然后执行十六进制转储以获取机器代码。
它看起来像这样:
D:\>DEBUG
-A 100
0ABD:0100 IN AL,60
0ABD:0102 XCHG DX,AX
0ABD:0103 XOR AX,AX
0ABD:0105 TEST DL,80
0ABD:0108 JNZ 10C
0ABD:010A MOV AL,DL
0ABD:010C RET
0ABD:010D
-R CX
CX 0000 :D
-N KEY.COM
-W
Writing 000D bytes
-Q
D:\>HEXDUMP KEY.COM
00000000 E4 60 92 31 C0 F6 C2 80 75 02 88 D0 C3 .`.1....u....
D:\>
所以现在你可以用$INLINE
.
$INLINE &HE4, &H60, &H92, &H31, &HC0, &HF6, &HC2, &H80, &H75, &H02, &H88, &HD0
正如@Michael Petch 所建议的那样,不要&HC3
在您的元语句中包含最后一个机器代码 ( ) $INLINE
。
注意:虽然HEXDUMP.EXE
是我自己的程序,但您可以轻松地在 Internet 上找到任何可用的十六进制编辑器来查看二进制文件的内容。
推荐阅读
- regex - 正则表达式在注释字符后删除文本
- java - 如何使用 Math.atan2 将对象移动到特定位置
- c# - 在 .net 中绘制线条 - 缺乏清晰度
- javascript - javascript从文本区域中选择随机行
- c++ - 类中的 Void Print() 函数正在输出二维数组的内存地址而不是打印值
- python - TypeError: int object is not iterable when trying to use a list of prime numbers
- scala - 一个选择给了我所有城市的人口。但是我怎样才能在 Zeppelin 上散点图以直观地查看它们是否遵循正态分布?
- arrays - 从包含某些(双)字符的字符串创建字符串数组
- visual-studio-code - Emmet:在 VS Code 中为 css-in-js 使用 CSS 缩写(对象语法)
- python - ModuleNotFoundError:没有名为“bs4”Atom MacOS 的模块