Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2018, 06:59   #1
Fillimon
Пользователь
 
Регистрация: 16.04.2018
Сообщений: 13
По умолчанию Не работает процедура (ассемблер, тасм5.0, досбокс)

Всем привет, написал процедуру на ассемблере, которая считает НОК 4-х чисел, но когда программа запускается, досбокс зависает и вылетает, помогите понять, что я делаю не так?
P.S. до этого считываю 4 числа и кладу их в стек, числа считываются верно, брал процедуру с этого форума.
Код:
Labab proc 
 pop ax   
  mov cx,3 ;счётчик цикла = 3 
  cycl: 
  pop bx 
  push cx ; прячем счётчик в стек до самого конца 
  push ax 
  push bx 
  m2: 
   
  div bx ; делаем алгоритм Евклида для нахождения НОД 
  test dx,dx ; если остаток = 0, выходим на м3, иначе переназначаем переменные и идём в м2 
  jz m3 
  mov ax, bx 
  mov bx, dx 
 jmp m2 
  m3: 
  mov cx,bx 
  pop ax 
  pop bx 
  mul bx 
   
  div cx ; в ах должен быть НОК
  pop cx ; достаём счётчик 
  loop cycl ; идём на метку цикл 
  ret 
Labab endp

Последний раз редактировалось Fillimon; 14.05.2018 в 07:02.
Fillimon вне форума Ответить с цитированием
Старый 14.05.2018, 07:23   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

поставь везде перед div - xor dx,dx
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 14.05.2018, 15:29   #3
Fillimon
Пользователь
 
Регистрация: 16.04.2018
Сообщений: 13
По умолчанию

Не помогло...
Fillimon вне форума Ответить с цитированием
Старый 14.05.2018, 16:43   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Fillimon Посмотреть сообщение
P.S. до этого считываю 4 числа и кладу их в стек
если ты в стек положил 4 слова,
то вызов процедуры добавит туда ещё и 2-байтный адрес возврата - итого 5 слов.
Код:
; сейчас в стеке:
   аргумент(3)
   аргумент(2)
   аргумент(1)
   аргумент(0)
   адрес возврата
значит аргументы нужно снимать со-стека, пропустив адрес возврата.
для этого имеется такая конструкция (адресация через BP):
Код:
Labab proc 
       mov   bp,sp
       mov   ax,[bp+2]     ; = pop ax (на входе в процедуру)
....
       retn  8             ; очистить стек от параметров (4 слова = 8)
Labab endp
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 14.05.2018, 16:50   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

..или можно снять на-время адрес возврата, а на выходе опять его туда положить:
Код:
Labab proc 
       pop   si     ; адрес возврата в SI
       pop   ax     ; на входе в процедуру
....
       push  si     ; кладём на место возврат
       retn  8      ; выйти к SI, и очистить стек от параметров
Labab endp
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 14.05.2018, 17:10   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Fillimon Посмотреть сообщение
Код:
Labab proc 
 pop ax
судя по ret в конце процедуры, Вы вызываете Labab через call ?
Код:
        call Labab
тогда будут два последствия
1) первый pop ax заберёт из стека не число, которое Вы туда положили, а адрес возврата из процедуры (его туда call положил)
2) ваш ret возьмёт из стека не настоящий адрес возврата из процедуры - а "левое" число и выполнение кода будет передано неизвестно куда.


p.s Рекомендую использовать DOS отладчик. Например, turbo debugger...

[ДОБАВЛЕНО]
p.p.s. извините, я сильно опоздал с ответом....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2018, 17:19   #7
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Например, turbo debugger
..или "AVPUtil" от лаборатории Касперского,
который красиво отображает содержимое стека (RA - Return Address).
вот как он видит такой код:
Код:
start:  push  1 2 3 4     ; кладём аргументы в стек
        call  @01         ; зовём функцию
        ret               ; выход из программы
;-------
@01:    mov   ah,9        ; функция!
        mov   dx,m1
        int   21h
        retn  8           ; выход из функции, с очисткой стека.
Изображения
Тип файла: png util.png (15.6 Кб, 33 просмотров)
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 14.05.2018, 17:27   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от R71MT Посмотреть сообщение
или "AVPUtil" от лаборатории Касперского,
Красиво.
Не сталкивался раньше.
А если не сложно, выложите архив с ним сюда, на форум.
Думаю, что будет полезно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.05.2018, 17:39   #9
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
выложите архив с ним сюда, на форум.
..без проблем. у него там много возможностей в меню сидят:
http://old-dos.ru/index.php?page=fil...o=show&id=5580
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 14.05.2018, 18:17   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

спасибо. скачал. пусть будет
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не работает процедура pavelmorash12 Общие вопросы Delphi 2 19.04.2017 22:20
не работает процедура сумма pascal1992 Помощь студентам 0 05.05.2013 23:03
Не работает процедура Golovastik SQL, базы данных 2 22.11.2009 14:22
Процедура не работает Михаил Юрьевич Общие вопросы Delphi 4 03.06.2008 07:22
не работает хранимая процедура yulia БД в Delphi 11 28.05.2007 19:00