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

Ваш аккаунт

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

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

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

Деление??? Глупо, но факт!!!

367
09 мая 2006 года
Meatcoins
303 / / 18.01.2006
mov di,offset cii ;Берём число
mov dx,word ptr cs:[di] ;из одной ячейки
mov di,offset mo+4 ;берём другое
mov ax,word ptr cs:[di] ;из другой ячейки
xor cx,cx ;и делим их!!!
piu: ;Почему-то тут не удаётся написать
sub ax,dx ;div dx - получается логический
inc cx ;бред!!! По идее он должен
jnc piu ;содержимое ax поделить на dx, а
clc ;потом результат в ax, а остаток
dec cx ;в dx, но в ax получается число,
mov dx,cx ;не понятно какое!!!
3.8K
09 мая 2006 года
Supervisor
158 / / 29.05.2005
Попробуй делить не на dx, а на какой-нибудь другой регистр, а непосредственно перед делением выполняй xor dx,dx.
367
09 мая 2006 года
Meatcoins
303 / / 18.01.2006
Цитата:
Originally posted by Supervisor
Попробуй делить не на dx, а на какой-нибудь другой регистр, а непосредственно перед делением выполняй xor dx,dx.



Гениально! Непосредственно перед делением обнулять то, на что я буду делить! В матеметике это будет бесконечность, а тут исключение типа деления на ноль!
Кстати, я пробывал делить и на cx, и на si, и на di, и т.д. Но ничего хорошего!

3.8K
09 мая 2006 года
Supervisor
158 / / 29.05.2005
Цитата:
Originally posted by Meatcoins
Гениально! Непосредственно перед делением обнулять то, на что я буду делить! В матеметике это будет бесконечность, а тут исключение типа деления на ноль!
Кстати, я пробывал делить и на cx, и на si, и на di, и т.д. Но ничего хорошего!


Я тебе ЧЕТКО написал что делать:
1. Дели НЕ на dx (а, например, на bx);
-&- (не или)
2. Обнуляй регистр dx перед делением.

242
09 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Meatcoins
mov di,offset cii ;Берём число
mov dx,word ptr cs:[di] ;из одной ячейки
mov di,offset mo+4 ;берём другое
mov ax,word ptr cs:[di] ;из другой ячейки
xor cx,cx ;и делим их!!!
piu: ;Почему-то тут не удаётся написать
sub ax,dx ;div dx - получается логический
inc cx ;бред!!! По идее он должен
jnc piu ;содержимое ax поделить на dx, а
clc ;потом результат в ax, а остаток
dec cx ;в dx, но в ax получается число,
mov dx,cx ;не понятно какое!!!



если проблема еще естъ то опиши ее так, что бы ее понять было можно.
к слову хочу сказать что команда div - division, unsigned
если регистр на который делим он 1 байт -> то делится AX на регистр(1 byte - dl ..)=>результат сохраняется в AX( AL - целая часть, AH - остаток), если регистр на который делим он 2 байта => (DX,AX) делится на DX(отсюда и ошибка), то целая часть сохраняется в AX, а остаток в DX.(smotri chto napisal Supervisor)

367
12 мая 2006 года
Meatcoins
303 / / 18.01.2006
Написал другую програмку:
Но если делить на dx, то он даже в файл не записывает ничего - ошибка какая-то!!!
Почему!!! Я же ведь по идее могу делить на любой регист!!!


.model small
.stack 100h
.code
start:
push cs
pop ds
jmp short above
cii:
dw 000Ah
mo:
dw 0F8CAh
my_data:
dw 0
filename:
db "1.txt",0
above:
mov di,offset cii
mov dx,word ptr cs:[di]
mov di,offset mo
mov ax,word ptr cs:[di]
xor cx,cx
;piu:
;sub ax,dx
;inc cx
;jnc piu
;clc
;dec cx
;mov dx,cx
mov bx,dx
xor dx,dx
div bx
mov di,offset my_data
mov word ptr cs:[di],ax
mov ax,3C00h
mov dx,offset filename
xor cx,cx
int 21h
mov bx,ax
mov ax,4000h
mov dx,offset cii
mov cx,000Ch
int 21h
mov ax,3E00h
int 21h
mov ax,4C00h
int 21h
end start
242
12 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Meatcoins
Написал другую програмку:
Но если делить на dx, то он даже в файл не записывает ничего - ошибка какая-то!!!
Почему!!![color=red] Я же ведь по идее могу делить на любой регист!!![/color]


а ты читал то что я написала? ведь все подробно описано:
если делишь на 2 байта берем (DX,AX) и делим на этот регистр.
Например:
АХ = 0D12Еh
DX = 12h
div DX ; (DX,AX) = (0012D12Е) /12

