View

300x250

assembly를 배우면서 하드웨어의 작동에 대해 배우는 이유?

하드웨어 ( CPU, Memory, I/O ) 위에서  OS가 작동하고, 이 OS 위에서 프로그램이 동작한다. C, JAVA 등의 고급언어로 작성된 프로그램들은 컴파일러에 의해 binary파일이나 execute파일로 번역되어 OS/HW에 전달되기 때문에 작동방식이나 과정에 대해서는 개발자가 알지 못해도 프로그램을 동작시키는데 아무런 무리가 없다. 그러나, Assembly같은 기계어는 HW를 직접 건드리는 명령어를 사용하기 때문에, CPU, Memeory등이 어떻게 동작하는지에 대한 방식과 사용 방법을 알고 있어야 한다.


Carry Flag & Overflow Flag

Unsigned a = 5, b = 3 이라 할 때, if ( a > b ) 의 조건 state는 a - b 의 값이 +/-인지로 검사한다. 


a - b = a + ( -b ) = a + ( 2’s complement of b )

계산한 result에서 carry out이 1이면 a > b, 0이면 a < b 이다.

b를 2’s complement로 만들어주어 ADDER가 SUBTRACTOR의 역할까지 수행하기 위해 MUXs를 이용한다. ( + 이면 그대로, - 이면 1’s complement로 만들고, Carry in을 1을 넣어준다 ) 


ARM Instructions

ARM은 32bit의 instruction들을 수행하는 RISC machine이다.

대부분의 Instruction들은 조건에 따라 수행될 수 있다. ( ex - addeg r1, r2, r3 -> CPU에서 eg에 대한 조건 체크 후 실행 ) 

NZCV Flag가 해당 조건문의 state로 들어가게된다  ( 4bit 조건 - 15가지 condition ( ex) 1100 -> True ))

Instruction은 크게 Arithmetic, Logic / Memory Access / Branch 등으로 구분할 수  있다.


Arithmetic Instruction - ADD

ADD r0, r1, r2 [ r1 + r2 의 값을 r0에 대입 ]

Register에서 r0은 Rd에, r1은 Rn, r2는 R3 ( shifter operand ) 에 저장된다.


ADD r0, r1, r2, LSL #1 [ r1 + r2 << 1 의 값을 r0에 대입 ]


ADDS - Register의 S값이 1이면 ( ADDS instruction을 쓰면 ) 명령 수행 후 CPSR의 NZCV Flag들을 초기화시킨다.


Arithmetic Instruction - SUB

SUB r0, r1, r2 [ r1 - r2 의 값을 r0에 대입 ]

Register에서 r0은 Rd에, r1은 Rn, r2는 R3 ( shifter operand ) 에 저장된다.


SUB r0, r1, r2, LSL #1 [ r1 - r2 << 1 의 값을 r0에 대입 ]


RSB r0, r1, #0 [ Reverse Sub, 거꾸로, 0에서 r1값을 뺀 값을 r0에 대입 ]






// 이 시리즈의 글들은 고려대학교의 Computer System Design 과목 ( COSE321 ) 을 수강하며 제가 공부한 내용입니다.

// 노트필기를 바탕으로 정리하여 올리고 있으므로, 부정확한 정보가 있을 수도 있습니다.

// 추후에 종강을 하면 워터마크를 삽입한 최종노트 PDF를 첨부할 계획입니다.


320x100
Share Link
reply
반응형
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30