Другие языки программирования и технологии

Как из EXE ФАЙЛА СДЕЛАТЬ COM?

Вот код проги подскажите что нужно поменять. Зарание спасибо!! !

TITLE EX_PROG
PAGE, 02h
STAK SEGMENT
DB 64 DUP('STACK')

DSEG SEGMENT
MASS DB 14 DUP(0)
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:STACK
OUR_PROG PROC FAR

PUSH DS
XOR AX,AX
PUSH AX

MOV AX,DSEG
MOV DS,AX

MOV CX,14
LEA BX,MASS

L1:
MOV [BX],02h
INC BX
LOOP L1

MOV CX,14
LEA BX,MASS

XOR AX,AX
MOV CX,14
LEA BX,MASS

LEA BX,MASS
MOV AX,0
ADD AX,[0]
MOV BX,1
ADD AX,[1]
MOV BX,2
ADD AX,[2]
MOV BX,3
mov bx[8],ax

XOR DX,DX
MOV AL,MASS[0]
IMUL MASS[1]
MOV MASS[3],DH
MOV MASS[4],AL

RET;
OUR_PROG ENDP
CSEG ENDS
END OUR_PROG
> Там только заголовочная часть изменится.
Не только. Программу нужно переписать так, чтобы исполняемый код, данные и стек находились в одном сегменте.

Сначала позволю себе разбор того, что имеется:

    TITLE EX_PROG
    PAGE, 02h; Если не знаете, для чего это нужно, лучше удалите
STAK SEGMENT
  DB 64 DUP('STACK')
STAK ends; Нет директивы окончания сегмента стека

DSEG SEGMENT
  MASS DB 14 DUP(0)
DSEG ENDS

CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG,SS:STACK; У вас же сегмент стека называется STAK
OUR_PROG PROC FAR
    PUSH DS
    XOR AX,AX
    PUSH AX

    MOV AX,DSEG
    MOV DS,AX

    MOV CX,14
    LEA BX,MASS

L1:
    MOV [BX],02h
    INC BX
    LOOP L1

    MOV CX,14
    LEA BX,MASS

    XOR AX,AX
    MOV CX,14; Зачем повторять то, что уже было сделано?
    LEA BX,MASS; Для закрепления содержимого регистров? :))
   
comment * Далее идёт изумительный бред, который лучше закомментировать, чтобы не смешить компилятор.
    LEA BX,MASS; Зачем третья загрузка смещения начала массива?
    MOV AX,0
    ADD AX,[0]; Зачем вы полезли в PSP? Компилятор заменит это на непосредственную адресацию add ax,0
    MOV BX,1; Бессмысленное действие
    ADD AX,[1]
    MOV BX,2
    ADD AX,[2]
    MOV BX,3

    mov bx[8],ax; В итоге, если бы это был исполняемый com-файл, то вы записали бы в 12-й и 13-й байты PSP число 3 (0+0+1+2).
    ; А там как раз находится часть адреса подпрограммы завершения работы программы.
    ; Наверное вирус пытались написать :D
*

; В дальнейших действиях тоже мало смысла, если неизвестно, что должна делать программа
    XOR DX,DX
    MOV AL,MASS[0]
    IMUL MASS[1]
    MOV MASS[3],DH; 4-й элемент будет обнулён
    MOV MASS[4],AL; В 5-м элементе массива будет произведение 1-го на 2-й, т. е. 4

    RET;
OUR_PROG ENDP
CSEG ENDS
    END OUR_PROG

А теперь, как примерно должна выглядеть эта программа, чтобы её можно было откомпилировать как *.com приложение:

    TITLE EX_PROG
    PAGE, 50h

CSEG SEGMENT
    org 100h
    ASSUME CS:CSEG,DS:CSEG,SS:CSEG; Всё находится в одном сегменте
OUR_PROG PROC FAR
    lea sp,Stack_ptr; Если вы хотите свой стек

    PUSH DS
    XOR AX,AX
    PUSH AX

    MOV CX,14
    LEA BX,MASS
L1:
    MOV byte ptr [BX],02h
    INC BX
    LOOP L1

; Наверное должно быть так, хотя неизвестно, что было задумано:
    LEA BX,MASS
    XOR AX,AX
    ADD AL,[bx]
    MOV BX,1
    ADD AL,MASS[bx]
    MOV BX,2
    ADD AL,MASS[bx]
    MOV BX,3
    mov word ptr MASS[bx][8],ax

    XOR DX,DX
    MOV AL,MASS[0]
    IMUL MASS[1]
    MOV MASS[3],DH
    MOV MASS[4],AL

    RET
OUR_PROG ENDP

MASS DB 14 DUP(0)
STAK DW 64 DUP (?)
Stack_ptr equ $

CSEG ENDS
    END OUR_PROG

P.S. Очередной наглядный пример того, что получается, если взять чужую рабочую программу и пытаться изменить её под своё задание, не имея представления что делаешь.
Ол
Олег
51 590
Лучший ответ
забей в поиск "формат файла com"
Там только заголовочная часть изменится.