sub명령어와 add명령어의 차이점

188 views
Skip to first unread message

CCUPER

unread,
Aug 17, 2009, 4:05:47 AM8/17/09
to 어셈러브
CPU가 산술 연산이 부호있는 연산인지 부호없는 연산인지 어떻게 아는지 궁금해서
실험을 하다보니 아래와 같은 결과가 나오는데 그 이유를 모르겠습니다.

mov al, 22
add al, -1

CF = 1이 됩니다.

mov al, 22
sub al, 1

CF = 0이 됩니다.

왜 이런 결과가 나올까요?
어차피 컴퓨터의 뺄셈은 2의 보수화 시킨후 더한다는 것으로 알고 있었는데
이유를 모르겠습니다.

CCUPER

unread,
Aug 19, 2009, 7:34:18 PM8/19/09
to 어셈러브
제가 질문하고 제가 답변하는데..

명령어마다 flag reg. set되는 것 다르기 때문 이라고 합니다.

조재혁

unread,
Aug 19, 2009, 8:02:29 PM8/19/09
to asm...@googlegroups.com
안녕하세요. 어셈러브의 조재혁 입니다.
 
 
이 글의 내용은 제가 예전에 IRC의 #joinc 채널에서 "트기" 님의 질문에서 비롯되어 작성했던 글입니다.
질문하신 내용에 보충이 될까해서 적어봅니다.
 
 
-------------------------------

그 당시 트기님의 질문내용은 다음과 같았습니다.

cmp 명령은 sub 명령과 거의 흡사하고 차이점이라면 cmp는 목적지 피연산자를 수정하지 않는다는 점이라고 알고 있고
뺄셈연산은 피연산자를 2의 보수로 취하여 덧셈하는것과 같다고 알고 있었다는 전제하에
아래의 경우는 모두 같은 결과를 내놓을줄 알았는데
문제는 Carry flag 가 CMP 그리고 SUB 와 ADD가 서로 다른 결과를 보이는 이유는 무었일까요?


첫번째, cmp 명령의 결과 Carry flag 는 0, AL=4
 
MOV AL, 4
CMP AL, 1


두번째, sub 명령의 결과 cmp와 동일하게 Carry flag 는 0, AL=3
 
MOV AL, 4
SUB AL, 1


세번째, add 명령의 결과 cmp, sub 와는 반대의 결과인 Carry flag는 1, AL=3
 
MOV AL, 4
ADD AL, 0FFH



SUB의 경우는 다음과 같이 계산되어 최상위 비트(MSB)에서는 자리내림이 발생하지 않아 Carry flag 는 0인 상태를 유지합니다.
 
    0000 0100
-  0000 0001
-------------
  0 0000 0011


하지만 ADD의 경우 다음과 같이 계산되어 최상위 비트(MSB)에서 자리올림이 발생하고 Carry flag가 1이 됩니다.
 
    0000 0100
+  1111 1111   (1의 2의 보수)
-------------
  1 0000 0011




근데 이유는 간단합니다.

회로를 설계할때 보통 가산회로는 있으나 감산회로는 가산회로를 이용하여 설계를 하게 됩니다. (모든 회로가 그런것은 아니지만...)
그래서 SUB는 다음과 같이 구현하여 비교해 보아도 동일한 결과값을 출력하게 됩니다.

1. 소스 피연산자를 2의 보수로 취한다.
2. 목적지 피연산자와 소스 피연산자를 덧셈한다.


결과값으로는 동일한 결과를 수행하기는 했습니다. 하지만 Carry flag 는 두 결과가 반대의 결과를 보이게 됩니다.
이것을 보정하기 위해서 덧셈연산방법에는 다음과 같은 구현조건을 회로에 추가하여 뺄셈시의 Carry flag 와 같도록 추가하였습니다.

3. 결과저장후 Carry flag는 반전시킨다.


이 조건구현으로 감산회로를 가산회로의 조합으로 구현할수 있게 되었답니다.

즉, SUB는 다음과 같은 구현과 동일합니다.

MOV AL, 4 /* 목적지 피연산자 */
MOV CL, 1 /* 소스 피연산자 */
NEG CL /* 2의 보수 */
ADD AL, CL /* 덧셈 */
CMC /* Carry flag 반전 */




2009년 8월 20일오전 8:34, CCUPER <upry...@nate.com>님의 말:
제가 질문하고 제가 답변하는데..

명령어마다 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
===============================================================================================

CCUPER

unread,
Aug 20, 2009, 8:11:34 AM8/20/09
to 어셈러브
조재혁님 답변 감사합니다.

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 부분을 보아도 감산기는 존재하지가 않습니다. 누산기만 존재하구요.

제가 아직 많이 부족해서 도무지 모르겠습니다...

김기오

unread,
Aug 20, 2009, 11:18:03 PM8/20/09
to 어셈러브
재혁님 말씀은 그런 절차로 실행된다는 것이고
각각의 절차가 하나의 명령으로 실행되서 여러 명령이 실행되는게 아니라
모든 동작이 하드웨어적으로 구현되어 있어서 한두 클럭안에 실행이 됩니다.

뺄셈도 보수의 덧셈으로 구현되므로 누산기만 있어도 되구요.
혹시 논리 회로나 디지털 회로 수업을 들으신적 있나요?
게이트와 플립플롭등에 대해 먼저 알아야 실제로 어떤 명령어가
어떻게 하드웨어적으로 구현되는지 알고 몇 클력이 왜 필요한지 알 수 있습니다.

CCUPER

unread,
Aug 21, 2009, 7:24:19 AM8/21/09
to 어셈러브
아! 그렇군요...
간단히 말해 뺄셈연산은 덧셈연산 소프트웨어적으로 구현한 것이 아닌
하드웨어로 구현되있는 거네요..

감사합니다^^궁금증이 풀렸어요.

> > 제가 아직 많이 부족해서 도무지 모르겠습니다...- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -

Reply all
Reply to author
Forward
0 new messages