Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

В чём ошибка?

1.2K
22 июля 2006 года
piroman17
175 / / 20.07.2006
Процедура Work01 следующего торезка кода должна
забивать байт (номер в ax) в таблице, находящийся с 1-го по 8-й секторы флопака, занчением из cl.
Она этого не делает:eek: Ни как не могу разобраться в чём дело.
Плиз ПОМОГИТЕ!!!

Код:
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
349
22 июля 2006 года
Phantom-84
656 / / 27.10.2005
Если ты работаешь только с секторами с 1 по 8, зачем выполнять какие-то сложные вычисления?
1.2K
22 июля 2006 года
piroman17
175 / / 20.07.2006
[QUOTE=Phantom-84]..., зачем выполнять какие-то сложные вычисления?[/QUOTE]

Я вычисляю какой из секторов надо изменять, чтобы не загружать все восемь секторов.

Код:
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


Я тут код получше откоментировал.
1.2K
22 июля 2006 года
piroman17
175 / / 20.07.2006
Я уже сам разобрался в чём ошибка.
Но всёравно спасибо!
1.8K
25 июля 2006 года
LM(AL/M)
332 / / 20.12.2005
[QUOTE=piroman17]Я уже сам разобрался в чём ошибка.
Но всёравно спасибо![/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.2K
27 июля 2006 года
piroman17
175 / / 20.07.2006
[QUOTE=LM(AL/M)]
// 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 не получится!!!


================================================
"Тот кто оправдывается всегда не прав ..." Дейл Карнеги.
334
30 июля 2006 года
HexEdit
809 / / 27.07.2006
Цитата:
mov si,ds
mov es,si
// 5. Может лучше PUSH ds/POP es ?


; Мне кажется, лучше
mov ax, ds
mov es, ax
; Операции с регистрами (а тем более аккумуляторами) выполняются быстрее чем с памятью :o

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог