跳至主要內容

ComputerSystems

LincZero大约 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