상태 비트의 종류

 이름

 역할

SF(Sign Flag)

  • 결과가 부호 값을 가질 경우(음수일 경우) 발생
  • 발생 예
    • 양수 -> 음수(7Fh->80h)
    • 음수 -> 음수(80h->81h)

CF(Carry Flag)

  • 결과에 올림수나 빌림이 생길 때 발생
  • 발생 예
    • 덧셈에서 올림(Carry) 발생
    • 뺄셈에서 빌림(Borrow) 발생

OF(Overflow Flag)

  • 결과가 한계 값을 초과하는 경우 발생
  • 발생 예
    • 7Fh(양수 최대값)에서 1을 더하여 80h(음수)가 되는 경우
    • 음수 최대값(FFh)에서 1을 더하여 00h(양수)이 되는 경우

ZF(Zero Flag)

  • 결과가 0의 값을 가질 경우 발생
  • 발생 예
    • eax가 1일 때, DEC eax(결과가 0)
    • eax가 -5일 때, ADD eax, 5(결과가 0)



오늘의 명령어

Mnemonic

Operand

역할

INC(Increase)

A

A의 값을 1 증가

DEC(Decrease)

A

A의 값을 1 감소

NEG(Negative)

A

A의 값에 2의 보수를 취하여 값을 반전시킴(양수->음수, 음수->양수)

SHL(Shift Left)

A, B

A의 값을 왼쪽으로 B만큼 쉬프트. (2의 B승 만큼 곱하는 효과) 

SHR(Shift Right)

A, B

A의 값을 오른쪽으로 B만큼 쉬프트. (2의 B승 만큼 나누는 효과) 

MUL(Multiplication)

A, B

A

A와 B를 곱해 eax(Accumulator)에 저장.

피연산자가 한개인 경우 eax의 값에 곱한다.

곱셈은 자릿수가 늘어날 수 있기 때문에 용량이 부족할 수 있어 저장시 1*1=2, 2*2=4 등으로 용량이 확장된다.



연습 문제(Introduction to 80x86 Assembly Language and Computer Architecture pdf 120p)


소스 코드

.386

.MODEL FLAT


ExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD


INCLUDE io.h


cr    EQU    0dh ; 캐리지 리턴

Lf    EQU    0ah ; 라인 피드


.STACK 4096


.DATA

Prompt1 BYTE "This program will evaluate the expression", cr, Lf, Lf ; 출력할 문장1 시작

BYTE " 2 ( - x + y - 1 ) + z", cr, Lf, Lf

BYTE "for your choice of integer values.", cr, Lf, Lf

BYTE "Enter value for x : ", 0 ; 여기까지 출력됨

Prompt2 BYTE "Enter value for y : ", 0 ; 출력 문장 2

Prompt3 BYTE "Enter value for z : ", 0 ; 출력 문장 3

Value BYTE 16 DUP( ? ) ; 계산 결과 값

Answer BYTE cr, Lf, "The result is " ; 결과 출력 문장 시작

Result BYTE 6 DUP( ? )

BYTE cr, Lf, 0 ; 결과 출력 문장 끝


.CODE

_start:

output Prompt1 ; 문장 1 출력

input Value, 16 ; x값 입력

atoi Value ; ASCII to Integer

neg ax ; 값 반전(-, 2의 보수)

mov dx, ax ; dx에 반전된 x값을 넣음


output Prompt2 ; 문장 2 출력

input Value, 16 ; y값 입력

atoi Value ; ASCII to Integer

add dx, ax ; dx에 y값을 더함( -x+y )


dec dx ; dx에서 1을 뺌( -x+y-1 )


add dx, dx ; dx에 dx의 값을 더함( 2(-x+y-1) )


output Prompt3 ; 문장 3 출력

input Value, 16 ; z값 입력

atoi Value ; z값을 정수형으로 변환

add dx, ax ; dx에 변환된 z값을 더함( 2(-x+y-1))+z )


itoa Result, dx ; 결과 값이 저장된 dx의 값을 ASCII로 바꾸어 Result에 넣음


output Answer ; Answer 문장 출력, 값도 함께 출력됨.


INVOKE   ExitProcess, 0 ; 끝

        

PUBLIC  _start


END



io.h


io.obj


io.h는 어셈블리 컴파일에 필요하고(컴파일만 하여 obj파일로 만들어야함)

io.obi는 링크시 함께 있어야 합니다.



실행 결과

+ Recent posts