使用指向函数的指针arg会引发异常

时间:2019-05-25 17:03:13

标签: exception assembly x86 masm masm32

我当前在行上遇到“抛出异常”错误

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

1 个答案:

答案 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 introductioncall getData到达此行的。


我建议对getData中的临时目录使用呼叫密集(又称为volatile)寄存器。 (EAX,ECX或EDX)。 ebx通常是调用保留的,因此main和main的调用者希望函数返回时它们的EBX值仍然存在。 (但是您的main不会返回或使用EBX,因此没有实际的错误,只是自定义调用约定。)