2016-10-14 2 views
0

나는이 코드를 emu8086에 작성했습니다.
에뮬레이션을 누르면 코드를 컴파일하는 데 오랜 시간이 걸리고 컴파일 될 때 이상하게 작동합니다. (main으로 점프하는 대신 max 등의 함수로 점프)emu8086 - 컴파일하는 데 오랜 시간이 걸리며 프로그램이 작동하지 않습니다.

"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

EMU에서 코드를 실행하고 시작하자 마자 메인 코드로 바로 넘어갔습니다. –

+0

내 PC에 문제가 있다고 생각합니다. – tomgrin10

+0

이렇게하십시오 : "최대"절차를 잘라 최종 "ret"아래에 붙여 넣으십시오. –

답변

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

당신이 절차 인수를 검색하는 잘못된 오프셋을 사용하고 있기 때문에 프로그램이 작동하지 않습니다! 명령 mov ax, [bp+num1] 스택을 실행
가 포함 된 (저급 주소의 상위 주소) 다음

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: 
:

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

이 이러한 수정 동일시 리드

두 번째 문제가 있습니다. 비교 결과가 보다 큰 경우 코드 아래에 빠지지만 결과가 이 아니고이되면 자체 동일 코드로 이동합니다! 그건 분명히 작동하지 않습니다. 해결 방법은 _num1_not_bigger_num2_ 라벨로 이동하는 것입니다.


mov [[bp+result_p]], ax 

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: 

나는 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 
관련 문제