0

我已经在emu8086中编写了这段代码。
当我按下 emulate 时,编译代码需要很长时间,并且编译时它的工作异常不正确。(而不是跳转到 main 它跳转到函数 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
4

1 回答 1

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 会接受这些多余的方括号。寻址内存时最好只使用一对 [] 。


为了让您的生活更轻松,您应该在命名变量时保持一致。
主要部分中,您需要:

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
于 2016-10-19T10:57:15.177 回答