Hallo ich möchte Prozedur, die Summe zwei Zahlen aus dem Bildschirm in emu8086 eingegeben, ich mag das Programm, um nach dem Vorgang zu beenden Ich rufe die Prozedur sumUp und es tut es gut, aber nach ret in der Prozedur das Programm beendet .. ich möchte das Programm unten den Coderuf SUMUP weiterhin Danke sehr vielWarum wird das Programm nicht fortgesetzt, nachdem der Vorgang abgeschlossen ist (emu8086)?
; multi-segment executable file template.
data segment
message1 db "Enter 2 number..$"
num1 db 0
num2 db 0
suma dw 0
ends
stack segment
dw 128 dup(0)
ends
code segment
sumUp proc
pop bx
pop ax
sub ax,30h
mov suma,ax
pop ax
sub ax,30h
add suma,ax
ret
sumUP endp
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
; add your code here
lea dx,message1
mov ah,09h
int 21h
mov ah,1h
int 21h
mov num1,al
mov ah,1h
int 21h
mov num2,al
mov dh,0d
mov dl,num1
push dx
mov dh,0d
mov dl,num2
push dx
call sumUp
//I want the program to continue here after procedure is finished
**mov cx,0**
ends
end start ; set entry point and stop the assembler.
Die 'ret'-Anweisung kehrt nicht aus der Prozedur zurück. Er öffnet die Rücksprungadresse vom Stack und springt dorthin. Du hast es verloren, indem du 'pop bx' zu Beginn von' sumUp' gemacht hast, die Return-Adresse in 'bx' geladen hast, und du hast es nicht zurückgespeichert, so dass das' ret' komplett andere Werte aus dem Stack herausspringt. Die CPU versteht nichts über Prozeduren, die 'call/ret'-Befehle ahmen dies durch Verwendung von Stapelspeicher nach, aber sie funktionieren nur so lange, wie Sie die Struktur des Stapels korrekt halten. – Ped7g
Und der gebräuchlichere Weg, Argumente in Pass-in-Stack-Aufrufkonventionen zu laden, ist die Funktion prolog: 'push bp'' mov bp, sp' ... weiter mit proc body ... 'mov ax, [bp +4]; arg1' 'add ax, [bp + 6]; arg2'' Unteraxt, 2 * '0'' 'mov [suma], ax' und endend mit Epilog, der den Stack wiederherstellt' mov sp, bp; kann weggelassen werden, wenn sp richtig ist "pop bp" 'ret' .. oder um deine" args "zu simulieren, die durch proc" ret 4 "entfernt wurden, um die zwei Argumente (4B) nach" ret "zu entfernen. – Ped7g