|
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行)后面是对应的字符‘.’表示没有该数字对应的字符 |