본문 바로가기
공부,일/어셈블리

Branching and Looping

by fromnothing1 2021. 9. 1.

jmp

goto 문이랑 동일 

;; jmp label 실습 

SMART_SART:
	mov ecx, 0
	inc ecx
	jmp SMART_SART

ex) 

jmp StatementLabel ; Label 이 있는 곳으로 점프하라 

 

점프 명령어 구조 

near :  4 byte , 멀리 갈때는

short : 1byte  , 근처 갈 때는 

 

short  쓸 때는  밑의 경우와 같이 조금 이동할 경우 에만 (1byte 미만 이동)

jmp 01 ; 1칸 앞으로 이동 

jmp ff ; -1 칸 이동 ( 점프는 항상 singed이다.)

 

결국 jmp LabelName

명령어는 기계어로 해석되면 Label까지의 상대적인 거리만큼 계산해서 jmp 한다.

 00000008			SMART_SART:
 00000008  49				dec ecx
 00000009  74 02			jz SMART_END
 0000000B  EB FB			jmp SMART_SART
 FB 2의 보수 법으로 -5 
 프로그램 카운터는 EB FB 가 수행될때 이미 C 번지에 있다 
 따라서 c - 5 = 7 
 7 은 SMART_SART 의 라벨 이 존재하는 위치이다.

EQU 전처리 (#define과 동일) 

cr equ 0dh        =          (#define cr 0dh)

 

Conditional Jumps (if 문)

jz (ZF 플레그가 1 일 때 점프 -> 계산 결과가 0일 때 점프) 

;; jz label 실습 

mov ecx, 10
SMART_SART:
	dec ecx
	jz SMART_END
	jmp SMART_SART


SMART_END:
	mov ecx, 10

ecx 가 0 이 되면 jz로 SMART_END로 점프한다. 

 

여러 가지 Conditional  점프 

 

cmp 명령어

크기 비교 명령어

사실 앞에서 뒤에 뺀 후에  signed or unsigned에 따른 flag를 보고 비교를 한다. 

위의 표를 보면 모든 경우의 수가 나와있다. 

 

 

and , or 연산자에서 jmp

and , or 은 short circuit evalution에 따라서 결정된다. 

-> and는 앞의 값이 거짓이면 논리 결과는 거짓이다. 

-> or 은 앞의 값이 진실이면  논리 결과는 진실이다. 

즉 and , or에 따라서 앞의 값이 참, 거짓인지 먼저 알아보고 jmp 하기 때문에 뒤의 코드는 실행되지도 않는다. 

Loops

보통 jmp 를 통해서 loop 를 구현하지만 loop 명령어 또한 존재한다. 

loop statementLabel

 

• the value in ECX is decremented

• if the new value in ECX is zero, then execution continues with the statement following the loop instruction

• if the new value in ECX is nonzero, then a jump to the instruction at statementLabel takes place

 

ecx 가 줄어들면서 명령어가 수행된다. 

 

 

'공부,일 > 어셈블리' 카테고리의 다른 글

ch 6 . Procedures  (0) 2021.09.08
add & sub LargeNumber  (0) 2021.08.31
mul,imul  (0) 2021.08.31
덧셈 뺄셈 숙제 코드  (0) 2021.08.26
여러가지 어셈블리 명령어  (0) 2021.08.25

댓글