Algunas dudas sobre ensambladores.

Iniciado por Usuario887, 16 Mayo 2020, 21:39 PM

0 Miembros y 1 Visitante están viendo este tema.

Usuario887

Hola,

tengo algunas inseguridades acerca de los ensambladores y me preguntaba si alguien conoce las respuestas.

¿para que sirve precisamente la instruccion ORG?
Se que delimita el origen del programa en la generacion de archivos COM pero, ¿a que se refiere esto precisamente? ¿No es el registro CS dependiente unicamente del cargador del sistema?

Lo mismo respecto a la instruccion LEA...
Se supone que esta instruccion carga la direccion efectiva (Load Effective Address), pero ¿como?, es decir:

si
Código (asm) [Seleccionar]

mov dx, offset _data


es lo mismo que
Código (asm) [Seleccionar]

lea dx, _data


¿como el procesador, en tiempo de ejecucion, sabe que es _data?. Me explico: ¿como puede cargarse la direccion efectiva de una direccion de memoria? es redundante... ¿por que no simplemente la primera instruccion? ¿o es LEA una instruccion del compilador que luego sustituye por MOV ..., OFFSET ..., en vez de ser parte del repertorio de instrucciones del procesador?

Saludos y gracias de antemano.

Eternal Idol

Cita de: marax en 16 Mayo 2020, 21:39 PM
¿para que sirve precisamente la instruccion ORG?
Se que delimita el origen del programa en la generacion de archivos COM pero, ¿a que se refiere esto precisamente? ¿No es el registro CS dependiente unicamente del cargador del sistema?

En el manual de TASM que te deje antes hay una explicacion. Un uso habitual - al menos para aprender - era este:
https://stackoverflow.com/questions/5611047/why-do-we-give-org-7c00-at-the-start-of-a-boot-program

Cita de: marax en 16 Mayo 2020, 21:39 PMLo mismo respecto a la instruccion LEA...

LEA es un opcode y MOV es otro:
https://c9x.me/x86/html/file_module_x86_id_153.html
https://c9x.me/x86/html/file_module_x86_id_176.html

LEA se puede usar de mas maneras que tu ejemplo (alguna esta en el link de abajo de donde viene la siguiente cita), para el mismo:
"Another form of the MOV instruction is MOV reg,immdata which means read the immediate data (i.e. constant) immdata into register reg. Note that if the addr in LEA reg,addr is just a constant (i.e. a fixed offset) then that LEA instruction is essentially exactly the same as an equivalent MOV reg,immdata instruction that loads the same constant as immediate data."

https://stackoverflow.com/questions/1699748/what-is-the-difference-between-mov-and-lea
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

Cita de: Eternal Idol en 16 Mayo 2020, 22:53 PM
En el manual de TASM que te deje antes hay una explicacion. Un uso habitual - al menos para aprender - era este:
https://stackoverflow.com/questions/5611047/why-do-we-give-org-7c00-at-the-start-of-a-boot-program
¿a que te refieres con "al menos para aprender"?
Ya entiendo por que no se codifica... es una pseudo-instruccion. Aunque me haces dudar de si la entiendo plenamente con eso.
Ya habia entrado a ese link en busqueda de la misma respuesta, pero las ultimas dos respuestas no estaban, fueron las mas claras.
Respecto al manual de TASM, aun no llego a esa parte.

Gracias por responder.
Saludos.

Eternal Idol

Cita de: marax en 18 Mayo 2020, 12:58 PM
¿a que te refieres con "al menos para aprender"?

Me referia los comentarios de Michael Petch como: There is a difference between writing a bootloader from an academic perspective and targeting a particular VM/emulator/physical hardware but the shortcuts academics seem to take and teach doesn't necessarily make for the most portable mechanism. Anyone who is looking to write a real bootloader will know not to make any assumptions because they understand the ramifications. I should note that in PCDOS 2.1 not only did they explicitly set all the registers that included CS and they would do equivalent FAR JMP to a local label 0x0000:0x7C00+offset to set CS to 0.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

