Declaracion de segmentos en TASM

Iniciado por Usuario887, 2 Mayo 2020, 17:53 PM

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

Usuario887

Hola.

Me preguntaba si alguien conoce la sintaxis de la directiva SEGMENT en TASM.
Por ejemplo, en el siguiente codigo:


segment cseg para word 'code'


Entiendo que cseg precisa el nombre del segmento que se esta declarando pero, ¿que significa para, word y 'code'?

Segun el sentido logico se que puedo deducir que para se refiere a que hablamos de parrafo (es decir, 16 bytes), que word quiere decir que sera accedido como 16 bits y que 'code' algo que tenga que ver con codigo... pero son deducciones a priori y me gustaria saber que significan realmente ya que podria estar equivocado.

Nota: respecto a word... ¿no seria innecesario, tomando en cuenta que un segmento ya es de 16 bits?

Gracias de antemano y saludos.

Eternal Idol

Esto es practicamente arqueologia:
WORD Start segment on the next word-aligned address.
PARA Start segment on the next paragraph (16-byte aligned) address.

'code' me imagino que es el nombre del segmento, cuyo tipo sera cseg que asumo es un alias de codeseg o semejante. No se que sentido tiene usar para y word al mismo tiempo.

http://bitsavers.informatik.uni-stuttgart.de/pdf/borland/turbo_assembler/Turbo_Assembler_Version_5_Users_Guide.pdf
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  2 Mayo 2020, 18:53 PM
WORD Start segment on the next word-aligned address.
PARA Start segment on the next paragraph (16-byte aligned) address.

Esta bien... espero no sea tonta la preguta, pero ¿que sentido tiene especificar un segmento que comienza en el siguiente word alineado, si sin embargo el rango de direccionamiento de un segmento es de 16 bytes?
Es decir, hago la pregunta suponiendo que se refiere a que si el segmento comenzara en la direccion real 0000, especificando word comenzaria en 0002.

Gracias por responder.

Eternal Idol

#3
Cita de: marax en  2 Mayo 2020, 21:29 PM
Esta bien... espero no sea tonta la preguta, pero ¿que sentido tiene especificar un segmento que comienza en el siguiente word alineado, si sin embargo el rango de direccionamiento de un segmento es de 16 bytes?
Es decir, hago la pregunta suponiendo que se refiere a que si el segmento comenzara en la direccion real 0000, especificando word comenzaria en 0002.

Gracias por responder.

No se que tiene que ver una cosa con la otra sinceramente.

Del mismo manual:

Segment alignment attribute
"The segment alignment attribute tells the linker to ensure that a segment begins on a
specified boundary. This is important because data can be loaded faster on the 80x86
processors if it's properly aligned. The following table lists legal values for this attribute."

Si la direccion que correspondiese a ese segmento fuera (0x0) ningun alineamiento la moveria ya que es divisible por cualquier valor, pero supongamos que tenemos un segmento de datos previo de 0x7 bytes, entonces con un alineamiento PARA haria que el segundo segmento arrancase en 0x10 (la siguiente direccion divisible por 16) y no en 0x7.
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  2 Mayo 2020, 22:59 PM
Si la direccion que correspondiese a ese segmento fuera (0x0) ningun alineamiento la moveria ya que es divisible por cualquier valor, pero supongamos que tenemos un segmento de datos previo de 0x7 bytes, entonces con un alineamiento PARA haria que el segundo segmento arrancase en 0x10 (la siguiente direccion divisible por 16) y no en 0x7.
Si, esto lo entiendo. Pero bajo las mismas condiciones, ¿en que cambiaria especificar WORD, en vez de PARA?
Es decir, especificando PARA el segmento comenzaria en el siguiente parrafo alineado, pero ¿y especificando WORD?
Se lo que dice el manual:
Citar
Start segment on the next word-aligned address

Sin embargo no se a lo que se refiere, es decir, no se lo que significa.
Bajo las condiciones que supones, si en vez de PARA se especificase WORD, ¿como cambiaria el resultado?

Eternal Idol

WORD son 2 bytes asi que arrancaria en 0x8 ya que 0x7 no es divisible por 2 y 0x8 si.
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

#6
Suponiendo el siguiente codigo:


.MODEL LARGE
ASSUME CS:CSEG

SEGMENT ref
DB ?
ENDS ref

SEGMENT seg1 WORD
DB ?
ENDS seg1

SEGMENT seg2 WORD
DB ?
ENDS seg2

SEGMENT cseg WORD
entry:
MOV AX, ref
MOV AX, seg1
MOV AX, seg2
ENDS CSEG

END entry


seg1, en ese caso, deberia cagarse en la siguiente direccion divisible por 2. Igualmente seg2.
Sin embargo esto resulta realmente:


(se cargan en la misma direccion)

No entiendo por que.

Gracias por tu tiempo.

Eternal Idol

Lo que esta poniendo ahi en AX es el valor del segmento CS.

Si usas offset para ref, seg1 y seg2 vas a ver sus direcciones (0, 2 y 4).

Código (asm) [Seleccionar]
.MODEL LARGE
ASSUME CS:CSEG

SEGMENT ref
DB 1
DB 2
DB 3
ENDS ref

SEGMENT seg1 WORD
DB ?
db 5
db 7
ENDS seg1

SEGMENT seg2 WORD
DW 666h
ENDS seg2

SEGMENT cseg WORD
entry:
PUSH CS
POP DS
mov BX, offset seg2
mov AL, byte ptr [BX]
MOV BX, offset ref
mov AH, byte ptr [BX]
MOV BX, offset seg1
MOV BX, offset seg2
ENDS CSEG

END entry


Si lo depuras en AX tendras 0166h, que se forma con los primeros bytes de ref y seg2. Arrancan en 0, 4 y 8. Si cambias el WORD de seg1 y seg2 por BYTE entonces arrancan en 0, 3 y 6 respectivamente.
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

#8
Cita de: Eternal Idol en  3 Mayo 2020, 19:18 PM
Si lo depuras en AX tendras 0166h, que se forma con los primeros bytes de ref y seg2. Arrancan en 0, 4 y 8. Si cambias el WORD de seg1 y seg2 por BYTE entonces arrancan en 0, 3 y 6 respectivamente.
Eso quiere decir que ref, seg1 y seg2 se cargan contiguamente respecto a CS, ¿no?. Honestamente pense que los segmentos se cargaban en el orden en el que son especificados en el codigo fuente.

Modifico:
Otra pregunta, si no es molestia... ¿y si el contenido del segmento es mayor al rango de direccionamiento especificado?

Gracias, saludos.

Eternal Idol

Cita de: marax en  4 Mayo 2020, 16:02 PMHonestamente pense que los segmentos se cargaban en el orden en el que son especificados en el codigo fuente.

Tanto en tu ejemplo como en el mio lo hacen, presta atencion al punto de entrada del codigo.

Cita de: marax en  4 Mayo 2020, 16:02 PMOtra pregunta, si no es molestia... ¿y si el contenido del segmento es mayor al rango de direccionamiento especificado?

Nada mejor que probar para averiguar.
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