Ошибка при делении

Тема в разделе "WASM.WIN32", создана пользователем Llirik, 22 дек 2008.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Вот кусок кода:
    xor eax,eax
    xor esi,esi
    lea si,setpass
    lea bx,outpass
    passinc:
    mov ax,si
    cmp al,0
    je txtout
    div divi
    add ah,30h
    mov bl,ah
    inc si
    inc bx
    jmp passinc
    ...........
    divi db 16
    Олли стопориться div divi. Подскажите пожалуйста, что тут не так.
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    она подсказвает тебе что деление на 16 следует заменять сдвигом на 4 :))), а взятие остатка от деления на 4 маскированием с 0Fh ;))
    а вообще-то что значит стопорится ?
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Нужно edx перед делением инициализировать - для беззнаковых xor edx,edx, для знаковых cdq. Иначе из-за мусора в edx "рез-т" может не уместиться в eax\ax\al и получишь исключение
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    leo
    хм он же ax на байт делит ;) во всяком случае раз divi описано как db и не переделано через (d)word ptr то (e)dx должен быть ни при чём ;) Другое дело, что его ax shr 4 скорее всего не помещается в al - потому и то самое исключение, хотя я почему-то всегда был уверен что в этом случае просто ставится флаг переполнения overflow, а щас глянул в справочник и правда исключение такое же как при делении на 0 ;)
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    да, согласен, dx ни причем) но, почему не делится, я не могу понять) а если я в будущем захочу что-нибудь разделить...))
    вот на всякий случай исходник)
     
  6. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Код (Text):
    1.   mov       ax,si
    2.           cmp   al,0
    3.           je        txtout
    4.           div       divi
    ты делишь смещение setpass на 16
    Если ax перед делением будет больше FFF, то ты получишь исключение из-за переполнения..
    А вообще деление на 16 можно заменить командой shr ax, 4 (для беззнаковых)
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Llirik
    Тогда получится "причем" ;) Т.к. размер операнда нужно брать не от балды, а так чтобы в него заведомо уместился результат деления
     
  8. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Еще вопрос такой. В коде кое-где надо поставить квадратные скобки. Например:
    mov bl,[al]
    но при компиляции ml выдает ошибку: error A2031: must be index or base register. Что делать?
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    классно :)) я в полном восторге :))
    в твоём 16 разрядном режиме адрес можно задавать регистрами [si], [di], [bx], [bx+si], [bx+di], [bp+si], [bp+di], [bp+смещение] и все предидущими комбинациями + смещение.
    в 32 разрядном любым 32 разрядным регистром т.е. eax, ebx и пр. e... и любыми их комбинациями типа [eax+ecx*4+смещение]
    через al задавать адрес нельзя нигде ;)
     
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Спасибо, что просветлили меня))