반응형

어셈블리 15

어셈블리로 보는 비트연산

~ bitwise not // 단일 숫자의 모든 비트를 대상으로 0은 1, 1은 0으로 뒤바꿈 & bitwise and // 두 숫자의 모든 비트 쌍을 대상으로 and를 함 | bitwise or // 두 숫자의 모든 비트 쌍을 대상으로 or를 함 ^ bitwise xor // 두 숫자의 모든 비트 쌍을 대상으로, xor을 한다 > 비트 우측 이동 // 비트열을 N만큼 오른쪽으로 이동 // 오른쪽의 넘치는 N개의 비트는 버림 // 왼쪽 생성되는 N개의 비트는 // - 부호 비트가 존재할 경우 부호 비트를 따라감 (부호있는 정수라면 이 부분을 유의) // - 아니면 0 flag = (1

어셈블리 2022.08.16

어셈블리로 보는 비교연산

int a = 1; int b = 2; bool isSame; bool isDifferent; bool isGreater; bool isSmaller; bool test; int hp = 100; bool isInvincible = true; int main() { #pragma region 비교 연산 isSame = (a == b);// 둘의 값이 같은가? isDifferent = (a != b);// 둘의 값이 다른가? isGreater = (a >= b); isGreater = (a > b); isSmaller = (a 둘 다 1이면 1, 둘 중 하나라도 0이면 0 test = (hp 둘 중 하나라도 1이면 1, 둘다 0이면 0 test = (hp > 0 || isInvincible == true)..

어셈블리 2022.08.16

어셈블리로 보는 산술연산 과정

a = b + 3; // 덧셈 add 1. 00F9182B mov eax,dword ptr [b (0F9A004h)] 2. 00F91830 add eax,3 3. 00F91833 mov dword ptr [a (0F9A000h)],eax 1. 레지스터 eax에 b의 값을 넣음 2. eax에 3을 더함 3. a에 eax의 값을 넣음 a = b - 3; // 뺄셈 sub 1. 00F91838 mov eax,dword ptr [b (0F9A004h)] 2. 00F9183D sub eax,3 3. 00F91840 mov dword ptr [a (0F9A000h)],eax 1. 레지스터 eax에 b의 값을 넣음 2. eax에 3을 뺌 3. a에 eax의 값을 넣음 a = b * 3;// 곱셈 mul 1. 00F9..

어셈블리 2022.08.16

어셈블리 배열과 주소

; 배열과 주소 ; 배열 : 동일한 타입의 데이터 묶음 ; - 배열을 구성하는 각 값을 배열 요소(element)라고 함 ; - 배열의 위치를 가르키는 숫자를 인덱스(index)라고 함 ; 연습문제 : a배열의 모든 데이터 출력해보기 xor ecx, ecx LABEL_PRINT_A: PRINT_HEX 1, [a + ecx] NEWLINE inc ecx cmp ecx, 5 jne LABEL_PRINT_A xor ecx, ecx LABEL_PRINT_B: PRINT_HEX 2, [b+ecx*2] ; 2byte짜리니까 2씩 움직여야함 NEWLINE inc ecx cmp ecx, 5 jne LABEL_PRINT_B xor rax, rax ret section .data ; 이게 배열이라고 할 수 있음! a db..

어셈블리 2022.08.11

어셈블리 반복문

; 반복문 (while, for) ; 특정 조건을 만족할때까지 반복해서 실행 ; ex) Hello World를 10번 출력해야 한다면? mov ecx, 10 LABEL_LOOP: PRINT_STRING msg NEWLINE dec ecx ; sub ecx,1 과 동일 cmp ecx, 0 Jne LABEL_LOOP ; JumpNotEquals 값이 다르면 점프 ; 연습 문제) 1에서 100까지의 합을 구하는 프로그램 1 + 2 + 3 ... +100 = ? mov eax, 0 mov ebx, 0 LABEL_SUM: inc eax ; add eax,1 과 동일 add ebx,eax cmp eax, 100 jne LABEL_SUM PRINT_DEC 4, ebx NEWLINE mov ecx, 100 xor eb..

어셈블리 2022.08.11

어셈블리 분기문

분기문 (if) 특정 조건에 따라서 코드 흐름을 제어하는 것 ex) 스킬 버튼 눌렀는가? YES -> 스킬 사용 조건체크 -> 흐름 CMP dst, src (dst가 기준) CMP = Compare x,% 는 지정된 레지스터에 저장 CMP또한 결과물은 Flag Register에 저장 JUMP [label] 시리즈 JMP : 무조건 Jump JE : JumpEquals 같으면 Jump JNE : JumpNotEquals 다르면 Jump JG : JumpGreater 크면 Jump JGE : JumpGreaterEquals 크거나 같으면 Jump JL, JLE 등등 많음 ; 두 숫자가 같으면 1, 아니면 0을 출력하는 프로그램 mov rax, 10 mov rbx, 20 cmp rax, rbx je LABEL..

어셈블리 2022.08.11

어셈블리 논리연산

; not and or xor ; 조건A : 잘생겼다 ; 조건B : 키가 크다 ; not A : 잘생겼다의 반대 -> (0 이면 1, 1이면 0) ; A AND B : 잘생겼고 키도 크고 -> 둘다 1이면 1, 아니면 0 ; A or B : 잘생겼거나 or 키가 크거나 -> 둘중 하나라도 1이면 1, 아니면 0 ; A xor B : 두값이 같으면 0, 아니면 1 mov al, 0b10101101 mov bl, 0b01110100 and al, bl PRINT_HEX 1, al NEWLINE not al PRINT_HEX 1, al NEWLINE xor al,bl PRINT_HEX 1, al NEWLINE ; 동일한 값으로 xor를 두번하면 원래의 값으로 돌아오는 특성이 있음 xor al,bl PRINT_..

어셈블리 2022.08.10

어셈블리 사칙연산

더하기 연산 add a, b (a == a + b) a는 레지스터 or 메모리 b는 레지스터 or 메모리 or 상수 단 a, b 모두 메모리는 x add [num], [num] ; 메모리 + 메모리는 안됨!! ; 빼기 연산 ; sub a, b (a = a - b) ; 곱하기 연산 ; mul reg ; - mul bl => al * bl ; -- 연산 결과를 ax에 저장 ; - mul bx => ax * bx ; -- 연산 결과는 dx(상위 16비트) ax(하위 16비트)에 저장 ; -mul ebx => eax * ebx Line 54 - ax가 0으로 채워짐 Line 55 - al에 5가 들어감 Line 56 - bl애 8이 들어감 Line 57- 두수가 곱해지면서 ax에 들어감 Al에 들어가는게 아니라..

어셈블리 2022.08.10
반응형