typedef unsigned int uint32_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
typedef signed char int8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
extern void MovTest(void);
extern void AddTest(void);
extern void SubTest(void);
extern void MulTest(void);
extern void MaddTest(void);
extern void DivTest(void);
extern void AndTest(void);
extern void OrTest(void);
extern void XorTest(void);
extern void ShTest(void);
extern void ShaTest(void);
extern void ExtrTest(void);
extern void InsertTest(void);
extern void CmpTest(void);
extern void LdTest(void);
extern void StTest(void);
extern void LeaTest(void);
extern void AddscTest(void);
extern void JumpTest(void);
extern void LoopTest(void);
extern void CallTest(void);
extern void Test(void);
int32_t main(void)
{
volatile uint32_t i = 0x12345678u;
volatile uint32_t tmp = 0u;
for(;;)
{
i++;
MovTest();
AddTest();
SubTest();
MulTest();
MaddTest();
DivTest();
AndTest();
OrTest();
XorTest();
ShTest();
ShaTest();
ExtrTest();
InsertTest();
CmpTest();
LdTest();
StTest();
LeaTest();
AddscTest();
JumpTest();
LoopTest();
CallTest();
Test();
for(i = 0u; i <= 100; i++){
tmp += i;
}
}
/*return 0;*/
}
어셈블리 코드 형식
1FFFF0BB 해석: 형식에 따라 분리해서 봄, 1, FFFF, 0, BB
d'1'에 'FFFF'값을 넣음, '0'은 reserved(안씀), 'BB'로 명령어 식별하는듯?
어셈블리 문법 예제
mov d1, d2 // d1 = d2;
mov d1, #6 // d1 = sign_ext(const6);
add d3, d1, d2 // result = d1+d2, d3 = result[31:0];
add d1, d2 // result = d1+d2, d1 = result[31:0];
add d1, #6 // result = d1+sign_ext(const6), d1 = result[31:0];
sub d3, d1, d2 // result = d1-d2, d3 = result[31:0];
sub d1, d2 // result = d1-d2, d1 = result[31:0];
sub d1, #6 // result = d1-sign_ext(const6), d1 = result[31:0];
mul, div도 마찬가지,
MOV : move
MOV.A : move value to address register
MOV.AA : move address to address register
MOV.D : move address to data register
MOV.U : move unsigned
ADD.A : add address
ADD.B, ADD.F 등 다양한 형식은 메뉴얼보고 파악
mov16처럼 뒤에 16붙은건 16비트
int i = 0;
int result = 0;
for (i=1; i <=100; i++)
{
result = result + i;
}
result 값을 0x70001000 메모리에 저장하기
제출은 공유 - asm 폴더에, 이름.asm
----------------> assembly language?
Test: .type func
mov d1, #0 // int i = 0
mov d2, #0 // int result = 0
j 1n
1:
add d1, #1 // i++
add d2, d1 // result += i
j 2n
2:
jlt d1, #100, 1p // i<100일 때, label 1로 돌아감
// 근데 포맷이 4비트 써서 -8~7 밖에 안됌
ret
-------------------------------------
Test: .type func
mov a0, #100 // 마찬가지로 포맷이 4비트 써서 0~F 밖에 안들어감
mov d1, #0
mov d2, #0
1:
add d1, #1
add d2, d2, d1
loop a0, 1p
ret
-------------------------------------
Test: .type func
mov d0, #100 // 해결법, d0에 100을 써서 a0에 쓴다.
mov.a a0, d0
mov d1, #0
mov d2, #0
1:
add d1, #1
add d2, d2, d1
loop a0, 1p
ret
// 근데 디버깅할 때 call이 안불림..
----------------------------------------
LeaTest: .type func
movh.a a15, #8000 // a15이 보는 주소: 8000 0000 (뒤에 4자리 0 채움)
lea a0, [a15]0x24 // a0이 보는 주소: a15 주소 + 24
ld.a a0, [a0] // a0이 보는 주소: [a0] 주소에 들어있는 값 7010 0000
lea a0, [a0]0x4 // a0이 보는 주소: a0 + 4 = 7010 0004
lea a1, [a0]0x4 // a1이 보는 주소: a0 + 4 = 7010 0008
mov d1, #0xFFF // d1에 0FFF 저장
st.w [a0], d1 // a0 주소에 d1 값 저장
ld.w d2, [a0] // d2에 a0 주소에 있는 값 불러오기
ret
-------------------------------------------
Test: .type func
mov d0, #99
mov.a a0, d0
mov d1, #0
mov d2, #0
1:
add d1, #1
add d2, d1
loop a0, 1p
movh.a a1, #0x7000
mov d3, #0x1000
mov.a a2, d3
add.a a1, a2
st.w [a1], d2
ld.w d4, [a1]
ret