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

发布了1081 篇原创文章 · 获赞 42 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_33781658/article/details/104587299