2016-10-14 1 views
0

Ich habe diesen Code in emu8086 geschrieben.
Wenn ich emulieren, dauert es sehr lange, den Code zu kompilieren und wenn es kompiliert wird, funktioniert es merkwürdig falsch. (statt zum Haupt springen springt es auf die Funktion Max etc.)emu8086 - Kompilieren dauert eine sehr lange Zeit und das Programm funktioniert nicht

Und bevor Sie sagen, es könnte ein Problem mit "magshimim.inc", gibt es nicht, es funktioniert in anderen Dateien.

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

Ich habe gerade Ihren Code in meiner EMU und es sprang zum Haupt, sobald es begann. –

+0

Ich denke, es ist ein Problem in meinem PC. – tomgrin10

+0

Tun Sie dies: Schneiden Sie den Vorgang "max" und fügen Sie es unter dem endgültigen "ret". –

Antwort

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

Ihr Programm funktioniert nicht, weil Sie die falschen Offsets verwenden die Verfahren Argumente abzurufen!
Wenn der Befehl mov ax, [bp+num1] den Stapel ausgeführt wird, enthält die folgende (von unteren Adressen zu höheren Adressen):

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

Dies führt zu diesem korrigierten Equates:

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: 

Hier ist ein zweites Problem. Wenn das Ergebnis des Vergleichs größer als ist, fallen Sie durch den Code unter, aber wenn das Ergebnis nicht größer als ist, springen Sie zum selben Code! Das kann eindeutig nicht funktionieren. Die Lösung besteht darin, zur Bezeichnung _num1_not_bigger_num2_ zu springen.

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 

Ich weiß nicht, warum EMU8086 diese redundanten eckigen Klammern akzeptieren würde. Am besten verwenden Sie einfach ein einzelnes Paar [] bei der Adressierung von Speicher.


Um Ihr Leben einfacher zu machen, sollten Sie konsistent sein, wenn Sie Ihre Variablen benennen.
Im Haupt Teil haben Sie in dieser Reihenfolge:

num1, num0, offset result 

aber in dem proc Sie haben in dieser Reihenfolge:

num2, num1, result_p 

Dies ist sehr verwirrend und fehleranfällig!


include magshimim.inc 
org 100h 
jmp main 

Sie haben gesagt, dass es kein Problem mit dieser Datei enthalten, aber ich würde Ihnen raten, um die unter dem jmp main Anweisung enthalten zu setzen. Die org 100h teilt mit, dass Sie für eine .com-Datei kompilieren und die jmp main muss die erste Anweisung auf dem Ausführungspfad sein.Sie möchten nicht, dass Anweisungen aus der Include-Datei vor diese wichtige jmp main kommen.

org 100h 
jmp main 
include magshimim.inc 
Verwandte Themen