有人可以帮忙,为什么这不读文件?

时间:2017-04-12 15:45:45

标签: assembly x86-16 tasm

;------------------------------------------------------
Pila Segment

    db 0FFFFh Dup (?) ;declracion del segmento de pila

Pila EndS
;------------------------------------------------------

;------------------------------------------------
Datos Segment ; declaracion del segmento de datos

    archivo db 0;,0;?
    leido db 81 dup (24h) ; Cantidad de letras que va a leer.
    handle dw ? ; Identificador para el archivo.

Datos ENdS
;------------------------------------------------

;----------------------------------------------------
Codigo Segment ; declaracion del segmento de codigo

Assume CS:Codigo, DS:Datos, SS:Pila

Inicio:

    mov ax, Datos
    mov DS, ax
    xor ax,ax 


    mov ah,01h  
    int 21h

    mov archivo, al
    mov dx, offset archivo ;

    mov al, 0h 
    mov dx, offset archivo 
    mov ah, 3dh 
    int 21h 
    mov handle, ax 
    mov bx, handle
    mov cx, 79h 
    mov dx, offset leido 
    mov ah, 3fh
    int 21h


    mov bx, handle
    mov ah, 3eh
    int 21h

    xor ax,ax 
    xor dx,dx
     ;imprimir el contenido de leido
    mov dx, offset leido ;
    mov ah, 9
    int 21h

    xor ax,ax ;Limpia el al y prepara el ah para la salida.
    mov ax,4c00h ;Servicio AH=4c int 21h para salir del programa.
    int 21h ;Termina el programa.

Codigo EndS
    End Inicio

1 个答案:

答案 0 :(得分:1)

archivo db 0;,0;?

您使用 archivo 的方式表明您从键盘输入单个字符文件名。如果您以正确的方式设置 archivo 缓冲区,这很好:

archivo db 0,0
mov bx, handle
mov cx, 79h 
mov dx, offset leido 
mov ah, 3fh
int 21h

在这里你需要注意你使用的数字系统!您已询问79 h (十六进制数)的大小(CX),远远大于 leido 的81字节缓冲区。
你可能想写:

mov cx, 79       ;Without the "h"
db 0FFFFh Dup (?) ;declracion del segmento de pila

程序的其余部分应该没有问题,除了我不喜欢你设置堆栈的方式。你应该总是专门设置一个大小合适的堆栈,在这个小程序中它根本不需要那么大:

db 512 dup (?) ;declracion del segmento de pila

使用dw指令可以轻松获得正确的大小 然后,相同的512字节堆栈变为:

dw 256 dup (?) ;declracion del segmento de pila