ComputerSystems
大约 2 分钟
ComputerSystems
目录
控制
loop 循环
基本使用
; 每次执行到`loop标号`时会自动将cx减1,并检测cx是否为0,不需要手动完成
标号
...
循环体
...
loop 标号
demo:从1加至100的和
; 设定循环次数
mov cx, 100
; 初始化ax
mov ax, 0x0000
; 循环部分
sum:
add ax, cx
loop sum
jmp $
times 510-($-$$) db 0
; 最后在寄存器ax的数据是13BAh,即5050,答案正确
jmp 跳转
直接跳转,类似于于C语言的goto
jcc 条件
jmp
是直接跳转,而jcc
是符合条件才会跳转
场景:FLAGS (标志寄存器) 要结合Jcc
(条件转移指令)来使用
jcc衍生指令 jz/jnz
jz ; Jump if zero (ZF=1)
jnz ; Jump if not zero (ZF=0)
section 分段(疑似汇编器命令)
类似于高级语言的程序块?
(不是segment)
这是nasm提供的分段关键字,不是原生的汇编指令关键字?
作用:可以自定义分段
section 名字 align=无/16/32 vstart=0x7c00
; section 语句之后,到碰到下个section之前都属于section
; align可选参数:可以让你分段的位置处于16/32字节的倍数,原理是用0给你补到16字节,默认不设置
; vstart可选参数:设置段内的偏移地址的基准地址,默认不设置则基于程序头(一般为0x0000)进行偏移
call 指令
类似于高级语言的函数传参,是jmp的高级封装(可以跳转回来、使用了栈、可以传参)
原理:
- 流程是先顺序执行指令,遇到call指令后来到call后面的标号处,遇到ret指令后返回到原来的位置继续顺序执行指令
- 传参时用寄存器来存储参数和返回值即可
; 后接标号/寄存器/内存地址
; 注意在代码块的最后要加一个ret指令,即return