簡體   English   中英

程序集x86中的訪問沖突寫入位置

[英]Access violation writing location in assembly 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

我正在調試該代碼,一切似乎都可以正常工作,直到我到達退出指令,然后visual studio才給我這個錯誤“訪問沖突寫入位置0x000009DF”,我有點困惑,它在代碼末尾給了我這個錯誤,為什么在退出命令時會出現訪問沖突

這是我的意見

enter month: 4

enter day: 15

enter an year: 2013

在程序結束時,我得到了寄存器al = 1的值,這是我想要的,所以我不知道為什么在代碼中沒有其他錯誤時有人給我這個錯誤? 預先感謝

要訪問ram位置,請使用方括號,因為它更易於閱讀。

 mov [year], ax

 mov di, [year]

最好避免誤解代碼,因為如果我們使用

mov di, year

它可以與

mov di, offset year

因為如果我們使用NASM而不是MASM,則此指令不需要偏移聲明即可獲取偏移地址。 NASM從不解釋

mov di, year

作為ram位置的附件。

.....

通常,堆棧指針(E)SP僅用於使用我們的堆棧。 如果使用call instruckton,則將調用者的地址壓入堆棧,因此,如果在此子例程的末尾使用ret instrucktion,則將從堆棧中彈出該地址,並將programmcounter設置為調用指令之后的下一條指令。

但是,如果我們暫時不使用堆棧,則可以將堆棧指針的地址保存到ram位置,以便也可以自由使用堆棧指針。 最后,我們可以將舊地址從ram位置取回堆棧指針。

提示:在指令內部使用(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

..

我不知道為什么會出現這種訪問沖突。 但是,我不認為可以在使用SP之前將ESP設置為零來解決此問題。 我認為最好先保存stackpointer的地址,然后在最后返回該地址。

短劍

我發現了錯誤。 就是這一行:

mov sp, day

在此之前,我沒有將esp設置為零,這就是程序顯示訪問沖突的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM