0%

第三部分_高级函数

循环loop

先CX - 1,然后判断CX是否为0,如果不是0跳转到之前设置的LABEL出,如果是0继续向下执行

公式化记忆:

1
2
3
4
5
6
MOV CX NUM	; NUM表示循环次数
LABEL: ; 循环跳回的位置
……
……
……
LOOP LABEL ; 循环

举例:等差数列求和,第一项是1,公差是2,一共有5项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV CX, 4
MOV AX, 1
MOV BX, 1
LABEL:
ADD BX, 2
ADD AX, BX
LOOP LABEL
MOV AH, 4CH
INT 21H
CODE ENDS
END

汇编中函数的封装

CALL和RET

CALL相当于压栈,压入的是IP,这个IP是CALL的下一个语句的IP,否则就死循环了

RET相当于弹栈,弹出的是IP

视频讲解

CALL FAR 和 RETF

相对于上面同时压/弹CS和IP

视频讲解

视频讲解:单独使用RET会陷入死循环

视频讲解:单独使用CALL程序会跳转后顺序执行

一个段的大小是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

视频讲解

数组

  1. arr[2]:这个表示先找到arr对应地址,再在这个地址基础上加2个字节,而不是表示找arr数字第三个元素

  2. 虽然ASSUME DS:DATA表示将DATA段映射到DS寄存器,但是如果没有MOV AX, DATA MOV DS, AX依然无效。因为此时DS寄存器里的值和代码段DATA不一样

  3. 可以在一个数组前添上1个标号表示这个数组(相当于变量名)ARR DB 01H, 02H, 03H ARR就是标号

    视频讲解