背景:ユニテックHT630のデータ収集プログラムの作成を任されました。このプログラムは、16ビットMS DOS用にコンパイルされた実行可能ファイルを実行できる独自のDOSオペレーティングシステムを実行しますが、いくつかの制限があります。私はDigitalMarsC / 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);
}
インラインアセンブリを使用するように常に教えられた方法:
/* 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
}
}
どちらの形式も機能しているようですが、現時点ではどちらのアプローチでも問題は発生していません。DOSプログラミングでは、一方の形式がもう一方の形式よりも優れていると見なされますか?このint86
関数は、2番目の例の独自のアセンブリコードで自分自身を処理していないものを処理しますか?
よろしくお願いします。