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 |
댓글