我当前在行上遇到“抛出异常”错误
mov [ebx], eax
我找不到解决方案,因为他们所有人都使用完全相同的代码,并且对他们有用。
这是我讲义的精确副本,似乎对我之外的其他人都有用。
TITLE Program Template (template.asm)
; Author:
; Last Modified:
; OSU email address:
; Course number/section:
; Project Number: Due Date:
; Description:
INCLUDE Irvine32.inc
.data
intro BYTE "Fun with Arrays! by ", 0
instruction BYTE "This program generates random numbers in the range [100 .. 999], displays the original list, sorts the list, and calculates the median value. Finally, it displays the list sorted in descending order.", 0
request DWORD ?
ask_user BYTE "How many numbers should be generated? [10 ... 200]: ", 0
.code
main PROC
;call randomize
call introduction
push OFFSET request
call getData
exit ; exit to operating system
main ENDP
introduction PROC
mov edx, OFFSET intro
call WriteString
call CrLf
mov edx, OFFSET instruction
call WriteString
call CrLf
introduction ENDP
getData PROC
push ebp
mov ebp, esp
mov edx, OFFSET ask_user
call WriteString
call ReadInt
mov ebx, [ebp+8]
mov [ebx], eax
pop ebp
ret 4
getData ENDP
END main
答案 0 :(得分:2)
introduction
缺少ret
执行从introduction
的最后一条指令到getData
的第一条指令。机器代码的执行始终在当前指令之后继续到内存中的下一个地址(除非您使用调用/退出/分支);标签和proc
声明只是标记。 (Why is no value returned if a function does not explicity use 'ret')
在堆栈上没有有效指针的情况下会发生这种情况。 (因为main
首先呼叫introduction
,而没有先输入地址。)
您可以通过单步执行代码在调试器中查找此类错误;失败而不是重返主流应该引起您的注意!
或者使用调试器的backtrace函数查看调用的来源:您会看到您是从getData
而不是call introduction
在call getData
到达此行的。
我建议对getData
中的临时目录使用呼叫密集(又称为volatile)寄存器。 (EAX,ECX或EDX)。 ebx
通常是调用保留的,因此main
和main的调用者希望函数返回时它们的EBX值仍然存在。 (但是您的main
不会返回或使用EBX,因此没有实际的错误,只是自定义调用约定。)