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