[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"오류가 발생했습니다. 배열의 최대 개수를 찾으려고 시도합니다.
내가 갖는 모든
은배열 검사가
이 프로그램은 충돌에 계속
을 중단합니다.
이것은 무엇을 의미합니까? 어떻게 해결할 수 있습니까?
배열에 음수가 있으면 어떤 조건을 사용해야합니까?
이것은 서브 루틴없이 완벽하게 작동합니다.
특히 다른 사람들에게 도움이되도록 코드를 주석으로 작성하십시오. 또한 디버거를 사용하여 프로그램을 단계별로 실행하고 자신이 잘못되어가는 부분을 확인하십시오. 즉, 반환 주소가 여전히 존재하기 때문에 'exit1'에서 레지스터를 팝핑 할 수 없습니다. 대신 'ret 10'을 사용하십시오. 'jg '가 서명되어 있으므로 음수로 작동합니다. 추신 : 왜 모든 레지스터를 밀어 넣을지 모르겠다. 그냥 저장하고 싶다면 (꼭 필요하지는 않지만) 'call max1'이후에 pop을 이동해야한다. – Jester
@Jester 'ret 10'은 스택의 균형을 유지하지만 실제 레지스터 내용에는 아무런 도움이되지 않습니다. –
@SepRoland 물론.그래서 나는 또한 당신이 단지 그것을 지키고 싶다면 (당신이 필요로하는 것이 아니라), 최대치를 올린 후 pop을 움직여야한다고 썼다. OP가 원했던 것이 명확하지 않았고,'ret 10 '이 stdcall 함수의 인자로 의도했다면 작동합니다. – Jester