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

Discussion in 'WASM.WIN32' started by Llirik, Dec 22, 2008.

  1. Llirik

    Llirik Member

    Blog Posts:
    0
    Вот кусок кода:
    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

    Blog Posts:
    0
    она подсказвает тебе что деление на 16 следует заменять сдвигом на 4 :))), а взятие остатка от деления на 4 маскированием с 0Fh ;))
    а вообще-то что значит стопорится ?
     
  3. leo

    leo Active Member

    Blog Posts:
    0
    Нужно edx перед делением инициализировать - для беззнаковых xor edx,edx, для знаковых cdq. Иначе из-за мусора в edx "рез-т" может не уместиться в eax\ax\al и получишь исключение
     
  4. Y_Mur

    Y_Mur Active Member

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

    Llirik Member

    Blog Posts:
    0
    да, согласен, dx ни причем) но, почему не делится, я не могу понять) а если я в будущем захочу что-нибудь разделить...))
    вот на всякий случай исходник)
     
  6. scf

    scf Member

    Blog Posts:
    0
    Code (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

    Blog Posts:
    0
    Llirik
    Тогда получится "причем" ;) Т.к. размер операнда нужно брать не от балды, а так чтобы в него заведомо уместился результат деления
     
  8. Llirik

    Llirik Member

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

    Y_Mur Active Member

    Blog Posts:
    0
    классно :)) я в полном восторге :))
    в твоём 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

    Blog Posts:
    0
    Спасибо, что просветлили меня))