![](/img/trans.png)
[英]Error in assembly x86: Access violation writing location 0x0081D45C
[英]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.