循环loop
先CX - 1,然后判断CX是否为0,如果不是0跳转到之前设置的LABEL出,如果是0继续向下执行
公式化记忆:
1 | MOV CX NUM ; NUM表示循环次数 |
举例:等差数列求和,第一项是1,公差是2,一共有5项
1 | CODE SEGMENT |
汇编中函数的封装
CALL和RET
CALL相当于压栈,压入的是IP,这个IP是CALL的下一个语句的IP,否则就死循环了
RET相当于弹栈,弹出的是IP
CALL FAR 和 RETF
相对于上面同时压/弹CS和IP
一个段的大小是16字节,从物理地址 = 段地址 * 16 + 偏移地址就可以看出来
OFFSET
取偏移地址
举例:将s处一条指令复制到s0
JMP
短跳转和长跳转
短跳转只修改IP,且只存储相对距离(从JMP的下一条指令开始计算)
长跳转修改CS和IP,同时存储目标跳转的CS和IP
word ptr 和 dword ptr
word ptr读1个字,所以作为IP
dword ptr 读2个字,所以作为CS和IP
数组
arr[2]:这个表示先找到arr对应地址,再在这个地址基础上加2个字节,而不是表示找arr数字第三个元素
虽然ASSUME DS:DATA表示将DATA段映射到DS寄存器,但是如果没有MOV AX, DATA MOV DS, AX依然无效。因为此时DS寄存器里的值和代码段DATA不一样
可以在一个数组前添上1个标号表示这个数组(相当于变量名)ARR DB 01H, 02H, 03H ARR就是标号