Mira, realmente el segment y el offset no lo defines tú, sino que el loader al momento de 'subir' el código a memoria es quien lo define. Mira, existen dos tipod de programa bajo DOS los EXE y los COM (realmente hace mucho tiempo que ya no se programan pues vienen desde los SO de 8 bits). En los COM todos los registros de segmentos (CS,DS,SS y ES) contienen el mismo valor se copian en la memoria arriba del PSP y empiezan siempre en el offset 0100H y su totalidad en código es de 64 kb. En cuanto a los EXE, los cuatro segmentos pueden estar definidos en diferentes direcciones de memoria dependiendo del modelo de memoria que se tenga definido; el loader lee algunos valores del encabezado del EXE para determinar donde cargarlo e inicializar los segmentos. El siguiente ejemplo te muestra el 'esqueleto' de un programa en ensamblador, que despliega una cadena en pantalla: MODEL SMALL ;modelo de memoria CODE ;área de código inicio: mov ax,@Data ;inicializa DS con la mov ds,ax ;dirección de @Data mov dx, offset Mensaje ;dirección del mensaje mov ah,9 ;en DX para desplegarlo int 21h ;a través de la int 21h mov ax,4c00h ;regresa el control a int 21h ;DOS DATA ;segmento de datos Mensaje DB 'Hola $' ;cadena a desplegar STACK ;define el stack END inicio ;fin del programa Este programa lo puedes 'ensamblar' y despues ligar de la siguiente manera: MASM ejemplo.asm link ejemplo.obj Espero que te haya servido. Saludos