背景:我的任務是編寫Unitech HT630的數據收集程序,該程序運行專有的DOS操作系統,可以運行爲16位MS DOS編譯的可執行文件,儘管存在一些限制。我正在使用Digital Mars C/C++編譯器,它似乎工作得很好。C中這兩種內聯彙編程序的區別是什麼?
對於一些我可以使用標準C庫的東西,但是其他的東西比如繪製在單元的屏幕上需要彙編代碼。設備文檔中給出的程序集示例與在C/C++中使用內聯彙編代碼的教程不同。作爲參考,以下示例中的是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
函數是否在第二個例子中爲我處理了一些我沒有在自己的彙編代碼中處理自己的東西?
非常感謝您的幫助。
標題誤導/錯誤。第一個版本沒有內聯asm,只是系統調用的函數調用包裝器。 (或者一個編譯器可以實現'int86()'作爲一個內聯和內聯的右asm)。 – 2016-11-08 23:32:28