masm
model tiny
.code
test_Procedure:
mov bx,@Stack
mov ss,bx
mov ax,06h ;задаём начальные данные
mov cl,01h ;
call Work01
pause1:
mov ax,02h
jmp pause1
;Входные данные:
;Забивает байт (номер в ax) в Таблице, находящийся с 1-го
;по 8-й секторы флопака, занчением из cl
Work01 proc
push cx
push ax
mov bh,128
div bh ;2880/128 = x
mov ah,00h ;ax=al
mov bh,4
div bh ;x/4 = al
inc al ;al - cектор для загрузки начиная с первого
mov ah,00h
mov dx,ax ;dx=al
push dx
mov si,ds
mov es,si
lea di,SectBuf
call ReadSect ; Чтение сектора (DX=номер сектора)
; ES:DI - куда читать
pop ax ;pop dx. mov ax,dx
sub ax,01h
mov cx,512
mul cx ;ax - выход
mov cx,ax ; cx=ax
pop ax
sub ax,cx ;ax<512
;al=ax
lea bx,[SectBuf]
add bx,ax ;es:bx[с нуля]+ax[смещение до нужного байта]=es:(bx+ax)
pop dx ;pop cx. mov dx,cx
mov [es:bx],byte ptr dl ;byte ptr dl
add ax,cx ;ax - первоначальный номер сектора
mov bh,128
div bh ;2880/128 = x
mov ah,00h ;ax=al
mov bh,4
div bh ;x/4 = al
inc al ;al - cектор для загрузки начиная с первого
mov ah,00h
mov dx,ax ;dx=al
lea di,[SectBuf]
call WriteSect ; Запись сектора (DX=номер сектора)
; ES:DI - откуда читать
ret
Work01 endp
;Процедуры ReadSect и WriteSect не привожу т.к. в них точно нет ошибок!
end test_Procedure
В чём ошибка?
забивать байт (номер в ax) в таблице, находящийся с 1-го по 8-й секторы флопака, занчением из cl.
Она этого не делает:eek: Ни как не могу разобраться в чём дело.
Плиз ПОМОГИТЕ!!!
Код:
Если ты работаешь только с секторами с 1 по 8, зачем выполнять какие-то сложные вычисления?
Я вычисляю какой из секторов надо изменять, чтобы не загружать все восемь секторов.
Код:
push cx
push ax
mov bh,128 ;здесь я целочисленно делю
div bh ;n/128 = ax ;номер ячейки на 512
mov ah,00h ;ax=al ; чтобы узнать какой из секторв
mov bh,4 ;грузить
div bh ;ax/4 = al ;
inc al ;al - cектор для загрузки начиная с первого
mov ah,00h ;
mov dx,ax ;dx=al
push dx
mov si,ds
mov es,si
lea di,SectBuf
call ReadSect ; Чтение сектора (DX=номер сектора)
; ES:DI - куда читать
pop ax ;pop dx. mov ax,dx
sub ax,01h ;вычисление обратное первому
mov cx,512 ; (n div 512)*512,
mul cx ;ax - выход ; номер последнего байта предыдущего
mov cx,ax ; cx=ax ;
pop ax
sub ax,cx ;ax<512 ax-смещение
; от начала буфера до нужного байта
;al=ax
lea bx,[SectBuf]
add bx,ax ;es:bx[от начала буфера]+
;+ax[смещение до нужного байта]=es:(bx+ax)
pop dx ;pop cx. mov dx,cx
mov [es:bx],byte ptr dl ;byte ptr dl
add ax,cx ;ax - первоначальный номер сектора
mov bh,128 ;
div bh ;2880/128 = x ;опять получаем номер сектора
mov ah,00h ;ax=al ;каторый надо изменить
mov bh,4 ;(для последующей записи)
div bh ;x/4 = al ;
inc al ;al - cектор для загрузки начиная с первого
mov ah,00h
mov dx,ax ;dx=al
lea di,[SectBuf]
call WriteSect ; Запись сектора (DX=номер сектора)
; ES:DI - откуда читать
ret
push ax
mov bh,128 ;здесь я целочисленно делю
div bh ;n/128 = ax ;номер ячейки на 512
mov ah,00h ;ax=al ; чтобы узнать какой из секторв
mov bh,4 ;грузить
div bh ;ax/4 = al ;
inc al ;al - cектор для загрузки начиная с первого
mov ah,00h ;
mov dx,ax ;dx=al
push dx
mov si,ds
mov es,si
lea di,SectBuf
call ReadSect ; Чтение сектора (DX=номер сектора)
; ES:DI - куда читать
pop ax ;pop dx. mov ax,dx
sub ax,01h ;вычисление обратное первому
mov cx,512 ; (n div 512)*512,
mul cx ;ax - выход ; номер последнего байта предыдущего
mov cx,ax ; cx=ax ;
pop ax
sub ax,cx ;ax<512 ax-смещение
; от начала буфера до нужного байта
;al=ax
lea bx,[SectBuf]
add bx,ax ;es:bx[от начала буфера]+
;+ax[смещение до нужного байта]=es:(bx+ax)
pop dx ;pop cx. mov dx,cx
mov [es:bx],byte ptr dl ;byte ptr dl
add ax,cx ;ax - первоначальный номер сектора
mov bh,128 ;
div bh ;2880/128 = x ;опять получаем номер сектора
mov ah,00h ;ax=al ;каторый надо изменить
mov bh,4 ;(для последующей записи)
div bh ;x/4 = al ;
inc al ;al - cектор для загрузки начиная с первого
mov ah,00h
mov dx,ax ;dx=al
lea di,[SectBuf]
call WriteSect ; Запись сектора (DX=номер сектора)
; ES:DI - откуда читать
ret
Я тут код получше откоментировал.
Но всёравно спасибо!
Но всёравно спасибо![/QUOTE]
все таки несколько каментов:
// 1. Чтобы делить на 128 и 4 лучше использовать инструкцию SHR
mov bh,128 ;здесь я целочисленно делю
div bh ;n/128 = ax ;номер ячейки на 512
mov ah,00h ;ax=al ; чтобы узнать какой из секторв
mov bh,4 ;грузить
div bh ;ax/4 = al ;
// 2. В чем великий смысл делить на 128, обнулять старший байт и снова делить на 4 ? Если нам нужен номер сектора по смещению в таблице -- просто разделим на 512:
SHR ax, 9
(при этом гарантированно получится значение < 256 ;)))
inc al ;al - cектор для загрузки начиная с первого
mov ah,00h ;
// 3. AH уже равно 0
mov dx,ax ;dx=al
push dx
// 4. Почему не PUSH ax ?
mov si,ds
mov es,si
// 5. Может лучше PUSH ds/POP es ?
lea di,SectBuf
// 1. Чтобы делить на 128 и 4 лучше использовать инструкцию SHR
mov bh,128 ;здесь я целочисленно делю
div bh ;n/128 = ax ;номер ячейки на 512
mov ah,00h ;ax=al ; чтобы узнать какой из секторв
mov bh,4 ;грузить
div bh ;ax/4 = al ;
// 2. В чем великий смысл делить на 128, обнулять старший байт и снова делить на 4 ? Если нам нужен номер сектора по смещению в таблице -- просто разделим на 512:
SHR ax, 9
(при этом гарантированно получится значение < 256 ;)))
inc al ;al - cектор для загрузки начиная с первого
mov ah,00h ;
// 3. AH уже равно 0
mov dx,ax ;dx=al
push dx
// 4. Почему не PUSH ax ?
mov si,ds
mov es,si
// 5. Может лучше PUSH ds/POP es ?
[/QUOTE]
Спасибо за то что паказал не рациональность моих действий,
но всё таки:
[QUOTE=LM(AL/M)]
(при этом гарантированно получится значение < 256 ;)))
[/QUOTE]
если даже максимальное значение word=FFFFh делить на 128,
а потом на 4, ответ больше 128 не получится!!!
================================================
"Тот кто оправдывается всегда не прав ..." Дейл Карнеги.
Цитата:
mov si,ds
mov es,si
// 5. Может лучше PUSH ds/POP es ?
mov es,si
// 5. Может лучше PUSH ds/POP es ?
; Мне кажется, лучше
mov ax, ds
mov es, ax
; Операции с регистрами (а тем более аккумуляторами) выполняются быстрее чем с памятью :o