2016-12-01 4 views
1
[org 0x0100] 
jmp start 
max1: 
max: mov si, 0      ;for loop counter 
     mov ax, [arr + si]    ;storing the first element of the array 
     mov bx, 2 
     mov cx, 0      
     mov dx, [arr + si + bx]   ;storing the second element 
     cmp dx, ax      ;comparing if dx is greater than ax 
     jg store1      ;if yes, jmp to store1 

     add si, 2      ;if not, inc the si 
     cmp si, 18      ;comparing for the loop counter 
     je exit1      ;if si=18, jmp to exit1 

     jmp max 

store1: mov ax, dx      ;if condition on line 13 is true, jmp here and move dx into ax 
     mov word[maxnum], ax   ;mov the new value of ax into maxnum 
     add si, 2      ;inc si 
     jmp max       ;go back to start of the loop 

exit1: pop dx 
     pop cx 
     pop bx 
     pop ax 
     pop si 
     ret 

start: mov si, 0 
     mov ax, 0 
     mov bx, 0 
     mov cx, 0 
     mov dx, 0 

     push si 
     push ax 
     push bx 
     push cx 
     push dx  
     call max1 

mov ax, 0x4c00 
int 0x21 

arr: dw 6,4,1,7,9,10,11,13,3,2 
maxnum: dw 0 

어셈블리 언어를 사용하고 있지 않습니다. 8086 어셈블리의 .COM- 파일에서 "Array check interrupted"오류가 발생했습니다. 배열의 최대 개수를 찾으려고 시도합니다.

내가 갖는 모든

배열 검사가

이 프로그램은 충돌에 계속

을 중단합니다.
이것은 무엇을 의미합니까? 어떻게 해결할 수 있습니까?
배열에 음수가 있으면 어떤 조건을 사용해야합니까?

이것은 서브 루틴없이 완벽하게 작동합니다.

+4

특히 다른 사람들에게 도움이되도록 코드를 주석으로 작성하십시오. 또한 디버거를 사용하여 프로그램을 단계별로 실행하고 자신이 잘못되어가는 부분을 확인하십시오. 즉, 반환 주소가 여전히 존재하기 때문에 'exit1'에서 레지스터를 팝핑 할 수 없습니다. 대신 'ret 10'을 사용하십시오. 'jg '가 서명되어 있으므로 음수로 작동합니다. 추신 : 왜 모든 레지스터를 밀어 넣을지 모르겠다. 그냥 저장하고 싶다면 (꼭 필요하지는 않지만) 'call max1'이후에 pop을 이동해야한다. – Jester

+0

@Jester 'ret 10'은 스택의 균형을 유지하지만 실제 레지스터 내용에는 아무런 도움이되지 않습니다. –

+0

@SepRoland 물론.그래서 나는 또한 당신이 단지 그것을 지키고 싶다면 (당신이 필요로하는 것이 아니라), 최대치를 올린 후 pop을 움직여야한다고 썼다. OP가 원했던 것이 명확하지 않았고,'ret 10 '이 stdcall 함수의 인자로 의도했다면 작동합니다. – Jester

답변

1

프로그램 max: 레이블이 잘못되어 발생하는 무한 루프가 발생하므로에 충돌이 발생합니다.
레이블 아래 아래에 SI 초기화가 필요합니다. 이제 또 다시 그것을 반복 :

max1: ... 
     mov si, 0    ;for loop counter 
max: mov ax, [arr + si] 

그 모든 push 's 및 pop의 생략 될 수있다. DOS로 즉시 빠져 나간 이후로 아무 것도 보존 할 필요가 없습니다.
당신이 서브 루틴의 시작이 push 년대를 이동 한 후 보존을 주장하는 경우 : 새 최대 값을 저장하는 경우에도

max1: push si 
     push ax 
     push bx 
     push cx 
     push dx 
     mov  si, 0 
     ... 

, 당신이 최종 상태를 확인해야합니다

store1: mov [maxnum], dx  ;mov the new value of dx into maxnum 
     add si, 2 
     cmp si, 18 
     jne max     ;go back to start of the loop 
exit1: pop dx 
     ... 

조금 깔끔하게 정리할 수 있습니다. CX 레지스터를 사용하지 않으므로 BX 레지스터가 필요하지 않습니다.

mov dx, [arr + si + 2] ;storing the second element 

에 의해

mov bx, 2 
mov cx, 0      
mov dx, [arr + si + bx]   ;storing the second element 

교체 그리고 배열의 음수가 있다면 사용하여 어떤 조건을해야 하는가?

귀하의 프로그램은 이미 jg store1을 작성한 이후 음수의 가능성을 처리합니다. (jg은 부호가있는 번호 용이고 ja은 부호없는 번호 용입니다.)