这两种形式的内联汇编程序在C中有什么区别?

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, &regs, &regs);
}
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在第二个例子中,函数是否为我处理我自己的汇编代码中没有处理的东西?

预先感谢您的任何帮助.

t0m*_*13b 9

当您使用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, &regs, &regs);
__asm{
   pop bp;
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到Ralph Brown中断列表中的大量BIOS功能.此外HelpPC V2.1可能也有帮助,找到这里.