我已经在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
答案 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