안녕하세요 저는 두 개의 숫자가 emu8086의 화면에서 입력 된 절차를 만들고 싶습니다. 절차가 완료된 후에도 계속 프로그램을 좋아합니다. 나는 프로 시저 sumUp을 호출하고 절차를 완료 한 후 프로그램을 완료하면 좋은 결과를 얻습니다. 난 당신에게 프로그램이 코드를 호출 sumUp 우는 계속 대단히 감사합니다절차가 완료된 후에도 프로그램이 계속되지 않는 이유는 무엇입니까 (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.
'ret' 명령은 프로 시저에서 복귀하지 않습니다. 스택에서 리턴 주소를 팝핑하고 거기서 점프합니다. 'sumUp'의 시작 부분에'pop bx'를 써서 잃어 버렸고 반환 주소를'bx'에 적재하고 다시 복원하지 않았기 때문에'ret'는 스택에서 완전히 다른 값으로 점프 할 것입니다. CPU는 프로 시저에 대해 아무 것도 이해하지 못한다.'call/ret' 명령은 스택 메모리를 사용하여이를 모방하지만 스택 구조를 올바로 유지하는 한 작동한다. – Ped7g
그리고 스택 - 인 호출 규칙에서 인수를로드하는 더 일반적인 방법은 함수 프롤로그를 사용하는 것입니다 :'push bp''mov bp, sp' ... proc 본문과 함께 계속 ...'mov ax, [bp +4]; arg1'' add ax, [bp + 6]; arg2'' 서브 액스, 2 * '0''' mova, ax' 그리고 스택을 복원하는 에필로그로 끝나는'movsp, bp; 만약 sp가 정확하다면'pop bp'' ret' .. 아니면'ret by '후에 스택에서 두 개의 인자 (4B)를 제거하기 위해 "proc로 제거 된 arg"를 시뮬레이트 할 수 있습니다. – Ped7g