• 통큰쿠폰이벤트-통합

어셈블리언어(시스템프로그래밍) 과제-2 (산술연산과 주소지정방식 사용 프로그램)

동긔
개인인증판매자스토어
최초 등록일
2021.11.24
최종 저작일
2020.10
15페이지/ 어도비 PDF
가격 3,000원 할인쿠폰받기
다운로드
장바구니
  • EasyAI 홍보배너

소개글

어셈블리언어(시스템프로그래밍) 과제-2 (산술연산과 주소지정방식 사용 프로그램) 입니다.
직접 강의를 듣고 책을 찾아보면서 복습한 뒤 과제를 작성한 것입니다.
과제점수로도 만점을 받았던 자료입니다.
혹시나 모르시는 내용이 있으시면 문의 주시면 감사하겠습니다.
자세히 설명해 드릴게요!
과제를 하실 때 참고하시는 용도로 사용해주시면 감사하겠습니다.

목차

없음

본문내용

1. 크기가 다른 피연산자에 대한 연산 프로그램
다음 수식을 계산하는 프로그램을 작성하시오. 여기서 val1, val2, val3는 각각 32비트
(dword), 8비트(byte), 16비트(word) 데이터로 선언하고, 초기값은 각각 8, -25, 10이다. EAX = -val1 + val2 - val3 + 1
- 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> EAX = -val1 + val2 - val3 + 1, 즉 -8 + (-25) - 10 + 1 = -42이다. -42를 2진수로 표현하면 1111 1111 1111 1111 1111 1111 1101 0110인데 2진수표현을 16
진수로 표현하면 FFFFFFD6 이렇게 표현할 수 있다. 2. 플래그 설정 결과 확인
다음과 같은 8비트 정수 덧셈을 수행하여 결과를 AL에 저장하는 프로그램을 작성하고 계산
직후에 call DumpRegs를 사용하여 결과를 출력하는 프로그램을 작성하고, 각 계산 직후의
플래그 CF, OF, SF 값을 적고, 플래그 값이 1인 경우에 그 이유를 설명하시오.
60h + 30h 0F0h + 10h 90h + 85h
(1) 60h + 30h인 경우
- 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> AL에 60h + 30h 저장한 경우 60h + 30h = 90h
위의 결과처럼 CF = 0, SF = 1, OF = 1이다. unsigned 결과 10진수 96 (60h를 나타냄) -> 144 (90h) 으로 됐으므로 CF = 0이 된다.
(8비트 unsigned표현 범위가 0 ~ 255인데 unsigned표현 결과가 표현 범위를 벗어나지 않았
으므로)
signed결과에서 60h => 0110 0000 => 96이고 30h => 0011 0000 => 48
90h => 1001 0000 => -112이다. 10진수 96 -> -112으로 됐으므로 OF = 1이다. (8비트 signed표현 범위가 –128 ~ 127인데
96 + 48 = 144가 돼야하지만 8비트 signed 표현 범위에 넘어서서 오버플로우가 발생하여 96
-> -112가 됐으므로 OF = 1이다.)
또한 음수값이므로 SF = 1이다. (최상위비트가 1이므로, 90h => 1001 0000)
(2) 0F0h + 10h인 경우
- 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> AL에 0F0h + 10h 저장한 경우 0F0h + 10h = 100h (맨앞 1 날라감, 즉 00h)
위의 결과처럼 CF = 1, SF = 0, OF = 0이다. unsigned 결과에서 0F0h => 1111 0000 => 240 이고 10h => 0001 0000 => 16
00h => 0000 0000 => 0이다. 10진수 240 -> 0으로 됐으므로 CF = 1이다. (8비트 unsigned표현 범위가 0 ~ 255인데
240 + 16 = 256가 돼야하지만 8비트 unsigned 표현 범위에 넘어서서 오버플로우가 발생하
여 240 -> 0이 됐으므로 CF = 1이다.)
signed결과에서 0F0h => 1111 0000 => -16이고 10h => 0001 0000 => 16
00h => 0000 0000 => 0이다. 10진수 -16 -> 0으로 됐으므로 OF = 0이다. (8비트 signed표현 범위가 –128 ~ 127인데 –
16 + 16 = 0이 돼서 8비트 signed 표현 범위에 벗어나지 않으므로 OF = 0이다.)
또한 양수값이므로 SF = 0이다. (최상위비트가 0이므로, 00h => 0000 0000)
(2) 90h + 85h인 경우
- 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> AL에 90h + 85h 저장한 경우 90h + 85h = 115h (맨앞 1 날라감, 즉 15h)
위의 결과처럼 CF = 1, SF = 0, OF = 1이다. unsigned 결과에서 90h => 1001 0000 => 144이고 85h => 1000 0101 => 133
15h => 0001 0101 => 21이다. 10진수 144 -> 21으로 됐으므로 CF = 1이다. (8비트 unsigned표현 범위가 0 ~ 255인데
144 + 133 = 277가 돼야하지만 8비트 unsigned 표현 범위에 넘어서서 오버플로우가 발생하
여 144 -> 21이 됐으므로 CF = 1이다.)
signed결과에서 90h => 1001 0000 => -112이고 85h => 1000 0101 => -123
15h => 0001 0101 => 21이다. 10진수 -112 -> 21으로 됐으므로 OF = 1이다. (8비트 signed표현 범위가 –128 ~ 127인데 –112 + (-123) = -235이 돼야하지만 8비트 signed 표현 범위에 넘어서서 오버플로우가 발생
하여 –112 -> 21이 됐으므로 OF = 1이다.)
또한 양수값이므로 SF = 0이다. (최상위비트가 0이므로, 15h => 0001 0101)
3. 여러 가지 연산자와 디렉티브 사용
darray dword 10004050h, 20002030h, 30000000h
적절한 어셈블리언어 연산자를 사용하여
① 배열 darray의 원소의 개수와 메모리 크기를 각각 EAX, EBX에 저장하고, ② 배열 darray의 두번째 원소의 하위 16비트 값을 ptr연산자를 사용하여 CX에 저장하고, ③ label 디렉티브를 사용하여 data label을 정의하고 이를 사용하여 배열 darray의 첫 번
째 원소의 하위 16비트 값을 DX에 저장한 후에 call DumpRegs를 사용하여 출력하는 프로
그램을 작성하고 결과를 확인하시오. - 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> 결과를 확인해보면 EAX에는 배열의 원소의 개수인 3이 저장되어 있고, EBX에는 메모리
크기인 4x3 = C(=12)가 저장되어 있고, ECX의 하위 16비트가 배열 darray의 두 번째 원소
의 하위 16비트 값인 2030이 저장되어 있는 것을 확인할 수 있다. 또한 EDX의 하위 16비트
가 label로 통하여 전달한 배열 darray의 첫 번째 원소의 하위 16비트인 4050이 저장되어
있는 것을 확인할 수 있다. 4. 여러 가지 주소지정방식 사용
데이터 선언이 다음과 같이 되어 있다. darray dword 1000h, 5000h, 9000h
프로그램을 다음과 같이 작성하시오. - 첫 번째 원소와 두 번째 원소를 직접 주소지정 방식으로 각각 eax와 ebx에 저장하시오. - 배열의 주소를 esi에 저장하고, 간접 주소지정방식으로 첫 번째 원소를 ecx에 저장하시오. - esi에 세 번째 원소의 배열 시작주소로부터의 오프셋 주소를 저장하고 인덱스 주소지정방
식으로 세 번째 원소를 edi에 저장하시오. (배열주소를 상수로 사용) - call DumpRegs를 사용하여 레지스터 값을 출력하여 동작을 확인하시오. - 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> 코드 및 결과를 확인해보면 EAX에 darray 배열의 첫 번째 원소인 1000h가 저장되고
EBX에는 배열의 두 번째 원소인 5000h가 저장된다. 그리고 ECX에는 간접주소지정방식을 이
용하여 배열의 첫 번째 원소인 1000h가 나오는 것을 확인할 수 있다. 또한 EDI에는 인덱스
주소지정방식을 이용하여 배열의 세 번째 원소인 9000h가 나오는 것을 확인할 수 있다. 5. 루프를 사용하는 프로그램
(1) loop 명령어의 동작을 설명하시오. => loop 명령어는 특정한 횟수를 반복 수행하게끔 동작시켜주는 명령어이다. 반복문을 돌리기
위해서 루프카운터, 즉 반복횟수 계수가 있어야 하는데 이때 ECX register를 사용한다. real
mode에서는 CX가 루프 카운터로 사용된다.
(2) 다음 32비트 배열의 데이터의 합을 계산하는 프로그램을 간접주소지정과 loop 명령어를
사용하여 작성하시오. (esi는 배열 시작주소로 초기화하여 사용하고, 합은 eax에 저장하고, 결
과는 call DumpRegs로 확인하시오. 반복할 때마다 esi에 4를 더하여 다음 배열원소의 주소
로 변경한다.)
arrayD dword 1000h, 2000h, 3000h, 4000h, 5000h, 8000h
- 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> 코드 및 출력결과를 살펴보면 루프문을 통하여 EAX에 1000h + 2000h + 3000h +
4000h + 5000h + 8000h = 17000h (23/16 = 1, 나머지 = 7 이기 때문에)이 저장됐다.
(2) 위의 프로그램을 인덱스주소지정과 loop 명령어를 사용하여 작성하시오. (esi는 0으로 초
기화하여 사용하고, 합은 eax에 저장하고, 결과는 call DumpRegs로 확인하시오. 반복할 때
마다 esi에 4를 더하여 다음 배열원소를 가리키도록 한다.) - 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> 코드 및 출력결과를 살펴보면 루프문을 통하여 EAX에 1000h + 2000h + 3000h +
4000h + 5000h + 8000h = 17000h (23/16 = 1, 나머지 = 7 이기 때문에)이 저장됐다.
(3) 다음 16비트 배열의 데이터의 합을 계산하는 프로그램을 인덱스 주소지정과 loop 명령어
를 사용하여 작성하시오. 데이터는 signed 정수로 가정하고, 합을 계산할 때에 32비트 결과를
갖도록 16비트 오퍼랜드의 크기를 32비트로 확장하여 레지스터 ebx에 저장한 후에 덧셈연산
을 수행하시오. (esi는 0으로 초기화하고, 합은 32비트 레지스터 eax에 저장한다. 반복할 때
마다 esi에 2를 더하여 다음 배열원소의 오프셋 주소가 되도록 변경한다.)
arrayW word 1000h, 2000h, 3000h, 4000h, 5000h, 8000h
- 코드
- 코딩 후 어셈블 결과
- 출력 결과
=> 일단 요구하는 조건에서 데이터를 signed 정수로 가정하였다. 코드 및 출력결과를 살펴보면 EAX가 7000h가 나오는데 그 이유는 배열의 각 원소의 방의 값
인(크기는 16비트) 1000h, 2000h, 3000h, 4000h, 5000h까지는 movsx 명령어를 이용하여
32비트 sign 확장을 하여도 그대로 1000h, 2000h, 3000h, 4000h, 5000h이 나온다.(앞에 0
생략) 하지만 8000h는 32비트로 sign 확장을 하게 되면 MSB가 1인데 이것을 확장하여
FFFF8000h가 나오게 된다. 이렇게 1000h, 2000h, 3000h, 4000h, 5000h까지 더한
0000F000h에서 sign 확장한 FFFF8000h을 더하게 되면 00007000h가 나오게 된다. 32비트
까지 출력되므로 오버플로우 발생하여 출력값이 제대로 나오지 않는다.
(4) (2)의 결과와 (1)의 결과가 차이가 있는가? 차이가 있다면 이유는 무엇인가?
=> EAX의 값은 차이가 없지만 ESI의 값은 차이가 있다. 코드를 살펴보면 (1)은 offset연산자
를 이용하여 arrayD 배열의 시작주소를 직접 esi에 초기화한 상태에서 간접주소지정방식을
이용하여 배열의 방에 접근하였고 (2)에서는 처음에 esi를 0으로 초기화하여 인덱스주소지정
방식을 사용하여 각 배열의 방에 접근하였다. 더 나아가 (1), (2)의 EAX의 결과값과 (3)의
EAX의 결과값이 다르게 나오는데 그 이유는 (1), (2)는 32비트 unsigned형 배열이고 그 배열
의 각 원소의 합이 unsigned형으로 나오지만 (3)은 16비트 배열의 합을 32비트 배열의 합으
로 나타낼 때 각 배열의 원소들을 부호확장을 하여 나타냈기 때문에 서로 다를 수밖에 없다.