Cita de: Eternal Idol en 18 Mayo 2020, 16:31 PM
Anyone who is looking to write a real bootloader will know not to make any assumptions because they understand the ramifications.

Precisamente esta es la razon por la cual hice este tema. Aunque no estaba programando un bootloader.

Hay algo que no me queda muy claro... se supone que ORG se utiliza para especificar el desplazamiento dentro del desplazamiento en el acceso a la memoria (datos). Sin embargo, ¿solo datos? ¿o añade este valor a otros tipos de referencias tambien?

Y otra cosa... ¿recuerdas el archivo hookTSR.asm en el libro de Bill Blunden?
Al inicio:

CitarSEGMENT CSEG WORD 'code'
ASSUME CS:CSEG, SS:CSEG, DS:CSEG
ORG 100h
...

¿que es lo que sucede cuando se ensambla la linea de codigo:

CitarPUSHF
CALL CS:_oldISR
...
?

Si Windows carga los archivos COM identicamente como se encuentran en el archivo, ¿no se estaria especificando 100h unidades "extra" al direccionamiento, al especificar ORG 100h?

Eternal Idol

Cita de: marax en 18 Mayo 2020, 18:51 PMHay algo que no me queda muy claro... se supone que ORG se utiliza para especificar el desplazamiento dentro del desplazamiento en el acceso a la memoria (datos). Sin embargo, ¿solo datos? ¿o añade este valor a otros tipos de referencias tambien?
...
¿que es lo que sucede cuando se ensambla la linea de codigo:
?


Codigo tambien; _oldISR seria 0409h de otra manera (aunque no podrias enlazarlo con tlink como .COM sin el ORG 0100h). Usa TD hookTSR.com y podras ver:


Cita de: marax en 18 Mayo 2020, 18:51 PMSi Windows carga los archivos COM identicamente como se encuentran en el archivo, ¿no se estaria especificando 100h unidades "extra" al direccionamiento, al especificar ORG 100h?

No. Un .COM es un archivo sin siquiera una misera cabecera asi que se carga tal cual es, MS-DOS pone antes el PSP: "Since it lacks relocation information, it is loaded by the operating system at a pre-set address, at offset 0100h immediately following the PSP, where it is executed (hence the limitation of the executable's size): the entry point is fixed at 0100h." https://en.wikipedia.org/wiki/COM_file

En realidad Windows emula los ejecutables de 16 bits  ;D https://en.wikipedia.org/wiki/Virtual_DOS_machine#Windows_NTVDM
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

Cita de: Eternal Idol en 18 Mayo 2020, 20:02 PM
Codigo tambien; _oldISR seria 0409h de otra manera
Sin embargo en este caso codigo tambien porque esta siendo referenciado por un label, ¿no?

Cita de: Eternal Idol en 18 Mayo 2020, 20:02 PM
No. Un .COM es un archivo sin siquiera una misera cabecera asi que se carga tal cual es, MS-DOS pone antes el PSP: "Since it lacks relocation information, it is loaded by the operating system at a pre-set address, at offset 0100h immediately following the PSP, where it is executed (hence the limitation of the executable's size): the entry point is fixed at 0100h." https://en.wikipedia.org/wiki/COM_file
Esta bien... pense que lo primero que se cargaba era el MCB del programa...
¿entonces el PSP mide 100 unidades hexadecimales?

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

Cita de: Eternal Idol en 18 Mayo 2020, 20:02 PMaunque no podrias enlazarlo con tlink como .COM sin el ORG 0100h
Por cierto... ¿como TLINK reconoce que se declaro ORG 100h si es una pseudo-instruccion?

Eternal Idol

#9
Cita de: marax en 19 Mayo 2020, 18:14 PM
Por cierto... ¿como TLINK reconoce que se declaro ORG 100h si es una pseudo-instruccion?

El .asm se ensambla en .obj y ahi en su formato interno se pasan esa informacion entre el ensamblador y el enlazador.

https://en.wikipedia.org/wiki/Object_file
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón