我想将文件中的字节复制到字符串

时间:2015-05-13 02:56:02

标签: assembly

下面的代码显示了我的一个程序,它可以将字节(一次一个字节)从一个文件复制到另一个文件。我该怎么做才能让它从文件中复制字节并将其保存到字符串中?

reading:

;READ ONE BYTE.

    mov ah, 3FH             ;read from the file
    mov bx, handle          ;normal file
    mov cx, 1               ;HOW MANY BYTES TO READ.
    mov dx, offset buffer   ;THE BYTE WILL BE STORED HERE.
    int 21h                 ;NUMBER OF BYTES READ RETURNS IN AX.

;CHECK EOF (END OF FILE).

cmp ax,0                ;IF AX == 0 THEN EOF.
je  eofp

;WRITE BYTE TO THE SECOND FILE.           

    mov ah, 40h                            ; write to 
    mov bx, handle2                        ; file handle   
    mov dx, offset buffer                 ; where to find data to write    
    mov cx, 1                              ;LENGTH OF STRING IN CX.    
    int 21h    
    jmp reading                            ;REPEAT PROCESS.

eofp:

1 个答案:

答案 0 :(得分:2)

你需要一个指向字符串的指针,使用指针存储指针指向的字节,然后向前移动指针,这里是代码:

    lea  si, mystring       ;SI POINTS TO A STRING.  <======================

reading:

;READ ONE BYTE.
    mov ah, 3FH             ;read from the file
    mov bx, handle          ;normal file
    mov cx, 1               ;HOW MANY BYTES TO READ.
    mov dx, offset buffer   ;THE BYTE WILL BE STORED HERE.
    int 21h                 ;NUMBER OF BYTES READ RETURNS IN AX.

;CHECK EOF (END OF FILE).
    cmp ax,0                ;IF AX == 0 THEN EOF.
    je  eofp

;SAVE BYTE IN STRING.                               <======================
    mov  al, buffer         ;AL = BYTE READ.
    mov  [ si ], al         ;SAVE BYTE IN CURRENT POSITION.
    inc  si                 ;MOVE POINTER TO NEXT POSITION.

    jmp reading             ;REPEAT PROCESS.

eofp:

注意SI在开始时如何指向字符串。检查EOF后,我们将读取的字节存储在[SI]中,然后增加SI(这里我们理解SI和[SI]之间的差异)。

但是第二个字符串不是必需的。我们已经让DX指向&#34;缓冲区&#34;,在标签之前移动它&#34;阅读&#34;,然后,在阅读之后,让我们增加它(它是初始化所必需的) DX之前&#34;读取&#34;或者它会将所有读取的字节保存在同一位置):

    mov dx, offset buffer   ;THE BYTE WILL BE STORED HERE.  <==========================
reading:

;READ ONE BYTE.
    mov ah, 3FH             ;read from the file
    mov bx, handle          ;normal file
    mov cx, 1               ;HOW MANY BYTES TO READ.
    int 21h                 ;NUMBER OF BYTES READ RETURNS IN AX.

    inc dx                  ;POSITION FOR NEXT BYTE. <================================

;CHECK EOF (END OF FILE).
    cmp ax,0                ;IF AX == 0 THEN EOF.
    je  eofp

    jmp reading             ;REPEAT PROCESS.

eofp:

为了提高流程效率,您可以一次读取一个字节,一次读取两个字节,或一次读取10个字节。

正如Gondil所说,这适用于小于64Kb的小文件。对于较大的文件,您需要分配内存(但这是另一个问题)。