2013-05-06 3 views
0

Привет У меня есть вопрос о сборке x86Доступ место нарушение письма в сборке x86

это мой код

INCLUDE Irvine32.inc 
.data 
day WORD 0 
month WORD 0 
year WORD 0 


prompt1 BYTE "enter month: ",0 
prompt2 BYTE "enter day: ",0 
prompt3 BYTE "enter an year: ",0 
prompt4 BYTE " the day of the week is ",0 

.code 
main PROC 

mov edx, OFFSET prompt1 
call writeString 
mov edx, 0 
call readInt 
call crlf 
mov month, ax 

mov eax, 0 
mov edx, OFFSET prompt2 
call writeString 
mov edx, 0 
call readInt 
call crlf 
mov day, ax 


mov eax, 0 
mov edx, OFFSET prompt3 
call writeString 
mov edx, 0 
call readInt 
call crlf 
mov year, ax 



mov eax, 0 
mov ebx, 0 
mov ax, 14 
sub ax, month 
mov bx, 12 
div bx 
mov si, ax ;; a store in si 
sub year, ax 
mov di, year ;; y store in di 
mov ax, ax 
mul bx 
add ax, month 
mov cx, 2 
sub ax, cx 
mov ecx, 0 
mov cx, ax ;; m store in cx 

mov eax, 0 
mov ebx, 0 
mov esp, 0 
mov ebp, 0 

add day, di 
mov ax, di 
mov bx, 4 
div bx 
add day, ax 
mov sp, day 
mov eax, 0 
mov ebx, 0 
mov ax, di 
mov bl, 100 
div bl 
mov ah, 0 
sub day, ax 


mov eax, 0 
mov ebx, 0 
mov dx, 0 
mov ax, di 
mov bx, 400 
div bx 
add day, ax 
mov bp, day ;; temporary holder for d value up to y/400 calculation 

mov eax, 0 
mov ebx, 0 
mov ax, 31 
mul cx 
mov bx, 12 
div bx 
add bp, ax 
mov al, 7 
div al 




    exit 
main ENDP 

END main 

Я м отладки этот код кажется, что все работает, соответственно, пока не дойдете до выхода тогда визуальная студия дала мне эту ошибку «Доступ к записи о нарушении местоположения 0x000009DF», я немного смутил, что он дал мне эту ошибку в конце кода, почему было бы нарушение доступа в команде выхода

это мой ввод

enter month: 4 

enter day: 15 

enter an year: 2013 

В конце программы я получаю значение регистра аль = 1, которая является то, что я хочу , так что я не знаю, почему он дал мне эту ошибку, когда нет другой ошибки в коде могут кто-нибудь поможет? спасибо заранее

+0

Я нашел ошибку именно эта линия мов зр, день, я не ставил особ к нулю до этого вот почему нарушение доступа к программе шоу – bluebk

ответ

0

Я нашел ошибку именно эта линия mov sp, day, я не ставила особ к нулю до этого вот почему нарушение прав доступа шоу программы

0

Для доступа к местоположению барана, пожалуйста, используйте скобки, потому что его легче читать.

mov [year], ax 

mov di, [year] 

И лучше, чтобы предотвратить missunderstanding код, потому что если мы используем

mov di, year 

может быть missenterprete с

mov di, offset year 

, потому что если мы будем использовать NASM вместо MASM , то эта инструкция не требует объявления смещения для получения адреса смещения. NASM никогда не интерпретирует инструкцию

mov di, year 

как доступ к местоположению плунжера.

.....

Normaly stackpointer (E) SP предназначен только для использования нашего стека. Если мы используем инструкцию вызова, то адрес вызывающего абонента будет помещен в стек, поэтому, если мы используем инструкцию ret в конце этой подпрограммы, тогда адрес будет выведен из стека, и будет установлен программный счетчик к следующей инструкции после команды вызова.

Но если мы не будем использовать стек на мгновение, мы сможем сохранить адрес стека-указателя на место плунжера для свободного использования также указателя стека. В конце мы можем вернуть старый адрес из местоположения плунжера в указатель стека.

Подсказка: используя (E) SP или E (BP) внутри инструкции в качестве адресного регистра, стандартным сегментным регистром является «SS», а не «DS».

mov [bp], ax ; SS:BP 
mov [sp], ax ; SS:SP 
mov ax, [bp] ; SS:BP 
mov ax, [sp] ; SS:SP 

mov [si], ax ; DS:SI 
mov [di], ax ; DS:DI 
mov [bx], ax ; DS:BX 
mov ax, [si] ; DS:SI 
mov ax, [di] ; DS:DI 
mov ax, [bx] ; DS:BX 

..

Я не знаю, почему появляется это нарушение прав доступа. Но, я не думаю, что это может быть исправлено с установкой ESP в ноль перед использованием SP. Я думаю, что лучше сохранить адрес указателя стека раньше и вернуть этот адрес в конце.

Dirk