Antecedentes: me han encargado escribir un programa de recopilación de datos para Unitech HT630, que ejecuta un sistema operativo DOS propietario que puede ejecutar ejecutables compilados para MS DOS de 16 bits, aunque con algunas restricciones. Estoy usando el compilador Mars C/C++ Digital, que parece estar funcionando muy bien.¿Cuál es la diferencia entre estas dos formas de ensamblador en línea en C?
Para algunas cosas puedo usar bibliotecas C estándar, pero otras cosas como dibujar en la pantalla de la unidad requieren código de ensamblaje. Los ejemplos de ensamblaje que figuran en la documentación del dispositivo son diferentes de cómo me enseñaron a usar el código de ensamblaje en línea en C/C++. Como referencia, BYTE
en los ejemplos siguientes es del tipo unsigned char
.
muestra del código de ejemplo que se le dio:
#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);
}
Cómo Siempre me enseñaron a usar ensamblador en línea:
/* 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
}
}
Ambas formas parecen funcionar, no he encontrado un problema con cualquiera de los enfoques hasta el momento. ¿Se considera que una forma es mejor que la otra para la programación de DOS? ¿La función int86
maneja algo para mí que no estoy manejando en mi propio código de ensamblado en el segundo ejemplo?
Gracias de antemano por cualquier ayuda.
El título es engañoso/incorrecto. No hay un asm en línea en la primera versión, solo un contenedor de llamada de función alrededor de la llamada al sistema. (O un compilador podría implementar 'int86()' como intrínseco y en línea el asm correcto). –