20140730 (rounding factor, adc, sbb, clc, stc, cmc, jmp, cmp)
113일차
-----------------
Assembly
-----------------
------- rounding factor
라운딩 팩터
섭씨를 화씨로 변환하는 프로그램인데
변환 공식이 F = (9 / 5) * C + 32 이다.
그런데 소스 중에 빨간 줄이 쳐진 곳을 보면 2를 더한다.
왜 2 를 더할까?
rounding factor라고 하는데
9 / 5 = 1.8 이다.
정수간에 연산이기에 소수점 아래는 다 버리게 된다.
그래서 반올림 하여 2로 만들어 주어서 차이가 적게 만드려고 한다.
(9 + 2) / 5 = 2.2 로 2에 가깝게 만들어 주었다.
2 / 5 = 0.4 로 소수점 어떤 값에 0.4를 더해주게 되면
반올림된 값으로 쳐줄 수 있다. 그래서 정수 계산에서 2를 더해준다.
------- adc , sbb Instruction
adc (덧셈)
adc A , B
==> A = A + B + carry
sbb (뺄셈)
sbb A , B
==> A = A - B - carry
------- clc , stc , cmc Instruction
carry flag 셋팅.
------- jmp Instruction
무조건 점프
jmp offset(상대값)
------- 조건에 따른 점프
jz endwhile
zero flag 가 set 됐으면 endwhile로 점프
jnz startwhile
zero flag 가 0 이면 (연산 결과가 0이 아니다) startwhile로 점프
js endprg
sign flag 가 set 됐으면 (음수이면) endprg로 점프
jns smart
sign flag 가 0 이면 (양수이면) smart로 점프
------- cmp Instruction
비교
cmp operand1 , operand2
operand1 에서 operand2 를 뺀다.
뺀 값이 저장되는건 아니고 flags가 바뀐다.
그 flag가 바뀐 값으로 조건에 맞게 점프를 한다.