Tải bản đầy đủ (.pdf) (6 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (246.38 KB, 6 trang )

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

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











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

.stack 100
.data
STR DB 6 DUP(‘$’)
A DW 100h
.code
mov ax, @data
mov ds, ax

mov ax, A
mov bx, 10
xor cx, cx
Label1:
test ax, ax
jz Label2
xor dx, dx
div bx
push dx
inc cx
jmp Label1
Label2:

lea bx, STR
xor di, di
Label3:
pop ax
or al, 30h
mov [bx][di], al
inc di
loop Label3
Lable4:
mov dx, bx
mov ah, 9
int 21h
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)
Lệnh

CX = ?

CX = ?
pop ax
AX



or al, 30h
AX



mov [bx][di], al
STR



inc di
DI




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








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.
Lệnh

CX = 3
CX = 2
CX = 1
pop ax
AX
0002
0005
0006
or al, 30h
AX
0032
0035
0036
mov [bx][di], al
STR
‘2’,‘$’,’$’,‘$’,’$’,‘$’
‘2’,‘5’,’$’,‘$’,’$’,‘$’
‘2’,‘5’,’6’,‘$’,’$’,‘$’

inc di
DI
0001
0002
0003

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
So sánh 2 phần tử 5 điểm
Chú thích tốt 5 điểm










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
js END_WHILE ; jb END_WHILE
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:
}
}
















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
Đổi mã ký tự – 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

; 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

×