2015-11-10 3 views
2

Эта программа должна просто читать текст из файла и выводить его. Проблема в том, что имя файла вводится пользователем.Assembly x86 NULL terminator (TASM)

То, что я сделал до сих пор:

  • Я поставил нулевой терминатор, чтобы указать конец строки
  • И сделал новый текстовый файл в точной папке, в которой файл .exe является

Что я получаю:

  • Файл не может быть открыт

    .model small 
    
        .stack 100h 
    
        .data 
          filename db 255 dup(0) 
          line  db 255 dup(0)  
    
          filehandle dw ? 
          line_len dw ? 
    
        .code 
          newline macro ;NEW LINE 
              ; 
          mov dl, 10  ; 
          mov ah, 02h  ; 
              ; 
          int 21h   ; 
              ; 
          mov dl, 13  ; 
          mov ah, 02h  ; 
              ; 
          int 21h   ;     
          endm    ;NEW LINE 
        main: 
    
          mov ax, @data  
          mov ds, ax 
    
          lea si, filename 
          mov ah, 01h 
    
        char_input: 
    
          int 21h   
    
          cmp al, 0dh  
          je zero_terminator 
    
          mov [si], al  
          inc si 
    
          jmp char_input 
    
        zero_terminator: 
    
          mov [si], '\0' 
    
          int 21h 
    
        open_file: 
    
          lea dx, filename   
          mov al, 0   
          mov ah, 3Dh 
    
          int 21h 
    
          mov filehandle, ax  
    
          int 21h 
    
        read_line: 
    
          mov ah, 3Fh  
          lea bx, filehandle    
          mov cx, 1    
    
          int 21h   
    
          cmp ax, 0  ;EOF    
          je EO_file 
    
          inc line_len 
    
          jmp read_line: 
    
        EO_file: 
    
          newline   ;macro 
    
          lea dx, line ;print line 
          mov bx, 1  
          mov ah, 40h  
          mov cx, line_len 
    
          int 21h   
    
          mov ah, 4ch 
    
          int 21h     
    
        end main 
    
+1

У вас есть лишние вызовы 'int 21h' без видимых причин. Что касается открытия файла, все выглядит хорошо. Используйте отладчик, чтобы проверить, правильно ли сохранено имя файла и каков дескриптор возвращаемого файла. Изменить: убедитесь, что ваш ассемблер понимает '' \ 0'', или еще лучше, просто напишите '0'. – Jester

+0

Спасибо, теперь он работает с 0 вместо '\ 0'. – beingas

+0

Но, к сожалению, он застрял в цикле чтения ... Программа не может найти конец файла, даже если я проверю возвращаемое значение AX – beingas

ответ

2

комментарии Подводя итог шута и добавив несколько замечаний, вот проблемы с вашей программой:

zero_terminator: 
mov [si], '\0' 
int 21h 

Эта int 21h инструкция должна быть удалена , Использование '\ 0' не приведет к нулевому завершению имени файла. Лучше использовать равнину .

mov filehandle, ax 
int 21h 
read_line: 

Эта инструкция int 21h также должна быть удалена.

read_line: 
mov ah, 3Fh 
lea bx, filehandle 
mov cx, 1 
int 21h 

В этом прочитать блок вы забыли настроить буфер адреса в DX и вы ошибочно переместил адрес дескриптора переменной в BX, где на самом деле вам нужно его значение. Также обратите внимание, что адрес буфера должен увеличиваться с каждой итерацией этого цикла! Изменить на:

lea dx, line 
read_line: 
mov ah, 3Fh 
mov bx, filehandle 
mov cx, 1 
int 21h 
;;; jc EO_file ?? 
cmp ax, 0  ;EOF    
je EO_file 
inc line_len 
inc dx 
jmp read_line ; <-- Here you had a typo! 

Было бы здорово, чтобы проверить CF после открытия файла, чтобы подтвердить, что на самом деле вы получили правильный дескриптор.

+0

И было бы здорово, если бы вы включили атрибуты в соответствии с требованиями лицензирования: P – Jester

+1

@Jester Я добавил атрибуты для вашего комментирования этого вопроса. – Fifoernik