비트연산이 속도가 빠르다
1. 비트연산: shift 연산
1). 부호가 없는 연산
- 왼쪽으로 이동 : shl
- 오른쪽으로 이동: shr
ex).
eax=4;
eax << 1 <- 8 (4*2)
eax << 2 <- 16(8*2)
eax << 3 <- 32(16*2)
0000 0100
0000 1000 <- 왼쪽으로 한칸 이동한 경우
0001 0000 <- 왼쪽으로 한칸 이동한 경우
왼쪽으로 30 밀었다가 다시 오른쪽으로 30밀어도 복구가 안됨을 볼 수 있습니다
밀었던 값 11이 00으로 채워져서 쓰레기 값이 나옴을 볼 수 있습니다
이렇기 때문에 부호가 있는 경우에는 부호가 있는 연산자를 써야합니다
2). 부호가 있는 연산( MSB를 유지)
- 왼쪽으로 이동 : sal
- 오른쪽으로 이동 : sar
ex).
eax = -4
eax= 0, -0
보수 : 0000 0100 -> 1111 1011 (1의 보수를 취한다)
보수 : 0000 0000 -> 1111 1111(-0이 생기는데 이건 말이안된다)
그래서 2의보수를취합니다
1111 1011 -> 1111 1100
1111 1111 -> 1 0000 0000
부호가 있는 연산을 쓰면
1111 << 2 를 다시 >>2 해야 1100에서 1111이 됩니다
2.논리연산 : and, or , not
1). and
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
and 연산자를 통해서 0000 0000 1111 1111로 and 연산을 하여서
몫을 구할 수 있습니다
shr을 이용해서 나머지를 오른쪽으로 8비트 밀어서 나머지를 구할 수 있습니다
2). or
1 or 1 = 1
1 or 0 = 1
0 or 1 = 1
0 or 0 = 0
2-1) xor
1 xor 1 =0
1 xor 0 =1
0 xor 1= 1
0 xor 0 =0
xor로 같은걸 하면 초기화 기능이 되며
neg를 쓰면 음수로 나옵니다
3) not(neg)
not 1 = 0
not 0 = 1
3. 형변환
1). 작은 -> 큰
- movzx(zero extend)
- movsx(sign extend)
movsx를 쓰면 부호가 있는 숫자도 잘 이동이 됨을 볼 수 있습니다
2). 큰 -> 작은
eax> ax> al
딱히 명령어가 없다 데이터가 손실될 우려가 있다
[실습]
- 사칙연산 프로그램 작성
- 입력 최대 크기는 32bit이다
'Security > System' 카테고리의 다른 글
[SYSTEM SECURITY]13.어셈블리 (스택 4) (0) | 2017.10.31 |
---|---|
[SYSTEM SECURITY]9.어셈블리(반복문) (0) | 2017.10.24 |
[SYSTEM SECURITY]6.어셈블리 (scanf) (0) | 2017.10.19 |
[SYSTEM SECURITY]5.어셈블리 (사칙연산) (0) | 2017.10.18 |
[SYSTEM SECURITY]4. 어셈블리 명령어(mov , lea) (0) | 2017.10.17 |