在学习80x86语言的时候,时刻记录下来自己不懂的查到的知识。
1. 显示字符串后面跟随的 0DH,0AH,'$'
0DH 回车符ASCII码
0AH 换行符ASCII码
'$' DOS功能调用INT 21H中9号功能要求的要显示字符串的结束标志
2. MOV AX,DSEG
MOV DS,AX
把操作系统安排给DSEG的地址,送到DS中。
3. MOV BYTE PTR [DI],0
PTR为属性操作符,BYTE PTR表示[DI]处是一个字节,[DI]表示DI值指定的内存地址处,本句意思是把[DI]处的一个字节填为0
4. JA/JB
jb指令用于无符号数比较,取jump if below,即前者小于后者则转移
ja指令用于无符号数比较,取jump if above,即前者大于后者则转移
jl是一个条件跳转指令 jump less 小于跳转,有符号数比跳
jg jump great 大于跳转,有符号数比较
5. jmp $+2
$代表当前地址,$+2就是下一条指令的地址,该语句相当于在执行下一条指令之前添加一个短延迟
但就目前的CPU而言不太好用,主要是因为现在的cpu执行一条指令一般一个时钟就够了, 早期的cpu则需几个甚至十几个, 而且这个时钟周期的实际时间又比原来的短了许多.
6.Test指令
Test指令执行的是与操作。
test AL, 08H 就是测试AL的第4位是不是1,8h = 0000 1000
7. PTR指令
在没有寄存器名存在的情况下,用操作符“X ptr”指明内存单元的长度,X在汇编指令中可以为word 或者byte。
8. CLI/STI指令
这两个指令只能在内核模式下执行,不可以在用户模式下执行
CLI禁止中断发生
STL允许中断发生
9. IRET
指令功能:IRET(interrupt return)中断返回,中断服务程序的最后一条指令。IRET指令将推入堆栈的段地址和偏移地址弹出,使程序返回到原来发生中断的地方。其作用是从中断中恢复中断前的状态,具体作用有如下三点:
1.恢复IP(instruction pointer):(IP)←((SP)+1:(SP)),(SP)←(SP)+2
2.恢复CS(code segment):(CS)←((SP)+1:(SP)),(SP)←(SP)+2
3.恢复中断前的PSW(program status word),即恢复中断前的标志寄存器的状态。
(FR)←((SP)+1:(SP)),(SP)←(SP)+2
以上操作按顺序进行。
IRET指令影响所有标志位。
10. 汇编语言通过call和ret指令实现了模块化程序设计。可以实现多个相互联系、功能独立的子程序来解决一个复杂的问题。
11. XCHG交换指令
12. 段超越前缀
段超越前缀用来改变默认段寻址,通常内址寻址是数据段或者堆栈段,但你可以在指令前面加上段超越前缀,就可以访问到其它段内的数据。
8086/8088指令系统中的段地址有四个:
ES Extra segment 附加段寄存器
DS Data segment 数据段寄存器
CS Code segment 代码段寄存器
SS Stack segment 堆栈段寄存器
我们通常用到的寄存器间接寻址方式会用到下边几个
DI, SI, BX, BP
其中前三个对应的段默认位DS,就是数据段寄存器
而最后一个BP默认对应的是SS, 就是堆栈段寄存器
所以当我们要用到代码段寄存器或者附加段寄存器的时候就会用到段超越前缀
例如:
mov al, [si] = mov al, ds:[si]
mov al, [bp] = mov al, ss:[bp]
而段超越的则必须在前边加上段地址:
mov al, cs:[si]