mov al, 22
add al, -1
CF = 1이 됩니다.
mov al, 22
sub al, 1
CF = 0이 됩니다.
왜 이런 결과가 나올까요?
어차피 컴퓨터의 뺄셈은 2의 보수화 시킨후 더한다는 것으로 알고 있었는데
이유를 모르겠습니다.
명령어마다 flag reg. set되는 것 다르기 때문 이라고 합니다.
cmp 명령은 sub 명령과 거의 흡사하고 차이점이라면 cmp는 목적지 피연산자를 수정하지 않는다는 점이라고 알고 있고
뺄셈연산은 피연산자를 2의 보수로 취하여 덧셈하는것과 같다고 알고 있었다는 전제하에
아래의 경우는 모두 같은 결과를 내놓을줄 알았는데
문제는 Carry flag 가 CMP 그리고 SUB 와 ADD가 서로 다른 결과를 보이는 이유는 무었일까요?
MOV AL, 4
CMP AL, 1
MOV AL, 4
SUB AL, 1
MOV AL, 4
ADD AL, 0FFH
0000 0100
- 0000 0001
-------------
0 0000 0011
0000 0100
+ 1111 1111 (1의 2의 보수)
-------------
1 0000 0011
1. 소스 피연산자를 2의 보수로 취한다.
2. 목적지 피연산자와 소스 피연산자를 덧셈한다.
3. 결과저장후 Carry flag는 반전시킨다.
MOV AL, 4 /* 목적지 피연산자 */
MOV CL, 1 /* 소스 피연산자 */
NEG CL /* 2의 보수 */
ADD AL, CL /* 덧셈 */
CMC /* Carry flag 반전 */
제가 질문하고 제가 답변하는데..
명령어마다 flag reg. set되는 것 다르기 때문 이라고 합니다.
--
"도구의 결함은 장인의 손으로 극복한다."
===============================================================================================
Mobile: 010-8702-2744 (+82-10-8702-2744)
E-Mail: min...@minzkn.com, min...@hwport.com, min...@gmail.com, min...@arion.co.kr
MSN: minz...@hotmail.com
Homepage: http://www.minzkn.com
=-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-==-+-=
(주)아리온테크놀로지 / 선임연구원 / AV연구소 / 조재혁
경기도 안양시 동안구 호계2동 894 피카빌딩 3층 (431-836)
전화번호/팩스: 031-361-3156 / 031-361-3097
ARION Technology Inc. / Senior Engineer / AV R&D Lab. / Jae-Hyuk Cho
3F, Pica Bldg, 894 Hogye 2-Dong, Dongan-Gu, Anyang-City, Gyeonggi-Do, KOREA(ROK) (431-836)
TEL/FAX: +82-31-361-3156 / +82-31-361-3097
Website: www.arion.co.kr
===============================================================================================
Intel 8086 users manual 에 따르면
ADD 명령어의 경우
------------------------------------------------------------
Operands | Clocks | Transfers
------------------------------------------------------------
reg, reg | 3 | -
reg, mem | 9+EA | 1
mem,reg | 16+EA | 2
reg, imm | 4 | -
mem,imm| 17+EA | 2
acc,imm | 4 | -
SUB 명령의 경우
------------------------------------------------------------
Operands | Clocks | Transfers
------------------------------------------------------------
reg, reg | 3 | -
reg, mem | 9+EA | 1
mem,reg | 16+EA | 2
acc,imm | 4 | -
reg, imm | 4 | -
mem,imm| 17+EA | 2
이와 같이 나와 있습니다.
그런데 조재혁님 말씀대로
1. 2의 보수화
2. 덧셈
3. flag 반전
이런 형태로 뺄셈이 이루어 진다면 clocks이 더 필요하지 않나요?
그렇다고 메뉴얼 EU와 BIU 부분을 보아도 감산기는 존재하지가 않습니다. 누산기만 존재하구요.
제가 아직 많이 부족해서 도무지 모르겠습니다...
뺄셈도 보수의 덧셈으로 구현되므로 누산기만 있어도 되구요.
혹시 논리 회로나 디지털 회로 수업을 들으신적 있나요?
게이트와 플립플롭등에 대해 먼저 알아야 실제로 어떤 명령어가
어떻게 하드웨어적으로 구현되는지 알고 몇 클력이 왜 필요한지 알 수 있습니다.
감사합니다^^궁금증이 풀렸어요.
> > 제가 아직 많이 부족해서 도무지 모르겠습니다...- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -