Прерывания обработки файлов не работают с шаблоном .EXE в сборке. - PullRequest
0 голосов
/ 04 июня 2019

Мне нужно было написать программу на ассемблере, которая выполняет простое редактирование текста.

Он должен быть в шаблоне .EXE, но обработка файлов прерывается, например ah=3dh int 21h.

Я пытался написать код в шаблоне .COM, но с разделенными данными и разделами кода. Фактический код слишком длинный, поэтому я не могу поставить его здесь. Но даже с простейшими кодами это не работает в шаблоне .EXE.

data segment
 filename db 'myfilexxxx.txt', 0
 handle dw ?
 datax db " hello files! "
 data_size=$-offset datax
 buffer db 4 dup(' ') 
ends

stack segment
    dw   128  dup(0)
ends

code segment
start:
mov ax,@data
mov ds,ax

mov ah, 3ch
mov cx, 0
mov dx, offset filename
mov ah, 3ch
int 21h ; create file...
mov handle, ax
mov bx, handle
mov dx, offset datax
mov cx, data_size
mov ah, 40h
int 21h ; write to file...
mov al, 0
mov bx, handle
mov cx, 0
mov dx, 7
mov ah, 42h
int 21h ; seek...
mov bx, handle
mov dx, offset buffer
mov cx, 4
mov ah, 3fh
int 21h ; read from file...
mov bx, handle
mov ah, 3eh
int 21h ; close file...

mov ax, 4c00h
int 21h  

ends

end start
org 100h
mov ah, 3ch
mov cx, 0
mov dx, offset filename
mov ah, 3ch
int 21h ; create file...
mov handle, ax
mov bx, handle
mov dx, offset data
mov cx, data_size
mov ah, 40h
int 21h ; write to file...
mov al, 0
mov bx, handle
mov cx, 0
mov dx, 7
mov ah, 42h
int 21h ; seek...
mov bx, handle
mov dx, offset buffer
mov cx, 4
mov ah, 3fh
int 21h ; read from file...
mov bx, handle
mov ah, 3eh
int 21h ; close file...
ret
 filename db "myfile.txt", 0
 handle dw ?
 data db " hello files! "
 data_size=$-offset data
 buffer db 4 dup(' ') 
ret

That is my .COM template code running

This is what I get with .EXE template with same code

1 Ответ

0 голосов
/ 08 июня 2019

Чтобы ответить на него просто, если вы используете прерывание печати строки, вам необходимо выяснить, в каком сегменте оно определено. Затем вам нужно push ds (если он определен в сегменте данных) после этого pop es, чтобы вставить его в сегмент Extra, который является сегментом по умолчанию для вывода строк.

...