Здравствуйте, есть следующий код некоторой подпрограммы: Код (Text): ... mov ah, 40h mov bx, FileID mov cx, SIZE mov dx, offset Buffer int 21h jc @@End sub ax, cx ; ОШИБКА, если записались не все байты. neg ax @@End: ; CF = 1 - признак ошибки. ret Собственно параноидальный вопрос следующий. В справочнике по прерываниям не сказано, какие существуют СТАНДАРТНЫЕ ПРАВИЛА для соотношений между AX и CX, когда ошибки нет. МОЖНО ЛИ НАДЕЯТЬСЯ НА ТО, ЧТО, КОГДА ОШИБКИ НЕТ, ТО AX всегда меньше или равен CX? И, если это входит в НЕИЗВЕСТНЫЙ МНЕ СТАНДАРТ, удалить NEG и заменить SUB на CMP? И ещё вопрос. 1)Нужно ли при вызовах функций ДОС ВСЕГДА сохранять изменяемые/используемые ими регистры? Я обычно пишу например так: Код (Text): mov ah, 9 mov dx, offset Text1 int 21h mov dx, offset Text2 int 21h Это работает, но ПРАВИЛЬНО ЭТО ИЛИ НЕТ(СТАНДАРТ ИЛИ НЕСТАНДАРТ)? 2)Нужно ли ВСЕГДА сохрянять регистр флагов? Извиняюсь за детские вопросы, просто ответов нигде нет.
Lurker В справочнике по прерываниям не сказано, какие существуют СТАНДАРТНЫЕ ПРАВИЛА для соотношений между AX и CX Например, в шестом TECH Help'е, в описании DOS Fn 40H: Write to File via Handle есть замечание ... Notes: You should always compare the return value of AX (number of bytes written) to CX (requested write size): - if AX = CX, the write was successful - if AX < CX, an error occurred (most likely a full disk). Note that Carry is not set for this "error". ... Нужно ли при вызовах функций ДОС ВСЕГДА сохранять изменяемые/используемые ими регистры? Про "изменяемые", если тебе нужны их оригинальные значения, то сохраняй. Про "используемые". Если необходимо уменьшить код, то надо исследовать поведение конкретных функций, конкретных версий/клонов DOS. Если такая задача не стоит, то я бы не стал рассчитывать, что значение не изменится. Твой пример не показателен, т.к. нет необходимости сохранять и восстанавливать AH, достаточно добавить mov ah,9. 2)Нужно ли ВСЕГДА сохрянять регистр флагов? Что значит "ВСЕГДА"? Надо смотреть по ситуации. ps мне не известны документированные правила/соглашения по используемым регистрам, кроме как в описании конкретных функций.
Lurker Давно это было, при работе в DOS'е открытие, чтение и закрытие я делал так Код (Text): MOV AX,3D00h MOV DX,OFFSET FILENAME INT 21h ;открыть для чтения файл MOV BX,AX MOV AX,4202h XOR CX,CX ;определяем длину файла для чего XOR DX,DX ;позиционируемся в конец файла INT 21h PUSH AX; в AX получаем длину файла MOV AX,4200h ;позиционируемся в начало файла INT 21h MOV AH,3Fh ;читаем файл MOV DX,OFFSET BUFFER ;указываем на буфер POP CX; передаем длину файла в CX INT 21h MOV AH,3Eh INT 21h ;закрыли файл Это в случае если под буфер я могу отвести место большее, чем длина файла. Если я не могу себе позволить роскошь в виде большого буфера, например под буфер выделено всего 100 байт, тогда Код (Text): MOV AX,3D00h MOV DX,OFFSET FILENAME INT 21h ;открыть для чтения файл MOV BX,AX a1: MOV AH,3Fh ;читаем файл MOV DX,OFFSET BUFFER ;указываем на буфер MOV CX,100 INT 21h pushf ; что-то делаем с прочитанными байтами popf jnc a1; если считано меннее 100 байт, значит файл закончился MOV AH,3Eh; и нужно его закрыть INT 21h По тексту программ видно, что handle файла отправленный в bx сразу после открытия файла не меняется до самого закрытия файла. INT 21h - если это не оговорено особо, меняет значения только в регистре флагов и в регистре AX. При выходе из функции записи, если ошибки не было, тогда CF=0 и в регистре AX находится количество записанных байт равеное числу в CX. Если произошла ошибка, CF=1 и в регистре AX находится число меньшее CX, что и говорит об ошибке. Поэтому твой фрагмент Код (Text): int 21h jc @@End sub ax, cx ; на эту ветку попадаешь как раз тогда, когда ошибки нет и ax==cx neg ax @@End: я бы переписал так Код: int 21h jnc @@End; нет ошибки - переходим к следующей фазе программы xchg cx,ax sub ax, cx ; иначе - в ax сколько байт не записалось из буфера @@End:
Mikl__ jnc @@End; нет ошибки - переходим к следующей фазе программы А как же Tech help'овское "should always compare ... full disk ... Carry is not set for this error"?