‘A’—’Z’ 41h — 5Ah ‘1’—’9’ 31h — 39h
‘a’—’z’ 61h — 7Ah 空格—20h ‘\0’ — 00h
换行—0Ah 回车 — 0Dh 换页 — 0Ch 文件尾 — 1Ah
DOS(Windows)文本换行——0Dh,0Ah;
Unix文本换行——0Ah
PC三大部分: 中央处理器(CPU)、存储器、输入/输出(I/O)子系统;
一般计算机的五大部分: 运算器、存储器、控制器、输入设备、输出设备;
CPU: 由运算器和控制器组成;
8086 CPU的三部分:ALU, 控制逻辑,寄存器组;
? 字长(ALU, 寄存器) : 16位;
? 地址:20根地址线(寻址能力为1 MB);
? 外部数据总线:16位(8086), 8位(8088) ;最早的PC以8088为主
数据寄存器
指针/变址寄存器
CS——代码段寄存器
DS——数据段寄存器
SS——堆栈段寄存器
ES——附加段寄存器
IP ——指令指针(指令计数器)
PSW——程序状态字寄存器
SS:SP组成当前堆栈 CS:IP组成当前可执行点
9个1位的标志寄存器,组合在一起,放入一个16位的程序状态字寄存器PSW中
OF 溢出标志 DF 方向标志 SF 符号标志 IF 中断标志
ZF 零标志 TF 陷阱标志 CF 进位标志 PF 奇偶标志
AF 辅助进位标志
立即寻址:指令操作数包含在指令中,为一个常量或常数,称为立即数
-立即寻址只能出现在源操作数位置,不能出现在目的操作数的位置;
-立即数为常数,可以直接写在指令中;
-立即数位常量,需要在指令前用EQU定义。
寄存器寻址:指令操作数为CPU的寄存器
-MOV当使用CS,DS,SS,ES段寄存器时,必须按照MOV数据通路要求
-操作数中的寄存器可能是隐含的寄存器,如PUSHF,STD等。
直接寻址:操作数的偏移地址EA直接在指令中给出
MOV AX,[2000H]
-若没有段超越,一般取操作数相对于数据段DS,所以可以省略不指定;
-指令中出现的变量,会被代替为偏移值,所以也是直接寻址
x DW ‘A‘
MOV AX, c
MOV AX,x+1
-对于取地址的操作,变量名实际上是一个立即数,是立即寻址:
LEA BX,x3
MOV BX, OFFSET x3
-LEA BX,[SI]相当于MOVE,是寄存器寻址
寄存器间接寻址:操作数地址EA位于一个寄存器(BX,BP,SI,DI)中
-默认:BX,SI,DI相对于DS段偏移地址,BP相对于SS段偏移地址;
-只能用基址寄存器BX,BP和变址寄存器SI,DI,不能用其他寄存器;
寄存器相对寻址:操作数地址EA由地址寄存器+8位和16位的常量组成
-段寄存器默认规则同上;
MOV AX,[SI+10H]
MOV AX,10H[SI]
-偏移量可以是符号名或变量名;
MOV AX,ARRAY[SI]
MOV TABLE[DI],AL
MOV TABLE[DI+1],AL
基址变址寻址:操作数地址EA为一个基址寄存器和一个变址寄存器之和
-若基址寄存器为BX,则缺省时段寄存器为DS;若基址寄存器为BP,则缺省时段寄存器为SS;
MOV AX, [BX][SI]
MOV ES:[BX+SI],AL
-可以将其理解为寄存器相对寻址加上一个变址寄存器;
MOV AX,[BX+SI+200]
MOV ARRAY[BP+SI],AX
-基址寄存器只能是BX,BP,变址寄存器只能是SI,DI
段内直接寻址:
? -JMP NEAR PTR 标号 //16位偏移值;
-JMP SHORT 标号 //8位偏移值,段内直接短转移;
-汇编后指令中不会直接出现偏移地址,而是相对于当前IP的位移量;
-条件跳转只能是8位偏移量,省略SHORT;JMP两者皆可,缺省默认位16位;
段内间接寻址:JMP WORD PTR 寄存器或内存单元;
-CALL BX //跳转地址是寄存器
-CALL [BX] //跳转地址是内存单元
-寄存器可以是AX,BX,CX,DX,SI,DI,BP,SP中任何一个
段间直接寻址:JMP FAR PTR 标号;
-要转移的标号或过程名必须具备far属性;
段间间接寻址:JMP DWROD PTR 内存单元;
-要转移的地址只能位于内存单元,不能位于寄存器中;
-取内存中的一个双字,高位送入CS,低位送入IP;