3.8K
12 мая 2006 года
Supervisor
158 / / 29.05.2005
Корявость X86 местами себя проявляет ;)
367
12 мая 2006 года
Meatcoins
303 / / 18.01.2006
У меня в книжке написано следующее:
div источник целочисленное деление без знака
Выполняет целочисленное деление без знака AL, AX или EAX (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в AL, AX или EAX, а остаток - в AH, DX или EDX соответственно.
То есть мы делим AX на некий источник и не (AX,DX) на источник, а только AL, AX или EAX на источник - в качестве делимого может выступать только аккумулятор, а в качестве делителя любой другой регистр! То есть мне кажется, что Оля не права, в том что ошибка из-за того, что делимое размещается в 2-х регистрах AX и DX, и если я делю на DX, то из-за этого ошибка. Наверное, это на самом деле какая-то корявость - мало ли фигни на свете. Хотя впрочем это ерунда - просто буду знать теперь, что с делением есть такая особенность и всё! Да, и делить-то приходится не очень часто - обычно сдвигать нужно...
Кстати, еще вопрос:
Я обнаружил такую феньку:
shr ax,cl работает, а
shr ax,cx не работает, даже если 5 старших или 4 старших разряда заведомо занулены командой and!!!
and cx,00001111b
Вот как!
242
12 мая 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
Originally posted by Meatcoins
У меня в книжке написано следующее:
div источник целочисленное деление без знака
Выполняет целочисленное деление без знака AL, AX или EAX (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в AL, AX или EAX, а остаток - в AH, DX или EDX соответственно.
То есть мы делим AX на некий источник и не (AX,DX) на источник, а только AL, AX или EAX на источник - в качестве делимого может выступать только аккумулятор, а в качестве делителя любой другой регистр![color=red] То есть мне кажется, что Оля не права, в том что ошибка из-за того, что делимое размещается в 2-х регистрах AX и DX[/color], и если я делю на DX, то из-за этого ошибка. Наверное, это на самом деле какая-то корявость - мало ли фигни на свете. Хотя впрочем это ерунда - просто буду знать теперь, что с делением есть такая особенность и всё! Да, и делить-то приходится не очень часто - обычно сдвигать нужно...
Кстати, еще вопрос:
Я обнаружил такую феньку:
shr ax,cl работает, а
shr ax,cx не работает, даже если 5 старших или 4 старших разряда заведомо занулены командой and!!!
and cx,00001111b
Вот как!


может и не права, ведь я учила асм для 16 битового процессора, и то весьма поверхностно. а для 16 битового процессора делить на DX было бы ошибкой.
больше в этот раздел не полезу :)

242
12 мая 2006 года
Оlga
2.2K / / 04.02.2006
проверила по книге Юрова, все правильно(только в порядок регистров я напутала);
Цитата:

делимое - 32 бит -> DX старшая часть, АХ - младшая часть
делитель - 16 бит -> регистр или ячейка памяти
частное - в АХ
остаток - в DХ


Цитата:

делимое - 64 бит -> EDX- старшая часть, ЕАХ - младшая часть
делитель - 32 бит -> регистр или ячейка памяти
частное - в ЕАХ
остаток - в ЕDХ


насчет shr нас учили(и книга Юрова потверждает) что на месте 2-го операнда может быть или константа или CL, но Юров утверждает что есть дополнительные команды позволяющие делать 64-разрядные сдвиги. А в CL он говорит микропроцессор воспринимает только младшие 5 битов, в целях оптимизации.

242
12 мая 2006 года
Оlga
2.2K / / 04.02.2006
в продолжении темы хочу сказать что глупо было с моей стороны думать
что есть разница между старыми и новыми процессорами(в данном вопросе
естественно), т.к. Intel придерживается
политики совместимости прог, написаннами для
старых процессоров, с новыми
349
13 мая 2006 года
Phantom-84
656 / / 27.10.2005
Meatcoins, по моим наблюдениям значительно проще самому за тебя выполнить деление, чем объяснить тебе, как это делается :D А вообще раз уж ты самостоятельно дошел до ассемблера, попробуй самостоятельно разобраться и с делением, потому как в рамках ассемблера существует достаточно много занимательных тем для обсуждения и без деления.
1.8K
13 мая 2006 года
k3Eahn
365 / / 19.12.2005
Цитата:
Originally posted by Meatcoins
Написал другую програмку:
Но если делить на dx, то он даже в файл не записывает ничего - ошибка какая-то!!!
Почему!!! Я же ведь по идее могу делить на любой регист!!!


Можно рассмотреть 2 случая при делении на edx:
1)edx=0 - имеем #DE(Division by zero);
2)edx!=0 - имеем частное(то которое должно оказаться в eax) которое не влезает в 32 бита eax, вследствие чего
опять таки имеем #DE(Divide overflow);

P.S.:читаем первоисточник - "IA-32 Intel® Architecture
Software Developer’s Manual
Volume 2A:
Instruction Set Reference, A-M", там в конце описания инструкции есть псевдокод.

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