Bài giảng Assembler: Bài 3 do GV. ThS. Phạm Nguyên Văn trình bày, gồm các nội dung về mô hình bộ nhớ, toán tử và biểu thức, các toán tử type và size, lệnh enum của borland tasm và lệnh jmp và loop. Chúc bạn học tốt.
Nội dung trích xuất từ tài liệu:
Bài giảng Assembler: Bài 3 - GV.ThS. Phạm Nguyên VănGV: Ths. Phạm Nguyên Văn Lệnh .model lựa chọn mô hình bộ nhớ. Tiny: Mã và DL phối hợp < 64K. Small: Mã Biểu thức là tổ hợp các toán tử và toán hạng được trình biên dịch chuyển thành một giá trị đơn lẻ. 3 1000h * 50h ; = 50000h -4 + 2 ; = -6 count + 2 ; số đếm là 1 hằng 31 MOD 6 ; = 16 / 4 ;=1 ‘2’ – 30h ; = 2(do giá trị của ‘2’ = 32h) 4Toán tử Cấp Mô tả() 1 Dấu ngoặc đơn+,- 2 Dương và Âm (đơn tử)*, /, mod 3 nhân, chia, lấy phần dư+,- 4 Cộng, trừ 5 OFFSET trả về vị trí của 1 nhãn và biến từ đầu phân đoạn của nó. Toán hạng đích phải là 1 thanh ghi 16bit: VD: mov bx, offset count ; BX trỏ đến count offset có thể được chuyển đến 1 thanh ghi chỉ mục hoặc cơ số. Trong ví dụ sau, bList mặc định nằm tại offset 0000: 6 .data bList db 10h, 20h, 30h, 40h wList dw 1000h, 2000h, 3000h .code mov di, offset bList ; dl = 0000 mov bx, offset bList + 1 ; bx = 0001 mov si, offset wList+2 ; si = 0006 7 Toán tử SEG trả về phần phân đoạn của 1 nhãn hoặc địa chỉ của biến. Thường được dùng khi biến nằm trong 1 phân đoạn khác với phân đoạn hiện do DS trỏ đến VD: đẩy [push] giá trị hiện thời của DS lên stack, ấn định DS theo phân đoạn chứa array, và sau đó phục hồi DS theo giá trị ban đầu của nó 8 push ds ; lưu DS mov ax,seg array ; ấn định ds theo phân đoạn của mảng mov ds, ax mov bx, offset array ; tìm độ dịch vị mảng … ;xử lý mảng pop ds ; phục hồi ds 9 PTR: chạy đè lên kích cỡ ngầm định của một toán hạng. Phát biểu rõ kích cỡ của toán hạng. Phải được kết hợp với các kiểu dữ liệu chuẩn: BYTE, SBYTE, WORD, DWORD, SDWORD, FWORD, QWORD, TBYTE. VD: mov al,byte ptr count mov ax, word ptr newVal mov eax,dword ptr listPointer 10 Do kích cỡ của toán hạng không được rõ ràng xét theo ngữ cảnh 1 lệnh. VD: inc [bx] ; toán hạng gián tiếp báo lỗi do không biết bx chứa byte hay word inc byte ptr [bx]: xác định rõ kích cỡ của toán hạng là byte Có thể chạy đè kích cỡ ngầm định của toán hạng. 11 Vd: ta có từ kép 32bit, muốn nạp từ cao vào DX, từ thấp vào AX: .data val32 dd ? .code mov ax, val32 ; có từ thấp (error) mov dx, val32+2 ; có từ cao (error) Sửa lại: mov ax, word ptr val32 ; AX = 1234h mov dx, word ptr val32+2 ; DX = 5678h 12 LABEL: chèn 1 nhãn và gán cho nó 1 thuộc tính kích cỡ, mà không phân bổ bộ nhớ. VD: khai báo 1 nhãn trước khi val32 gọi val16, và gán thuộc tính word: .data val16 label word val32 dd 12345678h .code mov ax,val16 mov dx,val32 13 EVEN và EVENDATA: căn thẳng hàng lệnh kế tiếp trong đoạn mã theo offset 16bit đều. Vd: 1 lệnh NOP 1-byte (90h) được chèn vào mã đã biên dịch nơi even xuất hiện. Lệnh tiếp theo nằm tại 0006: 0000 mov ax,@data 0003 mov ds, ax 0005 even ; byte chứa 90h được chèn ở đây 0006 mov bx, offset array 14 Tương tự với evendata, chèn 1 byte rỗng (0) vào trước array: 0000 .data 0000 str1 db 3 dup(‘X’) 0003 evendata 0004 array dw 10 dup(0FFFFh) 15 Toán tử SHORT: thường sử dụng với JMP khi thực hiện nhảy ngắn khoảng .data var1 db 20h var2 dw 1000h var3 dd ? var4 db 10,20,30,40,50 msg db ‘File not found’,0 .code L1: mov ax,type var1 ;ax = 0001 mov ax,type var2 ;ax = 0002 mov ax,type var3 ;ax = 0004 mov ax,type var4 ;ax = 0001 mov ax,type msg ;ax = 0001 mov ax,type L1 ;ax = FFFF 17 Toán tử length: đếm số lượng các thành phần riêng lẻ trong 1 biến được định nghĩa bằng dup. Nếu không dùng dup, length = 1. Nếu dùng dup lồng ghép, chỉ toán tử phía ngoài mới được đếm. 18 .data val1 dw 1000h val2 db 10,20,30 array dw 32 dup(0) array2 dw 5 dup(3 dup(0)) message db ‘File not found’,0 .code mov ax,length val1 ; = 1 mov ax,length val2 ; = 1 mov ax,length array; = 32 mov ax,length array2 ;=5 mov ax,length message ;=1 ...