KHOA ĐIỆN TỬ VIỄN THÔNG
BỘ MÔN ĐIỆN TỬ TIN HỌC
MÔN HỌC: KỸ THUẬTVIXỬ LÝ
Học kỳ: 2 Năm học: 2009-2010
BÀI TẬP VỀ NHÀ SỐ 3
Hạn nộp: Buổi học VXL đầu tiên của tuần 32 (nộp quá hạn sẽ nhận điểm 0)
Hạn trả bài: Buổi học cuối cùng của tuần 34
Bài 1 (20 điểm). Cho trạng thái của một hệ vixử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
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)
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;
}
}
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.
. 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
BÀI TẬP VỀ NHÀ SỐ 3
Hạn nộp: Buổi học VXL đầu tiên. (nộp quá hạn sẽ nhận điểm 0)
Hạn trả bài: Buổi học cuối cùng của tuần 34
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