មេរៀនកម្មវិធី Syntax Assembly
មេរៀន មូលដ្ឋានភាសា Assembly
គុណសម្បត្តិនៃភាសា Assembly:
ការយល់ដឹងនៃភាសា ការប្រជុំគ្នាមួយផ្តល់នូវចំនេះដឹង:
- Interface កម្មវិធីជាមួយនឹងប្រព័ន្ធប្រតិបត្តិការដំណើរការ processor & BIOS
- ការតំណាងនៃទិន្នន័យនៅ ក្នុងសតិនិង ឧបករណ៍ខាងក្រៅផ្សេងទៀត
- របៀបនៃការដំណើរការ និងប្រតិបត្តិការ
- របៀប ណែនាំ អំពីការចូលដំណើរការ និង ដំណើរការទិន្នន័យ
- របៀប កម្មវិធីមួយចូលដំណើរ ជាមួយ ឧបករណ៍ខាងក្រៅ
លក្ខណៈពិសេសជាមូលដ្ឋាននៃផ្នែករឹងកុំព្យូទ័រ
Processor បានគាំទ្រដល់ទំហំទិន្នន័យដូចខាងក្រោម:
- Word: a 2-byte data item
- Doubleword: a 4-byte (32 bit) data item
- Quadword: an 8-byte (64 bit) data item
- Paragraph: a 16-byte (128 bit) area
- Kilobyte: 1024 bytes
- Megabyte: 1,048,576 bytes
Bit value | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Position value as a power of base 2 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Bit number | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ប្រព័ន្ធលេខគោល១៦ Hexadecimal
Decimal number | Binary representation | Hexadecimal representation |
0 | 0 | 0 |
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 3 |
4 | 100 | 4 |
5 | 101 | 5 |
6 | 110 | 6 |
7 | 111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
The following table illustrates four simple rules for binary addition:
(i) | (ii) | (iii) | (iv) |
1 | |||
0 | 1 | 1 | 1 |
+0 | +0 | +1 | +1 |
=0 | =1 | =10 | =11 |
ឧទាហរណ៍:
Decimal | Binary |
60 | 00111100 |
+42 | 00101010 |
102 | 01100110 |
Number 53 | 00110101 |
Reverse the bits | 11001010 |
Add 1 | 1 |
Number -53 | 11001011 |
កម្មវិធី Assembly ត្រូវបានបែងចែកជាបីផ្នែក:
- ផ្នែក data
- ផ្នែក bss
global main
main:
- ផ្នែក text
[label] mnemonic [operands] [;comment]
បន្ទាប់ពីមានឧទហរណ៍ខ្លះ សេចក្តីថ្លែងការណ៍ នៃប្រភេទភាសា Assembly:MOV TOTAL, 48 ; Transfer the value 48 in the
INC COUNT ; Increment the memory variable COUNT
; memory variable TOTAL
ADD AH, BH ; Add the content of the
; BH register into the AH register
AND MASK1, 128 ; Perform AND operation on the
; variable MASK1 and 128
ADD MARKS, 10 ; Add 10 to the variable MARKS
MOV AL, 10 ; Transfer the value 10 to the AL register
កម្មវិធី Assembly បង្ហាញពាក្ស Hello World
section .text
global main ; must be declared for linker (ld)
main: ; tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ; our dear string
len equ $ - msg ; length of our dear string
លទ្ធផលចេញ: Hello, world!
មេរៀន Memory Segments
យើងបានពិភាក្សារួចហើយចំនួនបីផ្នែកនៃកម្មវិធី Assembly ផ្នែកទាំងនេះតំណាងឱ្យចម្រៀកសតិជាច្រើនផងដែរ។
គួរឱ្យចាប់អារម្មណ៍ប្រសិនបើអ្នកជំនួសពាក្យគន្លឹះផ្នែកជាមួយ Segment អ្នកនឹងទទួលបានលទ្ធផលដូចគ្នា។ សូមសាកល្បងកូដដូចខាងក្រោម:
segment .text ; code segment
global main ; must be declared for linker
main: ; tell linker entry point
mov edx,len ; message length
mov ecx,msg ; message to write
mov ebx,1 ; file descriptor (stdout)
mov eax,4 ; system call number (sys_write)
int 0x80 ; call kernel
mov eax,1 ; system call number (sys_exit)
int 0x80 ; call kernel
segment .data ; data segment
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
លទ្ធផលចេញ: Hello, world!២- មេរៀន Register
ប្រតិបត្ដិការ processor ដែលភាគច្រើនពាក់ព័ន្ធនឹងទិន្នន័យដែលបានដំណើរការនោះ។ ទិន្នន័យនេះអាចត្រូវបានរក្សាទុកក្នុងសតិនិងចូលដំណើរការ។ ទោះជាយ៉ាងណាការ អានទិន្នន័យពីនិងការរក្សាទុកទិន្នន័យចូលទៅក្នុងសតិ ដំណើរការយឺត នឹងដំណើរការ ដ៏ស្មុគស្មាញនៃការផ្ញើ ទិន្នន័យ តាម bus បញ្ជានិងការចូលទៅក្នុងឯកតាផ្ទុក ការចងចាំ និងការទទួលទិន្នន័យតាមរយៈ Channel ដូចគ្នា។
Processor Registers
មាន 32-bit និងប្រាំមួយ 16-bit processor registers ក្នុង IA-32។ បែងចែកជាបី ប្រភេទ
- General registers
- Control registers
- Segment registers
- Data registers
- Pointer registers
- Index registers
មានបួន 32-bit ប្រភេទ data registers ត្រូវបានប្រើសម្រាប់គិត, ប្រមាណវិធី logical និងប្រមាណវិធី ផ្សេងទៀត :
- 32-bit data registers: EAX, EBX, ECX, EDX.
- ទាបជាងនៃ 32-bit registers អាចប្រើបានបួន 16-bit data registers: AX, BX, CX និង DX.
- ទាបជាង ឬខ្ពស់ជាង ប្រើ បួន 16-bit registers អាចប្រើបានប្រាំបី 8-bit data registers: AH, AL, BH, BL, CH, CL, DH, និង DL។
pointer registers គឺមាន 32-bit EIP, ESP និង EBP registers ហើយឆ្លើយតប 16-bit និង IP, SP និង BP។
Index Registers
32-bit index registers ESI និង EDI and their 16-bit rightmost portions SI and DI are used for indexed addressing and sometimes used in addition and subtraction. There are two sets of index pointers:
- Source Index (SI) – it is used as source index for string operations
- Destination Index (DI) – it is used as destination index for string operations.
- ឧទាហរណ៍
រកមើលនៅក្នុងកម្មវិធីដ៏សាមញ្ញដូចខាងក្រោមដើម្បីស្វែងយល់ពីការប្រើប្រាស់នៃបញ្ជីនៅក្នុងការសរសេរកម្មវិធី Assembly នេះ។ វិធីនេះបង្ហាញ 9 ផ្កាយនៅលើអេក្រង់រួមជាមួយនឹងសារដ៏សាមញ្ញមួយ។global main ;must be declared for linker (gcc)
section .text
main: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0×80 ;call kernel
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0×80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0×80 ;call kernel
section .data
msg db ‘Displaying 9 stars’,0xa ;a message
len equ $ – msg ;length of message
s2 times 9 db ‘*’
លទ្ធផលចេញ ;*********
Displaying 9 stars
៣-មេរៀន System Calls
ការហៅប្រព័ន្ធ APIs គឺសម្រាប់ interface ប្រើចន្លោះរវាងពីនិងចន្លោះលំហ kernel space ។ យើងបានប្រើរួចហើយប្រព័ន្ធ sys_write និង sys_exit សម្រាប់ការសរសេរ ចូលទៅ ក្នុងអេក្រង់និងចេញពីកម្មវិធីនេះរៀងគ្នា។
មាន ៦ registers ដែលផ្ទុកក្នុងអាគុយម៉ង់នៃប្រព័ន្ធ call ។ មានដូចជា EBX, ECX, EDX, ESI, EDI, និង EBP។
កូដខាងក្រោមបង្ហាញប្រព័ន្ធ system call sys_exit:
mov eax,1 ; system call number (sys_exit)
int 0×80 ; call kernel
កូដខាងក្រោមបង្ហាញប្រព័ន្ធ system call sys_write::mov ecx,msg ; message to write
mov edx,4 ; message length
mov ebx,1 ; file descriptor (stdout)
mov eax,4 ; system call number (sys_write)
int 0×80 ; call kernel
តារាងបង្ហាញពី system calls តែងតែប្រើ:
%eax | Name | %ebx | %ecx | %edx | %esx | %edi |
1 | sys_exit | int | - | - | - | - |
2 | sys_fork | struct pt_regs | - | - | - | - |
3 | sys_read | unsigned int | char * | size_t | - | - |
4 | sys_write | unsigned int | const char * | size_t | - | - |
5 | sys_open | const char * | int | int | - | - |
6 | sys_close | unsigned int | - | - | - |
ឧទាហរណ៍userMsg db ‘Please enter a number: ‘ ; Ask the user to enter a number
section .data ; Data segment
lenUserMsg equ $-userMsg ; The length of the message
dispMsg db ‘You have entered: ‘
lenDispMsg equ $-dispMsg
section .bss ; Uninitialized data
num resb 5
section .text ; Code Segment
global main
main:
;User prompt
mov eax, 4
mov ebx, 1
mov ecx, userMsg
mov edx, lenUserMsg
int 80h
; Read and store the user input
mov eax, 3
mov ebx, 2
mov ecx, num
mov edx, 5 ; 5 bytes (numeric, 1 for sign) of that information
int 80h
; Output the message ‘The entered number is: ‘
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h
; Output the number entered
mov eax, 4
mov ebx, 1
mov ecx, num
mov edx, 5
int 80h
; Exit code
mov eax, 1
mov ebx, 0
int 80h
លទ្ធផល1234
Please enter a number:
You have entered:1234
៥- មេរៀន អាសយដ្ឋាន Modes និង MOV
មូលដ្ឋាន mode បីនៃអាសយដ្ឋានគឺ:
- អាសយដ្ឋាន Register
- អាសយដ្ឋាន Immediate
- អាសយដ្ឋាន Memory
អាសយដ្ឋាន Register ឧទាហរណ៍MOV COUNT, CX ; Register in second operand
MOV DX, TAX_RATE ; Register in first operand
MOV EAX, EBX ; Both the operands are in registers
អាសយដ្ឋាន Immediate
BYTE_VALUE DB 150 ; A byte value is defined
WORD_VALUE DW 300 ; A word value is defined
ADD BYTE_VALUE, 65 ; An immediate operand 65 is added
MOV AX, 45H ; Immediate constant 45H is transferred to AX
អាសយដ្ឋាន Memory
ADD BYTE_VALUE, DL ; Adds the register in the memory location
MOV BX, WORD_VALUE ; Operand from the memory is added to register
អាសយដ្ឋាន Direct-Offset
BYTE_TABLE DB 14, 15, 22, 45 ; Tables of bytes
WORD_TABLE DW 134, 345, 564, 123 ; Tables of words
The following operations access data from the tables in the memory into registers:
MOV CL, BYTE_TABLE[2] ; Gets the 3rd element of the BYTE_TABLE
MOV CL, BYTE_TABLE + 2 ; Gets the 3rd element of the BYTE_TABLE
MOV CX, WORD_TABLE[3] ; Gets the 4th element of the WORD_TABLE
MOV CX, WORD_TABLE + 3 ; Gets the 4th element of the WORD_TABLE
អាសយដ្ឋាន Indirect Memory
The following code snippet shows how to access different elements of the variable.
MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110 ; MY_TABLE[0] = 110
ADD EBX, 2 ; EBX = EBX +2
MOV [EBX], 123 ; MY_TABLE[1] = 123
ការណែនាំ MOV
Syntax of the MOV instruction is:
MOV destination, source
The MOV instruction may have one of the following five forms:
MOV register, register
MOV register, immediate
MOV memory, immediate
MOV register, memory
MOV memory, register
The MOV instruction causes ambiguity at times. For example, look at the statements:
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110 ; MY_TABLE[0] = 110
Following table shows some of the common type specifiers:
Type Specifier | Bytes addressed |
BYTE | 1 |
WORD | 2 |
DWORD | 4 |
QWORD | 8 |
TBYTE | 10 |
section .text
global main ;must be declared for linker (ld)
main: ;tell linker entry point
;writing the name ‘Zara Ali’
mov edx,9 ;message length
mov ecx, name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0×80 ;call kernel
mov [name], dword ‘Nuha’ ; Changed the name to Nuha Ali
; writing the name ‘Nuha Ali’
mov edx,8 ;message length
mov ecx,name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0×80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0×80 ;call kernel
section .data
name db ‘Zara Ali ‘
លទ្ធផល
Zara Ali Nuha Ali
មេរៀន ការប្រកាស អថេរ
syntax សម្រាប់ផ្ទុក allocation:
[variable-name] define-directive initial-value [,initial-value]…
There are five basic forms of the define directive:
Directive | Purpose | Storage Space |
DB | Define Byte | allocates 1 byte |
DW | Define Word | allocates 2 bytes |
DD | Define Doubleword | allocates 4 bytes |
DQ | Define Quadword | allocates 8 bytes |
DT | Define Ten Bytes | allocates 10 bytes |
choice DB ‘y’
number DW 12345
neg_number DW -12345
big_number DQ 123456789
real_number1 DD 1.234
real_number2 DQ 123.456
The following program shows use of the define directive:
section .text
global main ;must be declared for linker (gcc)
main: ;tell linker entry point
mov edx,1 ;message length
mov ecx,choice ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0×80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0×80 ;call kernel
section .data
choice DB ‘y’
លទ្ធផល y
Multiple Definitions
លោកអ្នកមានទិន្នន័យច្រើ data ប្រកាសក្នុងកម្មវិធីមួយ ឧទាហរណ៍
choice DB ‘Y’ ; ASCII of y = 79H
number1 DW 12345 ; 12345D = 3039H
number2 DD 12345679 ; 123456789D = 75BCD15H
Multiple Initializations
marks TIMES 9 DW 0
The following program displays 9 asterisks on the screen:
section .text
global main ;must be declared for linker (ld)
main: ;tell linker entry point
mov edx,9 ;message length
mov ecx, stars ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0×80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0×80 ;call kernel
section .data
stars times 9 db ‘*’
លទ្ធផល *********៦- មេរៀន Constants
មានបីប្រភេទ
- EQU
- %assign
- %define
constant_name EQU expression
ឧទាហរណ៍
total_students equ 50
ប្រើ constant value ក្នុងកូដcmp eax, total_students
mov ecx, total_students
ការប្រកាស EQU statement
length equ 20
width equ 10
area equ length * width
ឧទាហរណ៍SYS_WRITE equ 4
SYS_EXIT equ 1
STDIN equ 0
STDOUT equ 1
section .text
global main ;must be declared for using gcc
main: ;tell linker entry point
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg1
mov edx, len1
int 0×80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg2
mov edx, len2
int 0×80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg3
mov edx, len3
int 0×80
mov eax,SYS_EXIT ;system call number (sys_exit)
int 0×80 ;call kernel
section .data
msg1 db ‘Hello, programmers!’,0xA,0xD
len1 equ $ – msg1
msg2 db ‘Welcome to the world of,’, 0xA,0xD
len2 equ $ – msg2
msg3 db ‘Linux assembly programming! ‘
len3 equ $- msg3
លទ្ធផលចេញWelcome to the world of,
Hello, programmers!
Linux assembly programming!
%assign Directive
%assign total 10
Later in the code you can redefine it as:
%assign total 20
%define Directive
ឧទាហរណ៍
%define ptr [EBP+4]
Post a Comment