Bối cảnh: Tôi đã được giao nhiệm vụ viết chương trình thu thập dữ liệu cho Unitech HT630, chạy hệ điều hành DOS độc quyền có thể chạy các tệp thi hành được biên dịch cho MS DOS 16 bit, mặc dù có một số hạn chế. Tôi đang sử dụng trình biên dịch C/C++ kỹ thuật số Mars, có vẻ hoạt động rất tốt.Sự khác biệt giữa hai hình thức lắp ráp nội tuyến trong C là gì?
Đối với một số thứ tôi có thể sử dụng thư viện C chuẩn, nhưng những thứ khác như vẽ trên màn hình của thiết bị yêu cầu mã lắp ráp. Các ví dụ lắp ráp được đưa ra trong tài liệu của thiết bị khác với cách tôi được dạy sử dụng mã lắp ráp nội tuyến trong C/C++. Để tham khảo, BYTE
trong các ví dụ bên dưới là loại unsigned char
.
Mẫu mã ví dụ tôi đã được đưa ra:
#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);
}
Làm thế nào tôi luôn được dạy để sử dụng lắp ráp nội tuyến:
/* 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
}
}
Cả hai hình thức có vẻ làm việc, tôi đã không gặp phải một vấn đề với một trong hai cách tiếp cận. Là một hình thức được coi là tốt hơn so với khác cho lập trình DOS? Có phải chức năng int86
xử lý một cái gì đó cho tôi rằng tôi không xử lý bản thân mình trong mã assembly của riêng tôi trong ví dụ thứ hai?
Cảm ơn bạn trước vì đã được trợ giúp.
Tiêu đề gây hiểu nhầm/sai. Không có nội tuyến nào trong phiên bản đầu tiên, chỉ cần một trình bao bọc chức năng gọi xung quanh cuộc gọi hệ thống. (Hoặc một trình biên dịch có thể thực hiện 'int86()' như một nội tại và nội dòng bên phải). –