목록SISS (2017-2018)/어셈블리어 (16)
알맹이방
이번 강의는 내용은 길지만 저번 시간의 JA JB와 겹치는 부분이 많았다. JG : jump if A greater than B JL : jump if A less than B JA와 JB랑 비슷하지만 차이가 있다. 비교하는 데이터를 어떤 데이터로 인식하느냐의 차이인데 JG와 JL은 부호가 있는 데이터를 비교할 때 사용한다. 만약에 1010 vs 0001 부호가 없는 데이터로 인식하고 비교하면 10vs1 (JA, JB) 부호가 있는 데이터로 인식하고 비교하면 -4vs1 (JG, JL) 이렇게 결과가 완전히 뒤바뀌게 된다. eax를 1010으로 해놓고 ebx를 0001로 해놓고 둘을 JA로 비교하면 참이 되어 40100A로 jmp한다. 하지만 둘을 JG로 비교한다면 -4vs1이 되기 때문에 거짓이 되므로 ..
이번 주 내용을 공부하기 전에 저번주에 뭘 배웠는지 복습해보자. JA와 JB가 뭐였는가? JA 는 cmp로 a와b를 비교한다고 했을 때 a가 b보다 클 때 JB 는 cmp로 a와b를 비교한다고 했을 때 a가 b보다 작을 때 JNA와 JNB는 반대이다. JNA : a가 b보다 작거나 같을 때 JNB : a가 b보다 크거나 같을 때 jna 40100f와 jnb 40100f를 넣어보았다. 하지만 어셈블리어로 jna는 jbe로, jnb는 jae로 바뀌어있었다. 기계어로 완전히 똑같은 의미라고 한다. JNA는 a가 b보다 작거나 같을 때 인데, JBE는 a가 b보다 작거나 같을 때라는 의미가 완벽히 똑같다. 올리디버그가 마음대로 바꾼 이유는 이 프로그램은 어셈블러 기능이 있긴 하지만 원래 디버깅 툴이기 때문이라고..
JNE에 대해서 알아보자. 이전에 배웠던 JE와는 달리 N이 붙어있다. JNE, JNZ에 있는 N은 not이다. Jump if Not Zero Jump if Not equal eax와 1을 비교해서 같다. 그래서 z가 1이고 jne명령어기 때문에 같으면 실행이 되지 않을 것이고 다르면 실행이 될 것이다. 401005로 넘어가지 않고 바로 다음 명령어로 넘어왔다. eax와 0을 비교하면 다르기 때문에 jne가 실행이 될 것이다. 실행이 되어서 401005로 넘어갔다 JA와 JB를 알아보자 JA의 a는 above, cmp 비교 명령어에서 앞에 있는 것이 크면 실행하고 JB below, cmp 비교 명령어에서 앞에 있는 것이 작으면 실행한다. 이 명령어는 어떻게 작동하는가? C 상태 레지스터에서 작동한다. c..
jmp는 무조건 점프이다. 점프명령은 다 j로 시작한다. 우리가 지금 할 점프 명령어는 뒤에 조건이 붙는다. JZ 주소 = Z가 제로일 때 점프를 하는 것이다. JZ라고 쳐도 JE라고 나오는데 이는 기계어에서는 같은 의미라고 한다. eax등등과 같은 레지스터 아래에 알파벳이 하나인 레지스터가 보이는데 이는 상태레지스터이다. (0과 1로만 이루어져있다.) 이 레지스터의 값에 따라서 점프를 하는가 하지 않는가에 대한 결정이 되는 것이다. z는 zero flag이다. eax가 1일 때는 제로 플래그가 0이다. 제로가 아니기 때문에 거짓인 것이다. 그래서 jz 401005가 실행되지 않는다. 여기서 z가 1이라서 401009로 점프할 수 있을 것이다. 401009로 넘어간 결과를 볼 수 있다! z가 0이라서 j..