Conjunto de instrucciones ASM de 16 bits

¿Qué conjunto de instrucciones se utiliza en los archivos COM? Supuse que era 8086, pero parece que estaba equivocado. En un manual de 8086 que encontré, shl solo puede aceptar 1 o cl para su segundo argumento, mientras que los valores inmediatos distintos de 1 funcionan bien para mí. En caso de que importe, estoy usando NASM.
Gracias por su tiempo.

preguntado el 29 de septiembre de 11 a las 13:09

3 Respuestas

Esta es una de esas preguntas divertidas y, como siempre, las respuestas son engañosas.

un verdadero archivo COM de DOS no tiene encabezados y debe caber dentro de un solo segmento de memoria, porque no tenía información de reubicación, DOS tenía que colocar el archivo donde lo necesitaba, por lo que la única forma verdadera de ser compatible (con x86) era utilizar un ensamblaje compatible con 8086. Editar: Para aclarar lo anterior, esto se debe a que el 8086 no tenía páginas de memoria.

Ciertamente podría compilar en operandos 286/386, ya que una vez que el programa se está ejecutando, no hay tiempo de ejecución ejecutivo en DOS para detenerlo y decir 'no, no puede hacer eso, es una instrucción 386'.

Lo cual, curiosamente, es parte de la razón por la que los archivos COM no funcionan muy a menudo en Windows7 x32 o en absoluto en Windows7 x64.

Debido a la forma en que funcionaba DOS, command.com se descargaba cuando ejecutaba su archivo .com y se volvía a cargar después, por lo que esencialmente su archivo .com podía acceder a toda la memoria del sistema y, en teoría, usar extensores de memoria DOS como DOS / 4GW de Phar lap. y CWSDPMI vienen a la mente.

Larga historia corta; puede usar cualquier tipo de comando que admita el sistema actual, pero solo debe usar comandos compatibles con x16 de 86 bits para estar seguro.

Si lo anterior suena como un PITA, es porque lo fue, lo recuerdo :) También es la razón por la que el formato .EXE se hizo muy popular muy rápidamente.

Respondido el 29 de Septiembre de 11 a las 23:09

¿Por qué el menos uno? Creo que respondí la pregunta con bastante claridad y proporcioné evidencia del comportamiento que ha observado. - Russ Clarke

Un verdadero COM (no entraré en COM que en realidad son EXE, etc.) solo significa que es un simple ejecutable de DOS. Cualquier conjunto de instrucciones compatible está disponible. Solía ​​hacer programación DOS (tanto COM como EXE) en 8088 hasta i486 en el pasado, y cualquier instrucción que sea legal en ese modo, puede usarla. Por ejemplo, a menudo utilicé instrucciones de cadena de 32 bits y empujes inmediatos cuando mi objetivo era DOS de "16 bits" (técnicamente debería llamarse "modo real").

Respondido el 29 de Septiembre de 11 a las 17:09

Hay dos tipos principales de archivos COM. Uno fue diseñado para ejecutarse en MS-DOS, el otro fue diseñado para ejecutarse en el sistema operativo CP / M. Hasta donde yo sé, los archivos COM de DOS deberían basarse en x86. Los archivos CP / M COM podrían ser instrucciones 8085, 8080 o Z80 según Wikipedia. Como se mencionó en otra respuesta, COM es solo un formato ejecutable simple y puede usar cualquier conjunto de instrucciones subyacentes compatibles.

En términos de la instrucción SHL, parece que el hardware x86 moderno (quizás x64) admite el uso de un valor inmediato para esta instrucción. Sin embargo, no pude encontrar una referencia a él cuando solo miraba los documentos 8086, por lo que debe haber sido agregado en algún momento. Aquí hay un par de referencias que detallan esta instrucción:

http://siyobik.info/main/reference/instruction/SAL%2FSAR%2FSHL%2FSHR

http://ref.x86asm.net/coder32.html

Respondido el 29 de Septiembre de 11 a las 18:09

Se agregó con el 186/188 (junto con push immed y enter / leave). - Brian Knoblauch

+1 por mencionar el origen CP / M del formato COM. Se utilizó para facilitar la portabilidad de aplicaciones CP / M a MS-DOS. - estrella azul

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.