2017-12-11 39 views
0

어셈블리에서 파일에서 바이트를 읽은 후 현재 파일 위치가 업데이트됩니다. 해당 바이트를 수정하고 읽은 동일한 위치의 파일에 쓰기보다는 어떻게 할 수 있습니까? 단순히 [0] 읽기 바이트의 ASCII 코드로 다시 파일을 쓰기보다 번호를 추가, x8086어셈블리 파일 내용 수정

READ_LOOP: 
    MOV AH,3FH 
    MOV BX, HANDLE 
    MOV CX, 1 
    LEA DX, BUFFER 
    INT 21H 
    INC SI 
    ;if no byte was read we reached the end of file or an error occured 
    CMP AL, 1 
    JB EOF_END_ERR 

    ;write the read content to output 
    ;MOV AH, 02H 
    ;MOV DL, BUFFER 
    ;INT 21H 

    JMP ENCRYPTING 
    JMP FINAL 

ENCRYPTING: 
    XOR AX,AX 
    MOV DL, BUFFER[0] 
    ADD DL, NUMBER[0] 
    MOV TEMP, DL 

    MOV AH, 42H 
    MOV BX, HANDLE 
    MOV CX,0FFFFH 
    MOV DX, 0FFFFH 
    MOV AL,1 
    INT 21H 

    XOR DX,DX 
    MOV DL, 65 
    MOV BX, HANDLE 
    MOV CX,1 
    MOV AH, 40H 
    INT 21H 

    JMP READ_LOOP 

나는 위의 코드와 노력에 TASM하고 있어요. 하지만 파일에 기록해야 할 내용을 기록하지 않습니다.

+1

함수 42h를 사용하여 파일 포인터를 뒤로 이동하십시오. – Jester

+0

@Jester 어떻게 1 바이트로 돌아갈 수 있습니까? 예를 들어 주시겠습니까? – dbogdan

+1

Ralf Brown의 인터럽트 목록에서 설명서를 찾으십시오. http://www.ctyme.com/intr/rb-2799.htm –

답변

1

AH=42h 서비스를 사용할 수 있습니다. 파일에서 바이트를 읽은 후 파일 포인터가 업데이트됩니다. 이제 파일의 이전 읽기 바이트를 다른 것으로 바꾸려면 먼저 파일 포인터를 1 바이트 뒤로 이동하여 (바꿀 바이트를 가리 키도록) 다음 코드를 사용하여 수행 할 수 있습니다.

이제 새로운 바이트 바이트를 덮어 쓸 수 있습니다 위의 코드의 실행 후

mov al, 1  ; relative to current file position 
    mov ah, 42h  ; service for seeking file pointer 
    mov bx, handle 
    mov cx, -1  ; upper half of lseek 32-bit offset (cx:dx) 
    mov dx, -1  ; moves file pointer one byte backwards (This is important) 
    int 21h 

을 그리고 이것은 다음 코드를 사용하여 수행 할 수 있습니다

코드는 현재 위치에서 한 바이트 뒤로 파일 포인터를 이동합니다 :

f 파일 조작 고토 here에 대한 자세한 내용은

mov ah, 40h   ; service for writing to a file 
    mov bx, handle  
    mov cx, 1   ; number of bytes to write 
    mov dx, offset char ; buffer that holds the new character to be written 
    int 21h 

: 파일 포인터의 현재 위치를 ROM.

+0

C2에서 -1이므로 cx, 0ffffh 및 dx 0ffffh에 넣은 경우에만 작동하지 않습니다. 내 문제는 dx에 오프셋을 넣지 않았다고 생각합니다. – dbogdan

+1

'처리 중'입니다 (파일 핸들처럼),'handler'가 아닙니다. 영어로 "핸들"은 예를 들어 문을 열 수있는 것입니다. "핸들러"는 공항에서 가방을 다루는 사람이나 인터럽트를 처리하는 기능 또는 그와 유사한 것입니다. (BTW, 좋은 대답, 이것은 좋은 설명으로 좋고 명확하며, 전체 프로그램의이 부분을 만드는 불필요한 코드가 아닙니다.) –

+0

@dbogdan 왜 다른 질문을하기 위해 질문을 편집 했습니까? 이 문제에 대해 별도의 질문을 게시해야합니다. 이전 질문으로 되돌아가 새 질문을 별도로 게시하십시오. – Ahtisham