목록전체 글 (167)
GaGe
이번 강의는 내용은 길지만 저번 시간의 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..
offset을 이용하여 메모리 공간을 접근하는 방법을 알아보겠다. offset이란 기준점에서 얼만큼 떨어져있는 메모리의 값을 지칭할 때 쓰는 단어다. (변위차를 나타내는 정수형) 보통 메모리에서 쓰인다. 이렇게 명령어를 적으면 기준점인 ebx 402000에서부터 1, 2, 3, 4먼큼 차례로 커지며 그 자리에 1, 2, 3, 4를 저장한다. 결과를 보면 402000에 0, 402001에 1, 402002에 2 ... 가 저장되어있다. 그렇다면 이 명령어의 결과는 무엇일까? 402000에서부터 ecx만큼을 더한 주소, 처음에 ecx가 0이니까 402000, inc로 ecx가 1이 올라서 402002, inc로 ecx가 또 1이 증가해서 402002를 가리키게 될 것이다. 결과를 확인해보면 402000에 0..