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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2010, 10:25   #1
nintser
Новичок
Джуниор
 
Регистрация: 15.11.2010
Сообщений: 2
По умолчанию Вызов процедуры и access violation

Здравствуйте. Есть проблема при вызове процедуры в небольшой задачке. Суть задачи состоит в том что она должна при помощи процедуры считать наименьшее общее кратное четырех чисел.

Код:
.386 
.model flat, stdcall 
option casemap:none 
include windows.inc 
include user32.inc 
include kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
BSIZE equ 128 
.data 
ifmt BYTE "%d; %d; %d; %d, NOD=%d NOK=%d",0 
buf BYTE BSIZE dup(?)
n1 DWORD 15 
n2 DWORD 30
n3 DWORD 75
n4 DWORD 45
nod DWORD ?
nok DWORD ? 
stdout DWORD ? 
cWritten DWORD ? 
.code 
start: 		
    xor	   eax, eax
    xor	   ebx, ebx
    mov     EAX, n1		  	
    mov     EBX, n2		  
    call	   nod_nok
    mov	   ebx, n3
    CALL	   nod_nok
    mov	   ebx, n4
    CALL	   nod_nok
  invoke GetStdHandle, STD_OUTPUT_HANDLE 
  mov stdout,eax 
  invoke wsprintf, ADDR buf, ADDR ifmt, n1, n2, n3, n4, nod, nok
  invoke WriteConsoleA, stdout, ADDR buf, BSIZE, ADDR cWritten, NULL 
  invoke ExitProcess, 0 
  
  nod_nok proc	FAR
  ; процедура нахождения нод, а потом нок
  L1:                       
    push	   eax
    push	   ebx
    cmp     EBX, 0        
    je        L2             
    xor 	   edx, edx      
    div       EBX          
    mov     EAX, EBX      
    mov     EBX, EDX     
    jmp      L1            
  L2:                     
	mov 	nod, eax
	pop	ebx
	pop	eax	
	mul	ebx
	mov	ebx, nod
	div	ebx
	mov 	nok, eax
	ret 
	nod_nok endp 
end start
В отладчике OllyDbg v1.09 появляется следующая картина:


в чем причина? и что вообще здесь не так?
nintser вне форума Ответить с цитированием
Старый 15.11.2010, 11:28   #2
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

А куда она у вас возвращается? Если на шесть команд PUSH в процедуре выполняется всего две команды POP. Адрес возврата неверен.
Пошагово пробовали выполнять?
Стек (откуда берется адрес возврата) на вашем скрине прекрасно просматривается.

Последний раз редактировалось Vergo; 15.11.2010 в 11:39.
Vergo вне форума Ответить с цитированием
Старый 15.11.2010, 14:27   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

nintser
Для задач под Win32 не используйте far процедур, для flat model все процедуры NEAR
Mikl___ вне форума Ответить с цитированием
Старый 15.11.2010, 20:57   #4
nintser
Новичок
Джуниор
 
Регистрация: 15.11.2010
Сообщений: 2
По умолчанию

Vergo, спасибо за подсказку, согласен, сам ступил, пуши засунул в цикл
переместил из чуть выше и все прекрасно заработало!
Всем спасибо!
nintser вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access violation в TFileStream RoadTrain Общие вопросы Delphi 5 17.10.2010 10:51
ListView и Access violation Ronder Помощь студентам 6 22.08.2009 11:19
Access Violation SunKnight Общие вопросы Delphi 2 05.06.2008 16:46
Access violation at address.. RegentM Общие вопросы Delphi 4 01.11.2007 03:46
Access Violation Carbon Общие вопросы Delphi 12 18.09.2007 19:55