섭씨 온도에서 화씨 온도 구하기
구하는 공식은 F = (9 / 5) * C + 32 이나 코드 영역을 보게 되면 add ax,2가 추가 된 것을 확인할 수 있다. 이것을 추가해 주는 이유는 5로 나눈 결과값이 소수점 한자리수가 6을 넘어가게 되면 그 값을 버려주기 때문에 반올림 할 수 있는 경우 반올림을 해주기 위해 2를 더해준다.
2를 더해주게 되면 결과값에 0.4를 더해주는 것과 동일하므로 소수점이 0.6이상이 발생하게 되면 0.4를 더해주어 반올림한 결과가 되도록 설정해준다.
32bit보다 큰수 계산하기
위의 경우 Nbr1Hi 00000000 Nbr1Lo FFFFFFFF Nbr2Hi 00000000 Nbr2Lo FFFFFFFF 일 경우
adc를 통하여 발생한 carry가 Hi 덧셈에 사용되는지를 알아본 것이다.
밑에 값은 다 동일하나 Nbr1Hi 값을 3으로 주고 Nbr2Hi 값을 2로 주어 수행되는 과정을 알아보았다.
1. 값을 일단 넣어준다.
2. 밑에 Lo값들 부터 add를 통하여 더해준다.
Carry Flag가 발생한 것을 확인할 수 있다.
3. adc (바로 위의 연산에서 carry가 발생하면 추가로 더해준다.)를 통하여 Hi값들을 더해준다.
carry가 발생하여 1이 더해지는 것을 볼 수 있다.
sbb의 경우
sbb a, b 일때, a = a -b -carry 가 된다.
3가지의 명령을 통하여 CF를 컨트롤 가능하다.
5.1 Unconditional Jumps
- 분기문으로 조건을 따지지 않고 만나는 즉시, 그곳으로 이동하게 된다. (C에서 goto문)
- for나 while, switch문 처럼 조건을 따지면 conditional이다.
jmp를 통하여 forever를 계속적으로 반복한다.
더한 수의 갯수와 총합 평균을 출력한다.
relative near의 경우 jmp 명령 전으로 2,147,483,648 bytes 후로 2,147,483,647 까지 가능하며 short의 경우 전으로 128 bytes 후로 127 bytes 까지 가능하다.
register indirect 는 4byte 레지스터에 주소를 넣어 레지스터 이름을 적어주게 되면 그 주소로 타고 이동하게 된다.
memory indirect 의 경우 이동한 메모리 안에 있는 주소의 메모리로 이동한다.
jmp DWORD PTR [ebx]
위의 경우 ebx 레지스터가 가진 값의 주소로 이동하여 그 이동한 메모리에서 가진 값의 주소로 이동한다.
만약 ebx가 100번지를 가지고 있을 경우 메모리의 100번지로 이동하여 100번지가 가진 주소 번지로 이동한다.
5.2 Conditional Jumps, Compare Instructions, and if Structures
비교명령
- jz endWhile Zero일때 endWhile라벨로 점프한다. (Zero Flag가 1일 때)
- jns elseIfZero 양의 정수 일 때 (Sign Flag가 0)
- cmp operand1, operand2 두 수를 비교한다. ( operand1 - operand2 )
비교 명령을 사용한 예제 소스
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
include io.h
cr equ 0dh
Lf equ 0ah
.STACK 4096
.DATA
prompt1 BYTE "Input Number ", cr, Lf, 0
prompt2 BYTE "Small ", cr, Lf, 0
prompt3 BYTE "Big ", cr, Lf, 0
prompt4 BYTE "Equal ", cr, Lf, 0
prompt5 BYTE "End Program ", cr, Lf, 0
number1 BYTE 16 DUP (?)
.CODE
_start:
output Prompt1
input number1, 16
atoi number1
mov edx, 10
sub edx, eax
jz EQUAL ; ZF = 1 시 EQUAL로 점프
jns SMALL ; 양수 일 때 SF= 0 SMALL로 점프
jmp BIG ; 위의 두가지 경우가 아닐 때 BIG으로 점프
EQUAL :
output prompt4
jmp ENDPRG ; 프로그램을 종료시키는 라벨로 점프
SMALL :
output prompt2
jmp ENDPRG ; 프로그램을 종료시키는 라벨로 점프
BIG :
output prompt3
jmp ENDPRG ; 프로그램을 종료시키는 라벨로 점프
ENDPRG :
output prompt5
INVOKE ExitProcess, 0
PUBLIC _start
END
edx가 10의 값을 가지고 입력한 값을 eax가 가져 비교를 통하여 10이면 같기에 ZF가 1이 되어 EQUAL이 출력되고 8처럼 적은 값일 경우 양수이므로 SMALL을 출력하고 11처럼 큰 값을 줄 경우 제로, 양수 둘 다 성립하지 않기 때문에 BIG이 출력된다.
1번의 경우 같은 수이므로 차이가 0이 되고 ZF가 1이된다.
2번의 경우 큰값에서 작은값을 빼므로 변화가 없다.
3번의 경우 작은값에서 큰값을 빼므로 Carry Flag가 발생하고 결과값은 음수가 나온다. (CF1, SF1)
4번의 경우 음수 뺄셈으로 -7 에서 -10을 뺀다. 큰값에서 작은값을 빼므로 결과값은 양수이고 변화가 없다. (-7 -(-10) = -7+10 = 3)
5번의 경우 마찬가지로 음수 뺄셈으로 4번과 반대로 작은값에서 큰값을 빼므로 결과값은 음수가 나오고(SF 1) 작은값에서 큰값을 빼기에 Carry가 발생한다. (CF 1) ((-10 - (-7) = -10 +7 = -3) 부호없이(unsigned) 생각하면 작은값 - 큰값)
6번의 경우 양수에서 음수를 빼는 것으로 결과값은 양수가 나오나 부호없이 생각할 경우 뒤의 수가 더 크기때문에 CF가 1이 된다.
7번의 경우 음수에서 양수를 빼므로 결과값이 음수가 되어 SF가 1이 되고 나머지는 변화가 없다.
8번의 경우 양수에서 음수를 빼나 결과값은 68(0110 1000)에서 C3(1100 0011)로 음수로 바뀌게 된다. 그렇기 때문에 OF가 1이 되고 결과값이 음수여서 SF 1 이 되며 부호없이 생각하면 작은수에서 큰수를 빼기에 CF가 1이 된다.
9번의 경우 음수에서 양수를 빼는 것으로 결과값이 A5(1010 0101)음수에서 3D(0011 1101)양수로 바뀌므로 OF 1이 되고 나머지는 변화없다.
cmp 100, total ; illegal
Note that an immediate operand must be the second operand.
( immediate가 operand로 올 경우엔 반드시 2번째 operand 이여야만 한다.)
Conditional jump 명령
C소스 어셈블리로 바꿔 알아보기
int main(void)
{
int a;
a = 3;
if(0<a)
{
a = 9;
}
return 0;
}
int형에서 short 형으로 바꾸게 되면 소스가 더 추가 되는 것을 확인할 수 있다.
크기를 어떻게 설정하느냐에 따라 차이가 나타나는 것이다.
이상입니다.
'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글
2014.08.05 업무보고 출석번호 5번 김상엽 (7) | 2014.08.06 |
---|---|
2014.08.04 업무일지 [김대희] (12) | 2014.08.04 |
2014.08.01 업무일지 [고한솔] (14) | 2014.08.01 |
20140731 업무일지 출석번호 1번 고윤석 (11) | 2014.07.31 |
2014.07.29 업무일지 출석번호21 이재우 (9) | 2014.07.30 |
(복사가능)Introduction to 80x86 Assembly Language and Computer Architecture.pdf (1) | 2014.07.29 |
07.28 - 업무일지 [20. 이경진] (11) | 2014.07.28 |
2014.07.25 업무일지 (출석번호 18번 오영주) (15) | 2014.07.28 |