默认段寄存器:数据访问一般相对DS,BP相对于SS,转移相对于CS,串指令的DI相对于ES
段超越:指定段寄存器,改变默认规则
MOV dst,src
-源和目的必须长度匹配;
-必须符合数据通路规则;
-可以通过BYTE PTR,WROD PTR,DWORD PTR明确指定内存操作数的类型,或强制类型转换;
-MOV和XCHG执行后都不影响标志寄存器;
? -SRC和DST可以是寄存器及内存操作数(可以是除立即数以为的如何寻址方式)
-堆栈操作只能以字为单位,不能是字节;
-PUSH指令可以用CS,POP则不可以;
? LEA reg,src //将src的偏移地址送入reg,等价于OFFSET
LDS reg,src //取src中的双字,高位送入DS,低位送入reg
LES reg,src //取src中的双字,高位送入ES,低位送入reg
? 三条指令中,reg不能是段寄存器。
LDS,LES中若src为指定类型的变量(直接寻址),该变量必须为DD;
若src为寄存器间接/相对寻址,自动默认为DWORD PTR,但是要符合基址/变址寄存器的要求。
ADD dst,src ;dst=dst+src,影响CF,SF,ZF等
ADC dst,src ;dst=dst+src+CF,影响CF,SF,ZF
INC opr ;opr=opr+1,影响CF,SF,ZF
SUB dst,src ;dst=dst-src,影响CF,SF,ZF等
SBB dst,src ;dst=dst-src-CF,影响CF,SF,ZF
DEC opr ;opr=opr+1,影响CF,SF,ZF
无符号乘法MUL src
-src为字节操作数——8位x8位,AX?AL x src
-src为字操作数———16位x16位,DX:AX?AX x src
-操作数可以是寄存器,内存但不能是立即数
无符号除法DIV src
-必须是32位除以16位,16位除以8位;
-除数和被除数都为16位,需将DX清零;
-16位除以8位,需主动考虑除法结果溢出的问题
-src为字节操作数——AX/src?AL(商),余数在AH中
-src为字操作数———DX:AX/src?AX(商),余数在DX中
-操作数可以是寄存器,内存但不能是立即数
CBW:将AL的符号位扩展至AH。
-AND dst,src
-OR dst,src
-XOR dst,src
-NOT dst
-TEST指令类似于AND,但不会将运算结果送至目的操作数,而是为了产生标志位,主要是ZF;由于测试一个对象的某一位/某几位的状态;
count只能为1或者CL
图解:
CALL指令执行过程:
RET指令执行过程:
(1)标号(符号、变量,不区分大小写),变成逻辑地址(立即数);
(2)指令或伪指令(助记符);
(3) 操作数;
DB,DW,DD定义变量;
EQU定义常量(不占内存,被编译变成值)
STRING1 DB ‘ABCD‘,0DH,0AH,‘$‘
按字节分配单元
STRING2 ‘AB‘,‘CD‘
按字分配单元,高位在前低位在后
注:
1.对于DW,DD伪指令,不允许使用两个以上字符的字符串作为其参数。
2.定义数据时,可以用DW,DD把标号或变量的偏移地址或整个逻辑地址存入另一个变量中;
-OFFSET 变量名/标号
-SEG 变量名/标号
OFFSET:送回变量名或标号(过程名)的偏移地址;
SEG:送回变量名或标号(过程名)的段地址;
-类型 PTR 地址表达式
强制说明或转换存储单元的类型为BYTE,WORD,DWORD,FAR,NEAR中的一种。
-THIS 类型
为某个变量名指定一个类型(BYTE,WORD,DWORD),或为某个标号或过程名指定一种转移距离(NEAR,FAR),改操作数与下一个存储单元地址相同。
X1 EQU THIS BYTE
X2 DW 100 DUP(?)
CS:,DS:,ES:,SS:,用于段超越
用来指定JMP指令中转向地址为8位位移量,而不是缺省的16位位移量。
操作对象位数值表达式或地址表达式,HIGH取高位字节,LOW取低位字节。
r——显示或修改寄存器
d——显示或修改内存单元(数据段、堆栈段)
u——反汇编,查看内存中的程序
e——改内存单元
a——汇编命令,直接在内存中输入指令序列
t——单步跟踪命令,进入子程序、循环、功能调用
p——单步执行命令,执行完子程序、循环、功能调用
g——运行命令,执行到某个指令(地址处)
q——退出debug
两种返回DOS的方式:
方式1:
MAIN PROC FAR
;MOV AX,STARK
;MOV SS,AX
;MOV DP,STARK_BOTTOM
MOV AX,DATA
MOV DS,AX
...
...
...
EXIT: MOV AX,4C00H
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
方式2:
MAIN PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
...
...
...
RET
MAIN ENDP
特例,两个操作数都是内存操作数
原文:https://www.cnblogs.com/oounit1summary/p/14773303.html