Bài tập buoi 3 - 4

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 4

Bài tập buổi 3, 4

Bài 1.
Giả sử các giá trị sau được lưu trữ tại các địa chỉ bộ nhớ và thanh ghi như sau:

Address Value Register Value


0x100 0xFF %eax 0x100
0x104 0xAB %ecx 0x1
0x108 0x13 %edx 0x3
0x10C 0x11

Điền giá trị theo ý nghĩa của các toán hạng(operand) trong bảng sau như ví dụ
trong các hàng đầu tiên:

Operand Value
%eax 0x100 ( thanh ghi )
0x104 0xAB (địa chỉ tuyệt đối)
$0x108 ----------
(%eax) ----------
4(%eax) ----------
9(%eax,%edx) ----------
260(%ecx,%edx) ----------
0xFC(,%ecx,4) ----------
(%eax,%edx,4) ----------

Bài 2.

Đối với mỗi dòng lệnh sau, hãy xác định hậu tố thích hợp dựa trên toán hạng. (Ví
dụ: Mov có thể được viết lại dưới dạng Movb, Movw hoặc Movl.)
1 mov %eax, (%esp)
2 mov (%eax), %dx
3 mov $0xFF, %bl
4 mov (%esp,%edx,4), %dh
5 push $0xFF
6 mov %dx, (%eax)
7 pop %edi

Bài 3.
Mỗi dòng mã sau đây sẽ tạo một thông báo lỗi khi chúng ta gọi trình biên dịch
chương trình. Giải thích những gì sai với mỗi dòng.
1 movb $0xF, (%bl)
2 movl %ax, (%esp)
3 movw (%eax),4(%esp)
4 movb %ah,%sh
6 movl %eax,%dx
Bài 4.

Giả sử thanh ghi %eax giữ giá trị x và %ecx giữ giá trị y. Điền vào bảng dưới đây
với các công thức chỉ ra giá trị sẽ được lưu trữ trong thanh ghi %edx:
Instruction Result
leal 6(%eax), %edx ----------
leal (%eax,%ecx), %edx ----------
leal (%eax,%ecx,4), %edx ----------
leal 7(%eax,%eax,8), %edx ----------
leal 0xA(,%ecx,4), %edx ----------
leal 9(%eax,%ecx,2), %edx ----------
Bài 5.

Giả sử các giá trị sau được lưu trữ tại các địa chỉ bộ nhớ và thanh ghi đã chỉ
định:

Address Value Register Value


0x100 0xFF %eax 0x100
0x104 0xAB %ecx 0x1
0x108 0x13 %edx 0x3
0x10C 0x11
Điền vào bảng sau nơi lưu kết quả và giá trị trả về:
Instruction Destination Value
addl %ecx,(%eax) --------------- ----------
subl %edx,4(%eax) --------------- ----------
imull $16,(%eax,%edx,4) --------------- ----------
incl 8(%eax) --------------- ----------
decl %ecx --------------- ----------
subl %edx,%eax --------------- ----------
Bài 6.
Giả sử chúng ta muốn tạo mã assembly cho hàm C sau
int shift_left2_rightn(int x, int n)
{
x <<= 2;
x >>= n;
return x;
}
đoạn mã sau là một phần của mã assembly để thực hiện và trả lại giá trị
cuối cùng trong thanh ghi %eax. Hai lệnh chính đã dấu đi. Các tham số x và n
được lưu trữ tại các vị trí bộ nhớ với offset 8 và 12, tương ứng với địa chỉ trong
thanh ghi %ebp.

1 movl 8(%ebp), %eax Get x


2 x<<=2
3 movl 12(%ebp), %eax Get n
4 x>>=n

Điền các lệnh còn thiếu vào đoạn chương trình trên, theo các chú thích
bên phải. phép dịch phải là dịch số học.

Bài 7.

Đoạn code ở gần đầu của một procedure C được biên dịch như sau:
1 subl $12, %esp
2 movl %ebx, (%esp)
3 movl %esi, 4(%esp)
4 movl %edi, 8(%esp)
5 movl 8(%ebp), %ebx
6 movl 12(%ebp), %edi
7 movl (%ebx), %esi
8 movl (%edi), %eax
9 movl 16(%ebp), %edx
10 movl (%edx), %ecx
……..
Chỉ có ba thanh ghi (% ebx,% esi và% edi) được lưu trên stack (dòng 2 tới 4).
Chương trình thay đổi các thanh ghi nầy và 3 thanh ghi khác (%eax,%ecx, và
%edx). Vào cuối procedure, các giá trị của các thanh ghi %edi,%esi và %ebx
được trả lại (không hiển thị ở đây), trong khi ba thanh ghi còn lại vẫn giữ giá trị bị
thay đổi. Giải thích tại sao procedure không trả lại giá trị ban đầu của 3 thanh ghi
nầy.
Bài 8.
Cho 1 hàm C

1 int proc(void)
2{
3 int x,y;
4 scanf("%x %x", &y, &x);
5 return x-y;
6}

gcc biên dịch thành mã như sau:

1 proc:
2 pushl %ebp
3 movl %esp, %ebp
4 subl $40, %esp
5 leal -4(%ebp), %eax
6 movl %eax, 8(%esp)
7 leal -8(%ebp), %eax
8 movl %eax, 4(%esp)
……….

Giả sử procedure proc bắt đầu chạy với giá trị thanh ghi như sau:
Register value
%esp 0x800040
%ebp 0x800060

A. Giá trị của thanh ghi %ebp có được ở dòng thứ 3 là bao nhiêu ?
B. Giá trị của thanh ghi %esp có được ở dòng thứ 4 là bao nhiêu ?

c. Đoạn code truyền tham số và gọi scanf? Giải


thích?
d. Xác định vị trí lưu của x và y? Giải thích?
B.

You might also like