"переполнение"... С чего бы это???

Тема в разделе "WASM.WIN32", создана пользователем 3onder, 3 дек 2004.

  1. 3onder

    3onder New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2004
    Сообщения:
    9
    Почемуто выбрасывает исключение...

    ...

    metka_1:

    mov eax,0190h

    cmp eax,0Ah

    jl metka

    mov edx,0Ah

    div edx //?????????

    add ebx,edx

    shl ebx,8

    jmp metka_1

    metka_2:

    ...



    Исключение - на переполнение или неверное деление (на ноль)...

    Почему???
     
  2. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    потому как делится пара EDX:EAX на EDX

    в EDX:EAX лежит 0A00000190h

    EDX = 0Ah

    результат деления не помещается в EAX,

    в этом случае получается иключение.
     
  3. Mezonin

    Mezonin New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2004
    Сообщения:
    12
    Адрес:
    Russia
    IMXO это бесконечный цикл:



    mov eax,0190h

    cmp eax,0Ah

    jl metka ; здесь всегда false



    то есть между metka_1: ... jmp metka_1
     
  4. 3onder

    3onder New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2004
    Сообщения:
    9
    Что-то не совсем пойму... Почему пара-то?...
     
  5. 3onder

    3onder New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2004
    Сообщения:
    9




    Нет... смотри код...

    cmp eax,0Ah //eax=0190h, после цикла соответственно 28h,04h
     
  6. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62


    ну потому что intel :)

    При делении на 32-битный операнд делимое находится в

    объединении регистров edx и eax.

    Т.е. если edx = 55555555h

    a eax = 77777777h,

    то edx:eax=5555555577777777h (под ":" имеется ввиду объединение)

    Вот это то число (64-битное) и делится на 32-х битный операнд.

    Частное кладется в eax, остаток в edx,

    если частное в eax не помещается (у тебя не помещается один бит) - то исключение.
     
  7. Mezonin

    Mezonin New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2004
    Сообщения:
    12
    Адрес:
    Russia
    Я или слепой или цикл бесконечный :)
     
  8. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    Mezonin

    да, он бесконечный,

    но на первом же "обороте" получается исключение :)

    3onder

    может сточки



    metka_1:

    mov eax,0190h



    стоит поменять местами?
     
  9. 3onder

    3onder New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2004
    Сообщения:
    9
    Sorry... обшибся строчками... но загвоздка не в этом...
     
  10. Mezonin

    Mezonin New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2004
    Сообщения:
    12
    Адрес:
    Russia
    Ага, в контексте остался код в ring-0: измененный IDT и fault 0. Признаю свою близорукость
     
  11. 3onder

    3onder New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2004
    Сообщения:
    9
    Заменяем edx на dx и............ безрезультатно...
     
  12. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62


    по моему в этом случае должны делиться



    dx:ax на dx :)))

    хотя не уверен :)
     
  13. Mezonin

    Mezonin New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2004
    Сообщения:
    12
    Адрес:
    Russia
    Теперь пара dx:ax, причем старшая часть делимого в dx, а частное в ax и оно опять не помещается. Ты лучше скажи, что на что нужно поделить, а то вода льется, а результат не меняется
     
  14. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    div dx

    была еще в 16-ти разрядных процах,

    а вот Eax'а там по понятным причинам не было,

    поэтому делимое должно быть в dx:ax
     
  15. Mezonin

    Mezonin New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2004
    Сообщения:
    12
    Адрес:
    Russia
    dx:ax(A0190h) / dx(Ah) => 10028 - целое, которое должно жить в ax, но не влезает
     
  16. 3onder

    3onder New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2004
    Сообщения:
    9
    Эот одна из вариаций перевода числа из hex в ascii... делим eax на 0Ah (то биш на 10)... Выходит в любом случае регистры объединяются... sorry, не знал...
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Вобще-то в edx помещается остаток от деления, поэтому перед делением он должен быть обнулён и трогать его не нужно, иначе будет исключение.
     
  18. B_108

    B_108 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    62
    на сколько я понимаю начало должно быть таким


    Код (Text):
    1.  
    2. mov eax,0190h
    3. metka_1:
    4. cmp eax,0Ah
    5. jl metka
    6. cdq
    7. mov ecx,0Ah
    8. div ecx //?????????
    9.  
     
  19. 3onder

    3onder New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2004
    Сообщения:
    9
    Asterix

    Необязательно...
     
  20. Mezonin

    Mezonin New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2004
    Сообщения:
    12
    Адрес:
    Russia
    Может



    mov eax,A0190h

    mov ecx,0Ah

    metka_1:

    cmp eax,0Ah

    jl metka

    xor edx, edx

    div ecx //?????????

    add ebx,edx

    shl ebx,8

    jmp metka_1

    metka_2:

    ...

    должно работать