Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > помогите с чтением с файла


Автор: xseroxas 14.11.2007, 14:15
вобщем проблема состоит в том что мне надо читать файл с конца насколко я понимаю надо послат сам курсор в конец 
с помощю команды
 
Код

mov ah,42h mov al,2 


но непанимаю как потом мне передвигиватса по файле ровно на столко на сколко мне надо например на 20h


зарание блогадарен

Автор: xseroxas 14.11.2007, 20:18
насколко я уже разобрался кырсор отаправлаю с помощю 42н функцыйи потом пишу dec ax насколко я панимаю должно мен одпечатать последний символ из моего файла но он нечего непечатает почему или я нитак панимаю


Код

read_duom1: 
      mov ah,42h
      mov al,02h
      mov bx,[duom1_desc]
      xor dx,dx
      xor cx,cx
      int 21h

                  dec ax
      
      mov bx,[duom1_desc] 
      mov ah,3fh
      mov cx,2h
      mov dx,offset duom1_buf
      int 21h
      jc close_duom1

Автор: dumb 15.11.2007, 10:26
функция 42h устанавливает позицию в файле относительно начала(al=0)/текущей позиции(al=1)/конца файла(al=2). относительное смещение указывается в паре регистров CX:DX(32 бита) и является знаковым - т.е. можно, например, сместиться на -2 байта относительно текущей позиции: al=1, cx:dx=-2{FFFFFFFE, т.е. cx=FFFF(-1), dx=FFFE(-2)}
возвращенное функцией в регистрах DX:AX 32битное число есть смещение от начала, получившееся после позиционирования.

ты своим dec ax просто изменил число возвращенное функцией. позиция в файле от этого, очевидно, не меняется и остается по прежнему на конце файла, откуда прочитать ты ничего уже не можешь... чтобы поменять позицию в файле, нужно после твоего dec ax запихать это число опять в cx:dx и заново вызвать функцию позиционирования(только на этот раз - от начала файла):
Код

read_duom1:
      mov ah,42h
      mov al,02h
      mov bx,[duom1_desc]
      xor dx,dx
      xor cx,cx
      int 21h
      jc close_duom1

      dec ax
      mov cx,dx
      mov dx,ax

      mov ah,42h
      mov al,00h
      mov bx,[duom1_desc]
      int 21h
      jc close_duom1
      
      mov bx,[duom1_desc] 
      mov ah,3fh
      mov cx,1 ;2h - определись, один тебе нужен байт или таки два...
      mov dx,offset duom1_buf
      int 21h
      jc close_duom1


или просто сразу установить позицию -1 от конца:
Код

read_duom1:
      mov bx,[duom1_desc]
      mov ax,4202h
      mov cx,-1 ; FFFF
      mov dx,-1 ; FFFF
; полное число в паре CX:DX - FFFFFFFF, т.е. -1
      int 21h
      jc close_duom1

      mov ah,3fh
      mov cx,1 ;2h - определись, один тебе нужен байт или таки два...
      mov dx,offset duom1_buf
      int 21h
      jc close_duom1


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)