참고 자료

없음
동긔
판매자 유형Diamond개인인증

주의사항

저작권 자료의 정보 및 내용의 진실성에 대하여 해피캠퍼스는 보증하지 않으며, 해당 정보 및 게시물 저작권과 기타 법적 책임은 자료 등록자에게 있습니다.
자료 및 게시물 내용의 불법적 이용, 무단 전재∙배포는 금지되어 있습니다.
저작권침해, 명예훼손 등 분쟁 요소 발견 시 고객센터의 저작권침해 신고센터를 이용해 주시기 바랍니다.
환불정책

해피캠퍼스는 구매자와 판매자 모두가 만족하는 서비스가 되도록 노력하고 있으며, 아래의 4가지 자료환불 조건을 꼭 확인해주시기 바랍니다.

파일오류 중복자료 저작권 없음 설명과 실제 내용 불일치
파일의 다운로드가 제대로 되지 않거나 파일형식에 맞는 프로그램으로 정상 작동하지 않는 경우 다른 자료와 70% 이상 내용이 일치하는 경우 (중복임을 확인할 수 있는 근거 필요함) 인터넷의 다른 사이트, 연구기관, 학교, 서적 등의 자료를 도용한 경우 자료의 설명과 실제 자료의 내용이 일치하지 않는 경우

이런 노하우도 있어요!더보기

최근 본 자료더보기
유니스터디 이벤트
어셈블리언어(시스템프로그래밍) 과제-2 (산술연산과 주소지정방식 사용 프로그램)
  • 유니스터디 이벤트
AI 챗봇
2024년 11월 25일 월요일
AI 챗봇
안녕하세요. 해피캠퍼스 AI 챗봇입니다. 무엇이 궁금하신가요?
4:59 오전
문서 초안을 생성해주는 EasyAI
안녕하세요. 해피캠퍼스의 방대한 자료 중에서 선별하여 당신만의 초안을 만들어주는 EasyAI 입니다.
저는 아래와 같이 작업을 도와드립니다.
- 주제만 입력하면 목차부터 본문내용까지 자동 생성해 드립니다.
- 장문의 콘텐츠를 쉽고 빠르게 작성해 드립니다.
이런 주제들을 입력해 보세요.
- 유아에게 적합한 문학작품의 기준과 특성
- 한국인의 가치관 중에서 정신적 가치관을 이루는 것들을 문화적 문법으로 정리하고, 현대한국사회에서 일어나는 사건과 사고를 비교하여 자신의 의견으로 기술하세요
- 작별인사 독후감