您好我有关于程序集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的值,这就是我想要的 所以我不知道为什么在代码中没有其他错误时它给了我这个错误 有人可以帮忙吗? 提前谢谢
答案 0 :(得分:0)
要访问ram位置,请使用括号,因为它更容易阅读。
mov [year], ax
mov di, [year]
最好是防止错误理解代码,因为如果我们使用
mov di, year
可能是错误预测
mov di, offset year
因为如果我们使用NASM而不是MASM,那么这条指令不需要偏移声明来获取偏移地址。 NASM从不解释
的指令mov di, year
作为对ram位置的访问。
.....
通常,stackpointer(E)SP仅用于使用我们的堆栈。 如果我们使用call instruckton,那么调用者的地址将被推送到Stack,所以如果我们在这个子例程的末尾使用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的地址,然后在最后得到这个地址。
德克
答案 1 :(得分:-3)
我发现了错误。这是这一行:
mov sp, day
在此之前我没有将esp
设置为零,这就是程序显示访问冲突的原因。