1、指令
通用寄存器:AX(AH,AL),BX(BH,BL),CX(CH,CL),DX(DH,DL),SP,BP,SI,DI
段寄存器:DS、SS、ES、CS
直接寻址:[DISP]
寄存器间接寻址:[BX]、[BP]、[SI]、[DI]
基址寻址:[BX+DISP]、[BP+DISP]
变址寻址:[SI+DISP]、[DI+DISP]
基址加变址寻址:[BX+SI+DISP]、[BX+DI+DISP]、[BP+SI+DISP]、[BX+DI+DISP]
只有基址寄存器BP的默认堆栈段为SS,其他一律为DS
物理地址 = 段地址(DS/SS) * 16 + 偏移地址(EA)
EA(有效地址) =(BX/BP)+ (SI/DI) + DISP
数据传送指令
功能 | 助记符格式 | 操作 |
传送 | MOV d,s(d,s类型相同,8/16位) | |
交换 | XCHG d,s | |
压入堆栈 | PUSH s | SP ← SP-2,(SP)←s |
弹出堆栈 | POP d | d ←(SP),SP←SP+2 |
查表转换 | XLAT | AL ← DS, [BX+AL] |
取有效地址 | LEA reg16(16位通用寄存器),s(存储器操作数) | reg16 ← s的有效地址 |
取逻辑地址(指针) | LDS reg16,s | reg16 ←(s)的偏移地址,DS ←(s)的段地址 |
取逻辑地址(指针) | LES reg16,s | reg16 ←(s)的偏移地址,ES ←(s)的段地址 |
输入 | IN 累加器(AL/AX),端口地址 | 累加器 ←(端口地址) |
输出 | OUT 端口地址,累加器 | (端口地址)← 累加器 |
逻辑运算和移位指令:
名称 | 格式 | 功能 |
逻辑与 | AND d,s | 置零 |
逻辑或 | OR d,s | 置一 |
逻辑异或 | XOR d,s | 对部分位取反 |
逻辑非 | NOT d | 取反 |
测试 | TEST d,s | d 与 s 想与 ZF = 1 结果为 0 ZF = 0 结果不为 0 |
算术左移 | SAL d,count | 无符号数乘以 2 |
算数右移 | SAR d, count | 有符号数除以 2 |
逻辑左移 | SHL d, count | 同算数左移 |
逻辑右移 | SHR d, count | 无符号数除以 2 |
向左小循环 | ROL d, count | 最高位循环移入最低位 |
向右小循环 | ROR d, count | 最低位循环移入最高位 |
算数运算指令:
分类 | 助记符格式 | 功能 |
加法 | ADD d, s(不能用段寄存器) ADC d, s(不能用段寄存器) INC d | 相加 带进位相加 加一 |
减法 | SUB d,s SBB d,s DEC d CMP d,s | 相减 借位减法 减一 比较 |
乘法 | MUL s IMUL s | 无符号数乘法 有符号数乘法 |
程序控制指令:
助记符格式 | 功能 | |
无条件转移 | JMP CALL | 无条件转移(顺序执行不再回到循环) 子程序调用 |
单标志 | JZ/JE JNZ/JNE JP/JPE JNP/JPO | 结果是0/相等 结果不是0/不相等 1的个数是偶数 1的个数是奇数 |
无符号数 | JA/JNBE JAE/JNB JB/JNAE JBE/JNA | 高于/不低于等于 高于或等于/不低于 低于/不高于等于 低于或等于/不高于 |
有符号数 | JG/JNBE JGE/JNL JL/JNGE JLE/JNG | 大于/不小于等于 大于或等于/不小于 小于/不大于等于 小于或等于/不大于 |
基本编程框架:
;数据段
DATAS SEGMENT
;定义变量
DATAS ENDS
;堆栈段
STACKS SEGMENT
;堆栈空间预置
STACKS ENDS
;代码段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS ;对段寄存器地址进行说明
START:
MOV AX,DATAS ;初始化段寄存器地址开始
MOV DS,AX
MOV AX,STAK
MOV SS,AX ;初始化段寄存器结束
;插入代码
MOV AH,4CH ;返回DOS操作系统
INT 21H
CODES ENDS ;CODE段定义结束
END START ; 程序结束
DOS系统功能调用
单字符显示(2号功能)
MOV DL,'字符'
MOV AH,02H
INT 21H
字符串输入(9号功能)
MOV DX,字符串偏移量
MOV AH,09H
INT 21H
这里的字符串偏移量要以‘MYM’或'$'结尾
例:
D1 DB 'HELLO WORLD'
D2 DB '0$'
.....
MOV DX,OFFSET D1 ;指向要输出的首地址,即从D1开始输出
MOV AH,09H
INT 21H
返回操作系统(4CH号功能)
MOV AH,4CH
INT 21H
汇编语言编程注意事项
用移位运算时,所移动位数大于1,必须用CL转换
MOV CL,3
SAL DX,CL ;左移三位 乘以8
LOOP循环指令编程:将CX-1→CX,若CX ≠ 0则转移到标号地址去执行,否则执行LOOP后面的指令
(注意一定要先确定循环次数,赋值给CX!!!)
格式:
MOV CX,100 ;指定循环100次
L1:
...
LOOP L1
LOOP相当于下面这两条指令的组合,只是LOOP不影响标志位
DEC CX
JNZ 标号
条件转移指令,常常与CMP配合使用
程序报错请看这里:https://blog.csdn.net/laoyi_grace/article/details/39352239
关于一些基本的调试:
-u:查看汇编代码;
-t:执行下一条语句
-g + 的内存:跳转到该内存所对应的语句(再用t命令执行该条命令)
-r:查看寄存器的内容(后可直接接寄存器的名称,就只查看该寄存器的内容)
-d:后接内存地址,查看改地址后面8 * 16个字节空间的地址(每行16个字节,共8行)后面是对应的字符‘.’表示没有该数字对应的字符