070-Assembly彙編07 (精華)

 

070-Assembly彙編07 (精華)

 

 

 

 

1.Macros 宏指令
宏指令就是寫一個指令,然後代表了一連串的命令
比如我們寫一個exit指令
這個exit指令代表的是
mov rax,60
mov rdi,0
syscall
也就是退出

所以
exit實現
    mov rax,60
    mov rdi,0
    syscall

 

 


2.定義 Macros宏指令
%macro <name> <argc>
    ...
    <macro body>
    ...
%endmacro


舉個例子

%macro exit 0
    mov rax,60
    mov rdi,0
    syscall
%endmacro

 

 

 

3.帶參數宏指令
剛剛的退出是不需要參數的,所以直接 exit 0
現在看看帶參數的

%macro printDigit 1
    mov rax,%1
    call _printRAXDigit
%end macro

_start:
    printDigit 3
    printDigit 4
    
    exit


看這段代碼
我們給了一個參數
所以宏指令裏面的%1指的就是我們傳入的那個東西
也就是 printDigit 3,這裏的這個3
也就是 printDigit 4,這裏的這個4
和我們在高級語言中定義方法的時候,傳入參數是一個道理

 

 

 

4.宏指令帶2個及2個以上參數
%macro printDigitSum 2
    mov rax,%1
    add rax,%2
    call _printRAXDigit
%endmacro

_start:
    printDigitSum 3,2
    exit

這裏我們的宏指令printDigitSum 2,
後面是一個2,也就是兩個參數的意思
那麼%1是第一個參數,%2是第二個參數

 

 


5.宏指令中的label標籤
之前說了
_start:
_print:
_loop:
這些都是label標籤

%macro freeze 0
_loop:    
    jmp _loop
%endmacro

_start:
    freeze
    exit

那麼這段代碼的意思就是
freeze裏面有_loop:這個label代碼塊
然後無限循環

 

 

 

6.常量equ
equ可以用來定義常量
比如
SYS_EXIT equ 60

_start:
    mov rax,SYS_EXIT
    mov rdi,0
    syscall

 

 

 

7.關聯外部文件
%include "filename.asm"

舉例
把_print:寫在另一個文件
% include "printFunc.asm"

_start:
    print text
    exit

和python的import同理

 

 


8.rdx特性
舉例
mov rax,24
mov rbx,2
div rbx

這三行代碼是一個除法,按理來說,rax被rbx除了之後是12
但是
如果這個時候rdx不是0的話
那麼rax和rdx會聯結在一起
rax和rdx都是64位的寄存器,聯結在一起就變成了128位的寄存器

最後的結果是這個128位的寄存器除以2,那麼就肯定不是12了
所以,如果想要rax單獨被div除法操作
要讓rdx等於0

所以
mov rax,24
mov rdx,0
mov rbx,2
div rbx

這個除法做完之後,rdx會保留這個除法的餘數
比如
mov rax,34
mov rdx,0
mov rbx,5
div rbx
那麼最後
rax是結果6
rdx是餘數4

 

 


9.打印整數

section .bss
    digitSpace resb 100
    digitSpacePos resb 8

section .text
    global _start

_start:
    mov rax,123
    call _printRAX

    mov rax,60
    mov rdi,0
    syscall

_printRAX:
    mov rcx,digitSpace
    mov rbx,10
    mov [rcx],rbx
    inc rcx
    mov [digitSpacePos],rcx

_printRAXLoop:
    mov rdx,0
    mov rbx,10
    div rbx
    push rax
    add rdx,48

    mov rcx,[digitSpacePos]
    mov [rcx],dl
    inc rcx
    mov [digitSpacePos],rcx
    
    pop rax
    cmp rax,0
    jne _printRAXLoop

_printRAXLoop2:
    mov rcx, [digitSpacePos]
    
    mov rax,1
    mov rdi,1
    mov rsi,rcx
    mov rdx,1
    syscall
    
    mov rcx,[digitSpacePos]
    dec rcx
    mov [digitSpacePos], rcx
    
    cmp rcx,digitSpace
    jge _printRAXLoop2
    ret

 

打印整數123
那麼就整除10
123/10===12...3        保存3
12/10===1...2    保存2
1/10===0...1    保存1
然後反向輸出
就是123

 

 

 

 

 

 

 

 

 

