模板
data segment
[数据段]
data ends
code segment
assume cs:code, ds:data, es:data
start:
[代码段]
exit: mov ah,4cH
int 21H
code ends
end start
数据段
NumOut db 0dh, 0ah,"The number of Num is : $"
NumOut:变量名
db:定义
0AH:换行符的ASCII码
0DH:回车符的ASCII码(确认)
“The number of Num is : $”:变量的内容,通常以 $ 作为结尾。地址追踪器
count equ $ -source
count=$ -offset source
count为source的长度
db/dw
db
定义字节类型变量,一个字节数据占1个字节,读完偏移量+1
dw
定义字类型变量,一个字数据占2个字节单元,读完偏移量+2
双字节顺序存放,且要分开编辑。按低到低字节、高到高位字节对应
eg.定义1234,内存为34 12(低→高)
dst db 20 dup(?)
为dst分配20个字节单元,内容未知
dup():
重复定义圆括号中指定的初值,次数由前面的数值决定
?:
只分配存储空间,不指定初值
buf db 100
db ?
db 100 dup (0)
定义缓存空间,大小为100个字节,实际大小未知,内容暂时全为0。字符串的首地址为$buf+2
代码段
寄存器
段寄存器:
cs:段寄存器 存代码(code的段基址)
ds:数据寄存器 存数据(data)
es:附加段寄存器 存data (?)
ss:堆栈寄存器
通用寄存器:
AX 累加寄存器
AX=AH(高8位)+AL(低8位)
BX 基址寄存器
BX=BH(高8位)+BL(低8位)
CX 计数寄存器
CX=CH(高8位)+CL(低8位)
DX 数据寄存器
DX=DH(高8位)+DL(低8位)
INT 21H
21号中断
使用: MOV AH,op
INT 21H
op:
01H —键盘输入并回显 过滤掉控制字符
AL=输入字符
02H —字符输出
03H —辅助设备的输入
04H —辅助设备的输出
05H —打印输出
06H —控制台输入/输出
AL=输入字符
07H —键盘输入(无回显) 不过滤控制字符
AL=输入字符
08H —键盘输入(无回显) 检测Ctrl-Break AL=输入字符 过滤控制字符
09H —显示字符串
输出DS:DX开始的内容,以$结尾
0AH — 从标准输入设备上读入一个字节字符串,遇到“回车键”结束输入(输入的字符在标准的输出设备上有回显)
0BH —检测输入状态
0CH —清输入缓冲区的输入功能
move des,sou
将源操作数复制到目的操作数
不能用于直接将数据从一个内存位置传送到另一个内存位置,必须先将该数值传送给一个寄存器
offset x
返回x的位置(偏移量)
jmp des
无条件跳转到目标地址
cmp x,y
op z
cmp x,y-比较x和y的大小,影响flag位
检测比较结果的条件转移指令(op):
ja x>y 高于则跳到z
jna x<= y 不高于则跳到z
jb x<y 低于则跳到z
jnb x>=y 不低于则跳到z
jnc CF=0(加法没有进位,减法没有借位),则跳到z
je x==y 等于则跳到z
jne x!=y 不等于则跳到z
jz x ==y 等于则跳到z
dec x
jnz y
x-1后判断符号位,不等于0则跳到y,等于0则向下执行
add x,y
x=x+y
DAA
十进制加减后需要用DAA将AL中的数值调整为正确
inc x
x=x+1
sub x,y
x=x-y
CALL B_TO_D16
调用子程序输出
XLAT
AL=BX+AL
DIV SRC
16位被除数,除数位8位
AL(商)=AX/SRC
AH(余数)=AX/SRC
32位被除数,除数为16位
AX(商)=DXAX/SRC
DX(余数)=DXAX/SRC
SHR AL,num
将AL中的数据左移num位
最低位用0补充
延时
DELAY PROC//循环200次
MOV BX,200
L1:DEC BX
JNZ L1
使用:call delay
循环
LOOP OPR
cx!=0时,进行OPR操作
与十六进制进行操作(and/or/…)时,如果十六进制数第一位是字母(A/B/…)时前面要加0
清零
XOR AX,AX
AX内容置零
交换
PUSH AX //把AX值压入堆栈段
PUSH BX
POP AX //把堆栈段的值赋给AX
POP BX
堆栈段的段值为SS*10H
偏移值为SP
堆栈是先进后出