emu8086 - 编译需要很长时间,程序不起作用

时间:2016-10-14 18:06:01

标签: assembly x86-16 emu8086

我已经在emu8086中编写了这段代码 当我按下模拟时,编译代码需要很长时间,编译代码时,它的工作原理很奇怪。 (而不是跳到主要它跳转到函数max等。)

在您说" magshimim.inc"之前可能存在问题之前,没有,它可以在其他文件中使用。

include magshimim.inc

org  100h

jmp main

;--------------------------------------------;
; Functions
;--------------------------------------------;

; This function gets 2 numbers and an address.
; It stores the biggest number in the address.
; Input:
;   push result_address
;   push num1
;   push num2
PROC max

    ; store offset of parameters relative to bp
    result_p    equ     6
    num1        equ     4
    num2        equ     2

    push    bp      ; store the previous stack frame
    mov     bp, sp  ; create new stack frame
    push    ax      ; store ax

    mov ax, [bp+num1]
    cmp ax, [bp+num2]
    jng num1_bigger_num2

    num1_bigger_num2:
        mov ax, [bp+num1]
        mov [[bp+result_p]], ax
        jmp skip1

    num1_not_bigger_num2:
        mov ax, [bp+num2]
        mov [[bp+result_p]], ax

    skip1:

    pop     ax      ; re-store ax
    mov     sp, bp  ; close stack frame
    pop     bp      ; re-store the previous stack frame

ret
ENDP


;--------------------------------------------;
; Global variables
;--------------------------------------------;

    result      dw  0
    num0        dw  2
    num1        dw  10

;--------------------------------------------;
; Main
;--------------------------------------------;

main:  

    push offset result
    push num0
    push num1
    call max
    add sp, 6

    mov ax, result
    call print_num

    mov ah, 0
    int 16h

ret

1 个答案:

答案 0 :(得分:1)

; store offset of parameters relative to bp
result_p    equ     6
num1        equ     4
num2        equ     2

您的程序不起作用,因为您使用错误的偏移来检索过程参数!
当执行指令mov ax, [bp+num1]时,堆栈包含以下内容(从较低地址到较高地址):

Old AX
      Old BP
      ^     Return Address
      |                   Value 10
      |                           Value 2
Current BP points to here!               Offset result
      |----> +2
      |------------------> +4   
      |--------------------------> +6
      |---------------------------------> +8

这导致这些更正等同于:

result_p    equ     8
num1        equ     6
num2        equ     4
 mov ax, [bp+num1]
 cmp ax, [bp+num2]
 jng num1_bigger_num2
num1_bigger_num2:

这是第二个问题。如果比较的结果大于,则会在下面的代码中显示,但当结果不大于时,您会跳转到自相同的代码!这显然无法奏效。解决方案是跳转到_num1_not_bigger_num2_标签。

    mov ax, [bp+num1]
    cmp ax, [bp+num2]
    jng num1_not_bigger_num2    <-- corrected
num1_bigger_num2:
    mov ax, [bp+num1]
    mov [bp+result_p], ax       <-- corrected
    jmp skip1
num1_not_bigger_num2:
mov [[bp+result_p]], ax

我不知道为什么EMU8086会接受这些冗余的方括号。最好只在处理内存时使用一对[]

为了让您的生活更轻松,在命名变量时应保持一致 在 main 部分,您有顺序:

num1, num0, offset result

但是在 proc 中你有顺序:

num2, num1, result_p

这非常令人困惑且容易出错!

include magshimim.inc
org  100h
jmp main

您已经说过这个包含文件没有问题,但我建议您将包含在jmp main指令下面。 org 100h告诉您正在编译.COM文件,jmp main必须是执行路径上的第一条指令。您不希望包含文件中的任何说明出现在此重要jmp main之前。

org  100h
jmp main
include magshimim.inc