1.Macros 宏指令
宏指令就是寫一個指令,然後代表了一連串的命令
比如我們寫一個exit指令
這個exit指令代表的是
mov rax,60
mov rdi,0
syscall
也就是退出

所以
exit實現
    mov rax,60
    mov rdi,0
    syscall

 

 


2.定義 Macros宏指令
%macro <name> <argc>
    ...
    <macro body>
    ...
%endmacro


舉個例子

%macro exit 0
    mov rax,60
    mov rdi,0
    syscall
%endmacro

 

 

 

3.帶參數宏指令
剛剛的退出是不需要參數的,所以直接 exit 0
現在看看帶參數的

%macro printDigit 1
    mov rax,%1
    call _printRAXDigit
%end macro

_start:
    printDigit 3
    printDigit 4
    
    exit


看這段代碼
我們給了一個參數
所以宏指令裏面的%1指的就是我們傳入的那個東西
也就是 printDigit 3,這裏的這個3
也就是 printDigit 4,這裏的這個4
和我們在高級語言中定義方法的時候,傳入參數是一個道理

 

 

 

4.宏指令帶2個及2個以上參數
%macro printDigitSum 2
    mov rax,%1
    add rax,%2
    call _printRAXDigit
%endmacro

_start:
    printDigitSum 3,2
    exit

這裏我們的宏指令printDigitSum 2,
後面是一個2,也就是兩個參數的意思
那麼%1是第一個參數,%2是第二個參數

 

 


5.宏指令中的label標籤
之前說了
_start:
_print:
_loop:
這些都是label標籤

%macro freeze 0
_loop:    
    jmp _loop
%endmacro

_start:
    freeze
    exit

那麼這段代碼的意思就是
freeze裏面有_loop:這個label代碼塊
然後無限循環

 

 

 

6.常量equ
equ可以用來定義常量
比如
SYS_EXIT equ 60

_start:
    mov rax,SYS_EXIT
    mov rdi,0
    syscall

 

 

 

7.關聯外部文件
%include "filename.asm"

舉例
把_print:寫在另一個文件
% include "printFunc.asm"

_start:
    print text
    exit

和python的import同理

 

 


8.rdx特性
舉例
mov rax,24
mov rbx,2
div rbx

這三行代碼是一個除法,按理來說,rax被rbx除了之後是12
但是
如果這個時候rdx不是0的話
那麼rax和rdx會聯結在一起
rax和rdx都是64位的寄存器,聯結在一起就變成了128位的寄存器

最後的結果是這個128位的寄存器除以2,那麼就肯定不是12了
所以,如果想要rax單獨被div除法操作
要讓rdx等於0

所以
mov rax,24
mov rdx,0
mov rbx,2
div rbx

這個除法做完之後,rdx會保留這個除法的餘數
比如
mov rax,34
mov rdx,0
mov rbx,5
div rbx
那麼最後
rax是結果6
rdx是餘數4

 

 


9.打印整數

section .bss
    digitSpace resb 100
    digitSpacePos resb 8

section .text
    global _start

_start:
    mov rax,123
    call _printRAX

    mov rax,60
    mov rdi,0
    syscall

_printRAX:
    mov rcx,digitSpace
    mov rbx,10
    mov [rcx],rbx
    inc rcx
    mov [digitSpacePos],rcx

_printRAXLoop:
    mov rdx,0
    mov rbx,10
    div rbx
    push rax
    add rdx,48

    mov rcx,[digitSpacePos]
    mov [rcx],dl
    inc rcx
    mov [digitSpacePos],rcx
    
    pop rax
    cmp rax,0
    jne _printRAXLoop

_printRAXLoop2:
    mov rcx, [digitSpacePos]
    
    mov rax,1
    mov rdi,1
    mov rsi,rcx
    mov rdx,1
    syscall
    
    mov rcx,[digitSpacePos]
    dec rcx
    mov [digitSpacePos], rcx
    
    cmp rcx,digitSpace
    jge _printRAXLoop2
    ret


打印整數123
那麼就整除10
123/10===12...3        保存3
12/10===1...2    保存2
1/10===0...1    保存1
然後反向輸出
就是123

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章