Professional Documents
Culture Documents
KỸ THUẬT VI XỬ LÝ
2
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
NỘI DUNG
1. Giới thiệu về lập trình Assembly
2. Tập lệnh của ARM
1. Lệnh xử lý dữ liệu (data processing)
2. Dịch chuyển dữ liệu (data movement)
3. Điều khiển chương trình (flow control)
4. Ngắt
3
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lập trình cho VXL là lập trình bằng ngôn ngữ máy hay hợp ngữ
(Assembly). Công cụ hỗ trợ lập trình hợp ngữ: cú pháp, tập lệnh,
thư viện,…gọi là Assembler.
Cấu trúc chung của một chương trình hợp ngữ cho ARM:
operands
label opcode comment 4
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
opcode
NỘI DUNG
1. Giới thiệu về lập trình Assembly
2. Tập lệnh của ARM
1. Lệnh xử lý dữ liệu (data processing)
2. Di chuyển dữ liệu (data transfer)
3. Điều khiển chương trình (flow control)
6
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lệnh xử lý dữ liệu:
• Lệnh xử lý dữ liệu bao gồm lệnh di chuyển dữ liệu giữa
các thanh ghi (move:MOV), lệnh số học (arithmetic
instruction), lệnh logic (logical instruction), lệnh so sánh
(comparison) và lệnh nhân (multiply).
• Hầu hết các lệnh xử lý dữ liệu có thể dùng bộ dịch
(barrel shifter) để xử lý một trong những toán hạng của
lệnh tăng tốc độ xử lý và tính toán dữ liệu.
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lệnh xử lý dữ liệu
• Arithmetic: ADD ADC SUB SBC RSB RSC
• Logic: AND ORR EOR BIC
• Comparisons: CMP CMN TST TEQ
• Data movement: MOV MVN
Lưu ý: các lệnh chỉ thực hiện trên thanh ghi, KHÔNG thực hiện trên
bộ nhớ. (RISC)
Cú pháp:
<Operation>{<cond>}{S} Rd, Rn, Operand2
Lệnh so sánh tác động đến cờ và thanh ghi Rd không bị tác
động
Lệnh di chuyển dữ liệu không tác động đến thanh ghi Rn
Toán hạng thứ 2 (operand2) được đưa đến ALU thông qua bộ dịch
chuyển barrel shifter
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
26
Ví dụ: MOVS, SUBS,
ADDSN,Z,(C,V:
not affected)
16 trạng
thái đk:
CS,CC, I=0, operand2 là thanh ghi
EQ,NE I=1, operand2 là số nguyên
hexa, tức thời
…
Cấu trúc lệnh
được mã hóa: ghi
vào SPSR (R13)
Operand2=Imm, 12
bit=>8 bit cho Imm,
4 bit để quay
quay được 16 bit.
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Bit I
• 1110.0000.1000(S).0001(Rn).0101.
(Rd).0000.0000.0011=0xE08
• 0001.000(I)0.100(opt)1(S).0000(Rn).0000.(Rd).0001.0.(#shift)000.0000=0x10900100
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Cấu trúc lệnh:
Lệnh:
MOV R4,#0x00
MOV R5,#0x05
MOV R7,#0x02
ADDEQ R4, R5, R7, ASR#7
BTVN: Hãy phân tích trạng thái thanh ghi SPSR sau khi
thực hiện chương trình trên (xem 32 bit của SPSR lần lượt
như thế nào?)
Kq: R4=#0x00;SPSR=00000000100001010100001111000111(2)=0x008543C7
0000 1000 Mov r1,#15 ;r1=15 0000 1004 0 0000 0000 0000 000f ffff ffff
Lệnh logic
• AND R0, R1, R2 ; R0 = R1 and R2
• ORR R0, R1, R2 ; R0 = R1 or R2
• EOR R0, R1, R2 ; R0 = R1 xor R2
• BIC R0, R1, R2 ; R0 = R1 and (~R2) and not
Lệnh BIC là lệnh xóa bit: Các bit trong R1 sẽ bị xóa bởi các bit được
đánh dấu trong R2 (ở cùng vị trí nếu cùng giá trị thì xóa về 0 và ngược lại
R1 = 0x11111111 R2 = 0x01100101
BIC R0, R1, R2
R0 = 0x10011010
Exercise 3 Current Program Status Register (CPSR)
R1=55H=0101 0101 B
R2=61H=0110 0001 B
9EH=1001 1110 B
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lệnh so sánh (comparison) &: AND, ^: XOR, | OR
• Các lệnh so sánh không tạo ra kết quả nhưng nó tác động đến
các bit cờ (N, Z, C, V) trong thanh ghi CPSR.
• Cú pháp: instruction<cond> Rn, N
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lệnh so sánh
• CMP R1, R2 ; Thiết lập cờ dựa trên kết quả R1 – R2
• CMN R1, R2 ; Thiết lập cờ dựa trên kết quả R1 + R2
• TST R1, R2 ; bit test: Thiết lập cờ dựa trên kq R1 and R2
• TEQ R1, R2 ; test equality: Thiết lập cờ dựa trên kq R1 xor R2
Lệnh so sánh
CMP
CMP r1,
r1,r2
r2 ;;set
setcc
ccon
onr1
r1--r2
r2(compare)
(compare)
Lệnh so sánh
Ví dụ:
R1 = a, R2 = b
if (R1<R2)
R1=a
else
R1=b
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
TST updates the N and Z flags
Exercise 6 according to the result, It
does not affect the C or V flags.
Fill in the shaded areas.
BTVN: Nhập hai số tùy ý cho vào thanh ghi R0, R1. Thực hiện phép nhân tích
lũy với phần tích lũy ở R2 và ghi vào R3.
Nhập 2 số tùy ý (không dấu hoặc có dấu) và di chuyển MOV32 vào R0, R1.
Lập trình nhân 64 bit dùng R5, R6 cho số 64 bit.
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Mã optcode và SPSR ở chế độ lệnh nhân
NỘI DUNG
1. Giới thiệu về lập trình Assembly
2. Tập lệnh của ARM
1. Lệnh xử lý dữ liệu (data processing)
2. Điều khiển chương trình (flow control)
3. Di chuyển dữ liệu (data transfer)
4. Ngắt
49
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lệnh rẽ nhánh: Branch (verb) branching
Thanh ghi CP (R15) sẽ lưu giá trị vào LR(R14) khi nhảy vào chương trình
con có nhãn label
• Lệnh rẽ nhánh không điều kiện
B label
….
label: ….
• Lệnh rẽ nhánh có điều kiện
MOV R0, #0
;{BL loop} optional
loop: ADD R0, R0, #1
CMP R0, #10
BNE loop
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lệnh rẽ nhánh: có nhiều kiểu rẽ nhánh khác nhau
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lệnh rẽ nhánh
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Lệnh rẽ nhánh
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
NỘI DUNG
1. Giới thiệu về lập trình Assembly
2. Tập lệnh của ARM
1. Lệnh xử lý dữ liệu (data processing)
2. Điều khiển chương trình (flow control)
3. Di chuyển dữ liệu (data transfer)
4. Ngắt
57
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
BT(ở lớp, về nhà): Hãy cho biết giá trị của R0,R1 trong
trường hợp trên.
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Chế độ Mô tả Địa chỉ bắt đầu Địa chỉ kết thúc Rn!
IA Increment after Rn Rn + 4*N – 4 Rn + 4*N
IB Increment before Rn + 4 Rn + 4*N Rn + 4*N
DA Decrement after Rn – 4*N + 4 Rn Rn-4*N
DB Decrement before Rn – 4*N Rn – 4 Rn – 4*N
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Một địa chỉ có thể là trước hoặc sau một địa chỉ của lệnh hoặc thanh ghi cơ sở
Ví dụ:
start MOV r0,#10
ADR r4,start ; => SUB r4,pc,#0xc
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
The ADR instruction loads an address within a certain range, without performing a data load.
ADR accepts a PC-relative expression, that is, a label with an optional offset where the address of the label is relative to the PC.
AREA Jump, CODE, READONLY ; Name this block of code
ARM ; Following code is ARM code
num EQU 2 ; Number of entries in jump table
ENTRY ; Mark first instruction to execute
start ; First instruction to call
MOV r0, #0 ; Set up the three arguments
MOV r1, #3
MOV r2, #2
BL arithfunc ; Call the function
stop
MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (formerly SWI)
arithfunc ; Label the function
CMP r0, #num ; Treat function code as unsigned
; integer
BXHS lr ; If code is >= num then return
ADR r3, JumpTable ; Load address of jump table
LDR pc, [r3,r0,LSL#2] ; Jump to the appropriate routine
JumpTable
DCD DoAdd
DCD DoSub
DoAdd
ADD r0, r1, r2 ; Operation 0
BX lr ; Return
DoSub
SUB r0, r1, r2 ; Operation 1
BX lr ; Return
END ; Mark the end of this file
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Hoán chuyển dữ liệu giữa ô nhớ và thanh ghi
Sử dụng lênh SWP (swap:hoán vị, hoán chuyển) để
exchange (chuyển đổi, tráo đổi) giữa bộ nhớ và thanh
ghi
Cú pháp:
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Funccopy
LDRB r2,[r1],#1
STRB r2,[r0],#1
CMP r2,#0
BNE Funccopy
MOV pc,lr
END ;End of the program
94
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
NỘI DUNG
1. Giới thiệu về lập trình Assembly
2. Tập lệnh của ARM
1. Lệnh xử lý dữ liệu (data processing)
2. Điều khiển chương trình (flow control)
3. Di chuyển dữ liệu (data transfer)
4. Biệt lệ/Ngắt (Exception/Interrupt)
95
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Ngắt mềm:
• Ngắt mềm (software interrupt) tạo ra một biệt lệ cho phép
ứng dụng gọi một số tác vụ của hệ điều hành.
• Cú pháp: SWI{cond} SWI_number
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Ngắt mềm:
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Số hiệu ngắt Mô tả chức năng Đầu vào Đầu ra
SWI 0x00 Hiển thị một ký tự R0 lưu ký tự Hiển thị trên màn hình ký tự
Ngắt mềm:
SWI 0x02 Hiển thị một chuỗi ký tự ra màn hình R0 lưu địa chỉ của chuỗi Hiển thị trên màn hình chuỗi
ký tự ký tự
SWI 0x11 Dừng chương trình
SWI 0x12 Đăng ký sử dụng vùng nhớ trên Heap R0 lưu kích thước (đơn R0: địa chỉ của vùng nhớ
vị là byte)
SWI 0x13 Giải phóng vùng nhớ trên Heap
SWI 0x66 Mở một file dữ liệu. Chế độ mở được lưu R0: lưu tên file R0: Kết quả quá trình mở
trên R1: R1: lưu chế độ mở file file. Nếu file không mở
- 0: Mở để đọc được, R0 = -1.
- 1: Mở để ghi
- 2: Mở để ghi tiếp
SWI 0x68 Đóng file R0: lưu tên file
SWI 0x69 Viết ghi chuỗi ký ra file hoặc ra màn hình R0: tên file hoặc Stdout
R1: Địa chỉ chuỗi ký tự
SWI 0x6a Đọc một chuỗi ký tự từ một file R0: tên file R0: số byte được lưu trữ
R1: địa chỉ đích
R2: số byte lớn nhất cần
đọc ra
SWI 0x6b Viết số nguyên ra file R0: tên file
R1: số nguyên
SWI 0x6c Đọc số nguyên từ file R0: tên file R0: lưu số nguyên
SWI 0x6d Lấy thời gian của hệ thống R0: thời gian (tính theo
milligiây)
CHƯƠNG 3-LẬP TRÌNH HỢP NGỮ ARM
Ngắt mềm:
Ví dụ 1: Viết chương trình hiển thị chuỗi ký tự “Hello
world” ra màn hình.
Ngắt mềm:
Ví dụ 2: Mở file và ghi chuỗi ký tự vào file.