티스토리 뷰
[2] : array의 크기는 10으로 지정. (정수형이기 때문에 x4)
[17] : input_data 서브루틴을 호출.
서브루틴 호출은 $ra에 다음 명령어 주소를 저장해야하기 때문에 jal을 사용.
[31-32] : 홀수 출력을 통해 $a1에 1을 저장하고 서브루틴 output_data 호출.
[37-38] : 짝수 출력을 통해 $a1에 0을 저장하고 서브루틴 output_data 호출.
[49-52] : "1, 2, 3, 4, 5 ..." 형태의 문자열을 입력.
[60-61] : $t1에 저장된 문자가 쉼표(,) , 엔터(\n) 이면 number_buffer에 저장된
문자열 "300"을 정수로 형변환해 배열에 저장하기위해 if_comma로 점프.
[67-68] : $t1에 저장된 문자가 숫자(0-9)면 number_buffer[Index]에 저장하고 다음 숫자를
저장하기위해 number_buffer의 Index를 1 증가시킨다.
[77-79] : number_buffer[index]의 값이 0x00이거나, index가 4를 넘어가면 parse_end로 점프.
[85] : $t2, 즉 Index가 0이면 10을 곱하지 않고 넘어간다.
( 근데 생각해보니 어차피 0 x 10은 0이니까 따로 안걸러도 되겠다.... )
[94-96] : array[$t3] 에 해당 숫자를 더해 숫자를 만들어 나간다.
( 10곱하고 더하고, 10곱하고 더하고 하는 방식을 사용 )
[102] : 여기서 4를 더해주는 이유는 int형 배열이기 때문에 4Byte를 증가해줘야 한다.
C언어에서는 index처리시 자동으로 자료형에 따라 처리해줬지만 여기선 아니다.
[108] : 여기서 1인 이유는 문자열의 문자 하나하나를 순환해야 하기 때문에 1Byte이다.
[127-129] : array[j], array[j + 1] 을 비교해서 순서가 안맞으면
[131-132] : 이 라인을 통해 두 개의 배열을 Swap한다.
[134, 137] : 마찬가지로 Index를 다루는 레지스터이기 때문에 4Byte를 증가시킨다.
[147-150] : array[index]의 값을 2로나눈 나머지를 $v0에 저장.
( 특히 150번 라인의 명령어를 잘 기억하자. )
[151] : 나머지가 $a1 이면 출력을 건너뛴다. (홀수, 짝수 구분을 위함)
'Reversing > Assembly' 카테고리의 다른 글
[MASM] MASM으로 작성한 IAT Hooking을 통한 API Hooking (0) | 2020.04.09 |
---|---|
[Assembly] 순서없이 배우는 MIPS 개념정리. (1) | 2020.04.08 |
[MASM] MASM으로 구현하는 32Bit Trampoline API Hooking (0) | 2020.03.16 |
[MASM] MASM으로 작성한 SetWindowsHookEx을 이용한 DLL Injection. (0) | 2020.03.11 |
[MASM] MASM(Microsoft Assembler) 시작하기 (x32, x64) (0) | 2020.03.10 |