1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Bài tập Vi xử lý có đáp án số 3

6 3,6K 52

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 246,38 KB

Nội dung

Cấu trúc bên trong của 8086, các thanh ghi, chế độ địa chỉ, mã hóa lệnh, quản lý bộ nhớ, so sánh cấu trúc bên trong của PIC với 8086Viết lại thân hàm InsertionSort(short A[], short N) cho dưới đây bằng ASSEMBLY (cho 8086)

Trang 1

KHOA ĐIỆN TỬ VIỄN THÔNG

BỘ MÔN ĐIỆN TỬ TIN HỌC

- MÔN HỌC: KỸ THUẬT VI XỬ LÝ Học kỳ: 2 Năm học: 2009-2010 ĐÁP ÁN BÀI TẬP VỀ NHÀ SỐ 3

Bài 1 (20 điểm) Cho trạng thái của một hệ vi xử lý 8086 như sau:

Các thanh ghi: AX = 4A07, DX = FF6A, BX = 075C, SI = 0008, DI = 000A, CS = 8BB0,

DS = 4636, IP = 0003, FLAGS = 0000

Bộ nhớ:

Địa chỉ vật lý: Giá trị 8 ô nhớ

46AC0: A6 43 C0 49 B5 F6 20 64

46AC8: 38 C5 DE 80 29 73 44 E8

8BB00: B8 67 01 02 00 72 04 03

8BB08: C3 02 61 04 03 84 02 00

a) Giải mã 3 lệnh đầu tiên mà CPU sẽ thực hiện và viết các lệnh đó theo mẫu sau (15 điểm):

CS:giá trị của IP các byte mã lệnh lệnh ASEMBLY ; chú thích b) Cho biết giá trị các thanh ghi AX và FLAGS sau lệnh thứ 3 (5 điểm)

Bảng các mã lệnh: tra tại http://www.mlsite.net/8086

Giải:

a

CS:0003 02 00 ADD AL, [BX + SI]

; cộng ô nhớ DS:[BX + SI] vào AL

CS:0005 72 04 JB Label

; Lệnh JB không được thực hiện vì CF = 0

CS:0007 03 C3 ADD AX, BX ; cộng BX vào AX

Label:

b Giá trị các thanh ghi AX và FLAGS sau lệnh thứ 3

AX = 5209h và FLAGS = 0014h

Trang 2

Bài 2 (20 điểm) Cho chương trình ASSEMBLY sau:

.stack 100

.data

STR DB 6 DUP(‘$’)

.code

mov bx, 10

Label1:

test ax, ax

xor dx, dx

div bx

inc cx

Label2:

lea bx, STR

xor di, di

Label3:

pop ax

mov [bx][di], al

inc di

Lable4:

END

a) Sau khi thực hiện lệnh trước Label3, cho biết giá trị của các thanh ghi BX, CX, DI

và các byte bắt đầu từ SS:SP? (10 điểm)

b) Điền giá trị vào bảng sau khi thực hiện từng lệnh trong đoạn từ Lable3 đến Lable4 (5 điểm)

c) Cho biết kết quả hiện trên màn hình (5 điểm)

Trang 3

Hướng dẫn giải bài 2

a Trước Label3, BX = 0000, CX = 0003, DI = 0000 và các byte từ địa chỉ

SS:SP là: 02 00 05 00 06 00

b

mov [bx][di], al STR ‘2’,‘$’,’$’,‘$’,’$’,‘$’ ‘2’,‘5’,’$’,‘$’,’$’,‘$’ ‘2’,‘5’,’6’,‘$’,’$’,‘$’

c 256

Bài 3 (30 điểm) Viết lại thân hàm InsertionSort(short A[], short N) cho dưới đây bằng

ASSEMBLY (cho 8086)

void InsertionSort(short A[], short N) // short – kiểu biến 2 byte

{

for (short i = 1; i < N; i++)

{

short X = A[i];

short j = i – 1;

while (j >= 0 && A[j] > X) {

A[j + 1] = A[j];

j– –;

} A[j + 1] = X;

}

}

Hướng dẫn giải bài 3:

Tổ chức được vòng FOR 10 điểm

Tổ chức được vòng WHILE 10 điểm

Trang 4

void InsertionSort(short A[], short N)

{

asm {

mov bx, ss:A mov cx, ss:N

shl cx, 1 mov di, 2 FOR:

cmp di, cx jae END_FOR mov ax, [bx][di]

mov si, di dec si dec si WHILE:

test si, 8000h ; hoac cmp si, 0

mov dx, [bx][si]

cmp dx, ax jbe END_WHILE mov [bx][si+2], dx dec si

dec si jmp WHILE

END_WHILE:

mov [bx][si+2], ax inc di

inc di jmp FOR

END_FOR:

}

}

Trang 5

Bài 4 (30 điểm) Viết lại chương trình C sau đây bằng ASSEMBLY (cho 80486):

#include <stdio.h>

#include <conio.h>

void toupper(char *s) {

int i = 0;

while (s[i] != 0) {

if (s[i] >= ‘a’ && s[i] <= ‘z’)

s[i] –= 32;

i++;

} }

main()

{

char STR[100];

gets(STR); // hàm nhập xâu ký tự toupper(STR);

puts(STR); // hàm in xâu ký tự }

Chú ý: Các hàm puts và gets có thể dùng ngắt 21h Hàm toupper cần được viết

dưới dạng chương trình con

Hướng dẫn giải bài 4:

Viết được đoạn main – 5 điểm

Cất các thanh ghi – 5 điểm

Gán địa chỉ của tham số vào ebx – 5 điểm

Kiểm tra điều kiện kết thúc FOR – 5 điểm

Khôi phục các thanh ghi – 5 điểm

.stack 100

.data

STR DB 100 DUP(?) ; char STR[100]

.code

MAIN PROC

mov ax, @data

mov ds, ax

; gets(STR)

mov ah, 10

lea edx, STR

int 21h

; toupper(STR)

lea eax, STR

push eax

CALL TOUPPER

Trang 6

; puts(STR)

mov ah, 9

lea edx, STR

int 21h

; exit to DOS

mov ah, 4Ch

int 21h

MAIN ENDP

TOUPPER PROC

; cất các thanh ghi vào stack, gán địa chỉ offset của tham số cho ebx push ebp

mov ebp, esp

push eax

push edi

mov ebx, [ebp + 16]

; duyệt xâu ký tự

xor edi, edi

FOR:

mov al, [ebx][edi] ; al chứa mã ký tự đang duyệt

; kiểm tra điều kiện kết thúc vòng for

cmp al, 13

je END_FOR

; đổi ký tự thường thành ký tự in hoa

cmp al, 'a'

jb NO_CHANGE

cmp al, 'z'

ja NO_CHANGE

sub al, 20h

mov [ebx][edi], al

NO_CHANGE:

inc edi ; duyệt ký tự tiếp theo

jmp FOR

END_FOR:

; khôi phục các thanh ghi

pop edi

pop eax

pop ebp

TOUPPER ENDP

END MAIN

Ngày đăng: 16/05/2014, 23:16

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w