Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Вопросы новичка ч1


Автор: FelikZ 7.11.2007, 00:21
Привет! Помогите пожалуйста понять почему:

№1
дано a=-198d=FF3Ah, b=22d=16h, c=9d=9h
a/c+b=?
-198/22+9=-9+9=0

Вот, что написал я:
Код

mov bx, ff3a ;bx=a
mov al, 16    
cbw              ;ax=b
xchg ax,bx    ;ax<=>bx
idiv bx          ;ax=ax/bx                    (в теории должно получися -22d=FFEAh, а получается 0B99h=2969d :((((()
add ax,9      ;ax=ax+c

Почему?
-------------------------------

№2
a/b+b/c

a=0258h, b=FEB9h, c=000Ch
Вот написал:
Код

mov ax, [a]
idiv word ptr [b]
xchg ax, bx
mov ax, [b]
idiv word ptr [c] ; Ошибка: "Переполнение деления" :(((
add bx, ax

Что это такое и как бороться?
-------------------------------

Спасибо за помощь!
Пишу это все в "debug.com" :(.

Автор: Akina 7.11.2007, 11:37
Цитата(FelikZ @  7.11.2007,  01:21 Найти цитируемый пост)
idiv bx          ;ax=ax/bx

Щазз! а посмотреть повнимательнее описание команды?

Автор: FelikZ 7.11.2007, 21:37
Akina, нет у меня хорошего мануала :cry пользуюсь манулом от масма, а там написано:
Цитата

Usage:   IDIV   src
        Modifies flags: (AF,CF,OF,PF,SF,ZF undefined)
        Signed binary division of accumulator by source.  If source is a
        byte value, AX is divided by "src" and the quotient is stored in
        AL and the remainder in AH.  If source is a word value, DX:AX is
        divided by "src", and the quotient is stored in AL and the
        remainder in DX.

я так понимаю, что "If source is a word value, DX:AX is divided by "src", and the quotient is stored in AL and the  remainder in DX." должно мне говорить что-то про DX, но я не понимаю этой фразы... smile  

Автор: ehg 7.11.2007, 23:18
Привет, сам еще только познаю асм, но кажется смысл вот в чем :

Если операнд команды idiv одно байтовое число, то делимое берется из AX. Результат: Частное в AL, остаток в AH.
Если операнд команды idiv двух байтовое число, то делимое берется из DX(старшая часть):AX(младшая часть). Результат: частное в AX, остаток в DX.

У тебя как раз двухбайтовый операнд, так что следи за тем что в DX ;)

Автор: Mikl_ 12.11.2007, 13:26
FelikZ
№1
дано a=-198d=FF3Ah, b=22d=16h, c=9d=9h
a/c+b=? у а указан знак - значит деление знаковое
-198/9+22=-22+22=0
№2
a/b+b/c
a=0258h, b=FEB9h, c=000Ch
у b знак не указан - значит деление беззнаковое
Код

;numero uno
mov ax,-198
mov bl,22 
idiv bl
add al,9
;numero duo
mov ax,258h
cwd
mov bx,0FEB9h 
mov cx,bx
div bx
xchg ax,cx
xor dx,dx
mov si,0Ch
div si
add ax,cx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)