汇编语言
1.在8086cpu加电或复位后,即CPU刚开始工作后,CS=FFFFH,IP=0000H
- debug使用
mount c c:\
C:\
debug
- mov指令
mov dst, src
dst可以为寄存器
src可以为立即数,寄存器,存储单元
不能直接将数据送入段寄存器,需要用通用寄存器中转,一般用ax
- debug指令
-d 查看内存区域
-u 以汇编形式查看内存区域
-r 查看cpu状态以及寄存器信息
-e 写机器码
-a 写汇编代码
-t 单步运行
到了int 21h要用 -p执行
-g + 地址 从指定地址开始调试(IP中的值)
-p 自动执行完剩下的循环指令
- ()符号
(内存地址)表示这个内存地址中存放的内容
()里面可以放:1、寄存器名 2、段寄存器名 3、内存单元的20位物理地址
- LOOP指令
LOOP 标号
CPU执行loop指令时,1、(cx) = (cx) -1 2、判断cx中的值,不为零则转至标号处执行
要点:
1、在cx中存放循环次数
2、LOOP指令中的标号要在LOOP指令之前定义
3、要循环执行的程序段,放在标号和LOOP之间
在汇编源程序中要是用mov ax, [0]的指令要给出明确的段寄存器,如:mov ax, ds:[0]
安全空间:0:200~0:02ff(256字节)
- 字符大小写转换
小写字符第五位为1,大写字符第五位为0
- 寄存器间接寻址
MOV AX, [BX+200]
MOV AX, [200+BX]
MOV AX, 200[BX]
MOV AX, [BX].200
- 基址变址寻址
MOV AX, [BX+SI]
MOV AX, [BX][SI]
- 基址变址寻址且相对寻址
MOV AX, [BX+200+SI]
MOV AX, [BX+SI+200]
MOV AX, [200+BX+SI]
MOV AX, 200[BX][SI]
MOV AX, [BX][SI].200
MOV AX, [BX].200[SI]
- LABEL伪指令定义的变量不能使用
TOP LABEL WORD
- div除法指令
被除数:如果除数为八位,被除数放在AX中;如果除数为16位,被除数放在DX:AX中,DX为高八位
结果:如果除数为八位,AL存商,AH存余数。如果除数为16位,AX存商,DX存余数
- 无条件转移指令JMP
JMP SHORT 标号
对IP的修改范围不超过-128~+127
JMP NEAR PTR 标号
对IP的修改范围不超过-32768~+32767
JMP FAR PTR 标号
指令后高地址为段地址,低地址为偏移地址 段地址:偏移地址
JMP REG
IP=reg
JMP WORD PTR 内存单元地址
IP=内存单元的数据(段内转移)
JMP DWORD PTR 内存单元地址
CS=内存单元地址+2 IP=内存单元地址
- 自减指令
DEC DST
- 有条件转移
所有有条件转移指令都是短程转移,-128~+127
JCXZ
= if((cx) == 0) jmp short 标号
- REF与REFT
REF
从栈中修改ip的内容,实现近转移
REFT
从栈中修改IP和CS中的内容,先弹出IP,后弹出CS
- int 21h
从键盘输入,并且回显
- call指令
CALL 标号
将当前IP压栈后,转移到标号处,不能进行短转移
CALL FAR PTR 标号
将当前CS、IP压栈,转移到标号处
CALL WORD PTR 内存单元地址
CALL DWORD PTR 内存单元地址
- mul乘法指令
8位:乘数在AL中,结果放到AX中
16位:乘数在AX中,结果放到DX:AX中
- ADC指令
带CF位的加法指令
- SBB指令
带CF为的减法指令
- CMP比较指令
只做减法影响PSW,不保存结果
有符号数的比较主要看SF和OF,SF用于判断A是否大于B,OF用于判断是否有溢出
-
条件转移指令
JE 等于则转移
JNE 不等于则转移
JB 低于则转移
JNB 不低于则转移
JA 高于则转移
JNA 不高于则转移
-
DF标志
DF=0 每次操作后,SI、DI递增
DF=1 每次操作后,SI、DI递减
-
串指令
MOVSB 把DS:SI处的字节送入ES:DI中,然后SI、DI递增或递减1
MOVSW 把DS:SI处的字送入ES:DI中,然后SI、DI递增或递减2
REP MOVSB/REP MOVSW 相当于S:MOV SB LOOP S
CLD和STD用于对DF的改变,CLD->DF=0,STD->DF=1
内中断
中断源 中断码
除法错误 0
单步执行 1
执行into指令 4
执行int n指令 n
- 中断向量表
中断向量表放在0000:0000到0000:03FF单元中,每个重点向量两个字,段地址(高字节):偏移地址
- 中断过程
1、取得中断类型码
2、标志寄存器的值入栈
3、设置标志寄存器TF和IF的值为0
4、CS入栈
5、IP入栈
6、根据中断向量表设置相应的CS、IP
中断处理程序结束时,用IRET返回,相当于:
POP IP
POP CS
POPF
- INT 21H功能号
9号功能:在光标处显示DS:DX指向的字符串,字符串需用$做结束符
端口
- 端口读写命令
IN DST, STR
OUT DST, STR
DST只能为AX或AL,八位端口用AL,16位端口用AX
- 逻辑移位
SHL DST, CNT
逻辑左移
SHR DST, CNT
逻辑右移
当CNT大于1时要用CL给出
- ASCII字符
0DH 回车
0AH 换行