Hea*_*r M 7 c assembly dos inline-assembly
背景:我的任务是为Unitech HT630编写一个数据收集程序,它运行一个专有的DOS操作系统,可以运行为16位MS DOS编译的可执行文件,尽管有一些限制.我正在使用Digital Mars C/C++编译器,它似乎运行得很好.
对于某些我可以使用标准C库的东西,但是在单元的屏幕上绘制等其他东西需要汇编代码.设备文档中给出的汇编示例与我在C/C++中使用内联汇编代码的方式不同.作为参考,BYTE在以下示例中是类型unsigned char.
给出了示例代码的示例:
#include <dos.h>
/* Set the state of a pixel */
void LCD_setpixel(BYTE x, BYTE y, BYTE status) {
if(status > 1 || x > 63 || y > 127) {
/* out of range, return */
return;
}
/* good data, set the pixel */
union REGS regs;
regs.h.ah = 0x41;
regs.h.al = status;
regs.h.dh = x;
regs.h.dl = y;
int86(0x10, ®s, ®s);
}
Run Code Online (Sandbox Code Playgroud)
我如何被教导使用内联汇编:
/* Set the state of a pixel */
void LCD_setpixel(BYTE x, BYTE y, BYTE status) {
if(status > 1 || x > 63 || y > 127) {
/* out of range, return */
return;
}
/* good data, set the pixel */
asm {
mov AH, 41H
mov AL, status
mov DH, x
mov DL, y
int 10H
}
}
Run Code Online (Sandbox Code Playgroud)
这两种形式似乎都有效,到目前为止我还没有遇到过这两种方法的问题.对于DOS编程,一种形式被认为比另一种更好吗?int86在第二个例子中,函数是否为我处理我自己的汇编代码中没有处理的东西?
预先感谢您的任何帮助.
当您使用int86函数调用时,这是一个C运行时库调用,它设置寄存器并发出DOS错误int函数.两种方法都是相同的,只有一个例外,当您使用内联汇编程序时,代码实际上是在编译和链接时嵌入到目标代码中.
内联汇编会被认为更快,因为您没有调用C运行时库为您调用DOS中断所涉及的开销.在使用内联汇编时,有责任确保有足够的堆栈空间,而C Runtime库在调用int86函数之前设置寄存器时负责分配堆栈空间.
这int86是一种更容易调用DOS中断的方法.这在旧的Borland Turbo C编译器套件和微软中非常受欢迎,我在谈论Win 3.1出现之前的旧编译器.
说到负责视频输出的中断0x10,如果我没记错的话,当时有些BIOS破坏了bp寄存器,解决方法就是这样做:
__asm{
push bp;
}
/* set up the registers */
int86(0x10, ®s, ®s);
__asm{
pop bp;
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到Ralph Brown中断列表中的大量BIOS功能.此外HelpPC V2.1可能也有帮助,找到这里.
| 归档时间: |
|
| 查看次数: |
1629 次 |
| 最近记录: |