김해시는 행정구역상 '시'입니다. 과거에는 김해군이었으나, 1995년 도농복합시로 승격되면서 김해시가 되었습니다. 따라서 현재 김해는 '시'입니다.
어셈블리 언어에서 jne와 jmp는 프로그램의 흐름을 제어하는 중요한 명령어입니다. 각각의 기능과 사용법을 자세히 알아보겠습니다.
jne (Jump if Not Equal)
jne 명령어는 'Jump if Not Equal'의 약자로, 두 피연산자의 값이 같지 않을 때 특정 주소로 점프하는 조건 분기 명령어입니다. 주로 비교 명령어(cmp)와 함께 사용됩니다. cmp 명령어는 두 피연산자를 비교한 후, 그 결과에 따라 플래그 레지스터(Flag Register)의 특정 비트들을 설정합니다. jne는 이 플래그 레지스터의 'Zero Flag (ZF)' 비트가 0일 때 (즉, 비교 결과가 같지 않을 때) 점프를 수행합니다.
동작 방식:
cmp명령어로 두 값을 비교합니다.cmp명령어는 비교 결과를 바탕으로 플래그 레지스터를 업데이트합니다.jne명령어는 Zero Flag (ZF)가 0인지 확인합니다.- ZF가 0이면,
jne명령어 뒤에 오는 레이블(주소)로 프로그램 실행 흐름을 이동시킵니다. - ZF가 1이면 (두 값이 같으면),
jne명령어 다음의 명령어를 순차적으로 실행합니다.
예시 (x86 어셈블리):
mov eax, 5 ; EAX 레지스터에 5를 저장
mov ebx, 10 ; EBX 레지스터에 10을 저장
cmp eax, ebx ; EAX와 EBX를 비교 (5와 10 비교)
jne not_equal ; 결과가 같지 않으면 'not_equal' 레이블로 점프
; 만약 두 값이 같다면 이 부분을 실행
mov ecx, 1
jmp end_of_code
not_equal:
; 만약 두 값이 같지 않다면 이 부분을 실행
mov ecx, 0
end_of_code:
; 프로그램의 나머지 코드
위 예시에서 cmp eax, ebx의 결과는 같지 않으므로 ZF가 0이 되고, jne not_equal에 의해 프로그램 실행은 not_equal 레이블로 이동합니다. 결과적으로 ecx 레지스터에는 0이 저장됩니다.
jmp (Jump)
jmp 명령어는 'Jump'의 약자로, 프로그램의 실행 흐름을 특정 주소로 무조건 이동시키는 무조건 분기 명령어입니다. jne와 같은 조건 없이 항상 지정된 레이블(주소)로 점프합니다.
동작 방식:
jmp명령어는 뒤따르는 레이블(주소)로 프로그램 실행 흐름을 즉시 변경합니다.- 이 점프는 항상 수행되며, 조건에 영향을 받지 않습니다.
사용 목적:
- 루프(Loop) 구현: 코드 블록을 반복 실행할 때 사용됩니다.
- 함수 호출 및 복귀: 특정 코드 블록으로 이동하여 실행한 후 원래 위치로 돌아오기 위해 사용될 수 있습니다 (단,
call명령어가 더 일반적). - 코드 재구성: 복잡한 조건 분기 후 특정 지점으로 실행 흐름을 모으거나, 코드의 특정 부분을 건너뛸 때 사용됩니다.
예시 (x86 어셈블리):
mov eax, 1
start_loop:
; 반복될 코드 블록
inc eax ; EAX 값을 1 증가
cmp eax, 5 ; EAX와 5를 비교
jne start_loop ; EAX가 5가 아니면 'start_loop'로 다시 점프 (루프)
; 루프가 끝나면 이 부분을 실행
mov ebx, eax
위 예시에서 jmp 명령어는 없지만, jne start_loop가 사실상 jmp와 유사한 역할을 하여 루프를 형성합니다. 만약 jne 대신 jmp를 사용한다면 (물론 이 경우 cmp와 조건은 의미가 없어지지만), jmp 명령어는 항상 지정된 레이블로 이동합니다.
jmp 명령어의 다른 형태:
- 근거리 점프 (Near Jump): 현재 코드 세그먼트 내의 다른 주소로 점프합니다.
jmp short label또는jmp near ptr label형태로 사용됩니다. - 원거리 점프 (Far Jump): 다른 코드 세그먼트의 주소로 점프합니다.
jmp far ptr label형태로 사용됩니다. (현대 프로그래밍에서는 흔히 사용되지 않습니다.)
정리:
jne는 비교 결과가 같지 않을 때만 점프하는 '조건부 분기' 명령어이고, jmp는 조건에 상관없이 항상 점프하는 '무조건 분기' 명령어입니다. 이 두 명령어는 프로그램의 논리를 구현하고 복잡한 제어 흐름을 만드는 데 필수적입니다.