<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} p {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->
www.asmedu.net ——超级好的汇编学习网站
一:寄存器的相关指数:
1 :寄存器:是 CPU 的组成部分,读取和存储速度非常快,但是容量很小。
2 :在中央处理器的控制部件 中,包含有指令寄存器 (IR) 和程序计数器 (PC) .
3 :在中央处理器的逻辑部件 中,包含有累加器 (ACC)
4 :寄存器的用途: 1> 寄存器中的数据用来进行算术逻辑运算 。 2> 寄存器中的地址可以指向内存的某个位置,即 寻址 。 3> 可以将数据写到电脑的周边设备 。
5 :寄存器的分类:
AX ( AH & AL )累加寄存器, 用于算术逻辑运算
BX ( BH & BL )基址寄存器, 用于地址索引 ( 寻址的 )
CX ( CH & CL )计数寄存器, 用于计数
DX ( DH & DL )数据寄存器, 用于传递数据
段寄存器:
CS (Code Segment) :代码段寄存器
DS (Data Segment) :数据段寄存器
SS (Stack Segment) :堆栈段寄存器
ES (Extra Segment) :附加段寄存器
一些特殊功能的寄存器:
IP ( Instruction Pointer )指令指针寄存器 ,与 CS 配合使用,用来跟踪程序的执行过程
SP ( Stack Pointer )堆栈指针寄存器 ,与 SS 配置使用,用于执行目前的堆栈的位置。
BP ( Base Poniter )基址指针寄存器 ,可用作 SS 的一个相对基址位置。
SI ( Source index )原变址寄存器 ,可用来存放相对于 DS 段中的源变化地址。
DI ( Destination index )目的变址寄存器 。 用来存放相对于 ES 段的目的变址指针。
FLAG :标志寄存器 ( 状态寄存器 )
二: 8086/8088 指令详解
一、数据传送指令
1. 通用数据传送指令
MOV (Move )传送
PUSH (Push onto the stack )进栈
POP (Pop from the stack )出栈
XCHG (Exchange )交换
.MOV 指令
格式为: MOV DST,SRC
执行的操作:(DST)<-(SRC)
.PUSH 进栈指令
格式为:PUSH SRC
执行的操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(SRC)
.POP 出栈指令
格式为:POP DST
执行的操作:(DST)<-((SP+1),(SP))
(SP)<-(SP)+2
.XCHG 交换指令
格式为:XCHG OPR1,OPR2
执行的操作:(OPR1)<-->(OPR2)
2. 累加器专用传送指令
IN(Input) 输入
OUT(Output) 输出
XLAT(Translate) 换码
这组指令只限于使用累加器AX 或AL 传送信息.
.IN 输入指令
长格式为: IN AL,PORT( 字节)
IN AX,PORT( 字)
执行的操作: (AL)<-(PORT)( 字节)
(AX)<-(PORT+1,PORT)( 字)
短格式为: IN AL,DX( 字节)
IN AX,DX( 字)
执行的操作: AL<-((DX))( 字节)
AX<-((DX)+1,DX)( 字)
.OUT 输出指令
长格式为: OUT PORT,AL( 字节)
OUT PORT,AX( 字)
执行的操作: (PORT)<-(AL)( 字节)
(PORT+1,PORT)<-(AX)( 字)
短格式为: OUT DX,AL( 字节)
OUT DX,AX( 字)
执行的操作: ((DX))<-(AL)( 字节)
((DX)+1,(DX))<-AX( 字)
在IBM-PC 机里, 外部设备最多可有65536 个I/O 端口,
端口( 即外设的端口地址) 为0000~FFFFH. 其中前256 个端
口(0~FFH) 可以直接在指令中指定, 这就是长格式中的PORT,
此时机器指令用二个字节表示, 第二个字节就是端口号. 所以
用长格式时可以在指定中直接指定端口号, 但只限于前256 个
端口. 当端口号>=256 时, 只能使用短格式, 此时, 必须先把端
口号放到DX 寄存器中( 端口号可以从0000 到0FFFFH), 然后
再用IN 或OUT 指令来 传送信息.
.XLAT 换码指令
格式为: XLAT OPR
或: XLAT
执行的操作:(AL)<-((BX)+(AL))
3. 有效地址送寄存器指令
LEA(Load effective address) 有效地址送寄存器
LDS(Load DS with Pointer) 指针送寄存器和DS
LES(Load ES with Pointer) 指针送寄存器和ES
.LEA 有效地址送寄存器
格式为: LEA REG,SRC
执行的操作:(REG)<-SRC
指令把源操作数的有效地址送到指定的寄存器中.
.LDS 指针送寄存器和DS 指令
格式为: LDS REG,SRC
执行的操作:(REG)<-(SRC)
(DS)<-(SRC+2)
把源操作数指定的4 个相继字节送到由指令指定的寄存器
及DS 寄存器中. 该指令常指定SI 寄存器.
.LES 指针送寄存器和ES 指令
格式为: LES REG,SRC
执行的操作: (REG)<-(SRC)
(ES)<-(SRC+2)
把源操作数指定的4 个相继字节送到由指令指定的寄存器
及ES 寄存器中. 该指令常指定DI 寄存器.
4. 标志寄存器传送指令
LAHF(Load AH with flags) 标志送AH
SAHF(store AH into flags)AH 送标志寄存器
PUSHF(push the flags) 标志进栈
POPF(pop the flags) 标志出栈
.LAHF 标志送AH
格式为: LAHF
执行的操作:(AH)<-(PWS 的低字节)
.SAHF AH 送标志寄存器
格式为: SAHF
执行的操作:(PWS 的低字节)<-(AH)
.PUSHF 标志进栈
格式为: PUSHF
执行的操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
.POPF 标志出栈
格式为: POPF
执行的操作:(PWS)<-((SP)+1,(SP))
(SP)<-(SP+2)
二、算术指令
1. 加法指令
ADD(add) 加法
ADC(add with carry) 带进位加法
INC(increment) 加1
.ADD 加法指令
格式: ADD DST,SRC
执行的操作:(DST)<-(SRC)+(DST)
.ADC 带进位加法指令
格式: ADC DST,SRC
执行的操作:(DST)<-(SRC)+(DST)+CF
.ADD 加1 指令
格式: INC OPR
执行的操作:(OPR)<-(OPR)+1
2. 减法指令
SUB(subtract) 减法
SBB(subtract with borrow) 带借位减法
DEC(Decrement) 减1
NEG(Negate) 求补
CMP(Compare) 比较
.SUB 减法指令
格式: SUB DST,SRC
执行的操作:(DST)<-(DST)-(SRC)
.SBB 带借位减法指令
格式: SBB DST,SRC
执行的操作:(DST)<-(DST)-(SRC)-CF
.DEC 减1 指令
格式: DEC OPR
执行的操作:(OPR)<-(OPR)-1
.NEG 求补指令
格式: NEG OPR
执行的操作:(OPR)<- -(OPR)
.CMP 比较指令
格式: CMP OPR1,OPR2
执行的操作:(OPR1)-(OPR2)
该指令与SUB 指令一样执行减法操作, 但不保存结果,
只是根据结果设置条件标志西半球.
3. 乘法指令
MUL(Unsigned Multiple) 无符号数乘法
IMUL(Signed Multiple) 带符号数乘法
.MUL 无符号数乘法指令
格式: MUL SRC
执行的操作:
字节操作数:(AX)<-(AL)*(SRC)
字操作数:(DX,AX)<-(AX)*(SRC)
.IMUL 带符号数乘法指令
格式: IMUL SRC
执行的操作: 与MUL 相同, 但必须是带符号数, 而MUL 是无符号数.
4. 除法指令
DIV(Unsigned divide) 无符号数除法
IDIV(Signed divide) 带符号数除法
CBW(Convert byte to word) 字节转换为字
CWD(Contert word to double word) 字转换为双字
.DIV 无符号数除法指令
格式: DIV SRC
执行的操作:
字节操作:(AL)<-(AX)/(SRC) 的商
(AH)<-(AX)/(SRC) 的余数
字操作: (AX)<-(DX,AX)/(SRC) 的商
(AX)<-(DX,AX)/(SRC) 的余数
.IDIV 带符号数除法指令
格式: DIV SRC
执行的操作: 与DIV 相同, 但操作数必须是带符号数, 商和余数
也均为带符号数, 且余数的符号与被除数的符号相同.
.CBW 字节转换为字指令
格式: CBW
执行的操作:AL 的内容符号扩展到AH. 即如果(AL) 的最高有效
位为0, 则(AH)=00; 如(AL) 的最高有效位为1, 则(AH)=0FFH
.CWD 字转换为双字指令
格式: CWD
执行的操作:AX 的内容符号扩展到DX. 即如(AX) 的最高有效位
为0, 则(DX)=0; 否则(DX)=0FFFFH.
这两条指令都不影响条件码.
三、逻辑指令
1. 逻辑运算指令
AND(and) 逻辑与
OR(or) 逻辑或
NOT(not) 逻辑非
XOR(exclusive or) 异或
TEST(test) 测试
.AND 逻辑与指令
格式: AND DST,SRC
执行的操作:(DST)<-(DST)^(SRC)
.OR 逻辑或指令
格式: OR DST,SRC
执行的操作:(DST)<-(DST)V(SRC)
.NOT 逻辑非指令
格式: NOT OPR
执行的操作:(OPR)<-(OPR)
.XOR 异或指令
格式: XOR DST,SRC
执行的操作:(DST)<-(DST)V(SRC)
.TEST 测试指令
格式: TEST OPR1,OPR2
执行的操作:(DST)^(SRC)
两个操作数相 与 的结果不保存, 只根据其特征置条件码
2. 移位指令
SHL(shift logical left) 逻辑左移
SAL(shift arithmetic left) 算术左移
SHR(shift logical right) 逻辑右移
SAR(shift arithmetic right) 算术右移
ROL(Rotate left) 循环左移
ROR(Rotate right) 循环右移
RCL(Rotate left through carry) 带进位循环左移
RCR(Rotate right through carry) 带进位循环右移
格式: SHL OPR,CNT( 其余的类似)
其中OPR 可以是除立即数以外的任何寻址方式. 移位次数由CNT 决定,
CNT 可以是 1 或 CL . 循环移位指令可以改变操作数中所有位的位置; 移
位指令则常常用来做乘以2 除以2 操作. 其中算术移位指令适用于带符
号数运算,SAL 用来乘2,SAR 用来除以2; 而逻辑移位指令则用来无符
号数运算,SHL 用来乘2,SHR 用来除以2.
四、串处理指令
1. 与REP 相配合工作的MOVS,STOS 和LODS 指令
.REP 重复串操作直到(CX)=0 为上
格式: REP string primitive
其中String Primitive 可为MOVS,LODS 或STOS 指令
执行的操作:
1) 如(CX)=0 则退出REP, 否则往下执行.
2)(CX)<-(CX)-1
3) 执行其中的串操作
4) 重复1)~3)
.MOVS 串传送指令
格式: 可有三种
MOVS DST,SRC
MOVSB( 字节)
MOVSW( 字)
其中第二、三种格式明确地注明是传送字节或字,第一种格式则应
在操作数中表明是字还是字节操作,例如:
MOVS ES:BYTE PTR[DI],DS:[SI]
执行的操作:
1)((DI))<-((SI))
2) 字节操作:
(SI)<-(SI)+( 或-)1,(DI)<-(DI)+( 或-)1
当方向标志DF=0 时用+, 当方向标志DF=1 时用-
3) 字操作:
(SI)<-(SI)+( 或-)2,(DI)<-(DI)+( 或-)2
当方向标志DF=0 时用+, 当方向标志DF=1 时用-
该指令不影响条件码.
.CLD (Clear direction flag) 该指令使DF=0, 在执行串操作
指令时可使地址自动增量;
.STD (Set direction flag) 该指令使DF=1, 在执行串操作指
令时可使地址自动减量.
.STOS 存入串指令
格式: STOS DST
STOSB( 字节)
STOSW( 字)
执行的操作:
字节操作:((DI))<-(AL),(DI)<-(DI)+-1
字操作: ((DI))<-(AX),(DI)<-(DI)+-2
该指令把AL 或AX 的内容存入由(DI) 指定的附加段的某单元中, 并根
据DF 的值及数据类型修改DI 的内容, 当它与REP 联用时, 可把AL 或AX
的内容存入一个长度为(CX) 的缓冲区中.
.LODS 从串取指令
格式: LODS SRC
LODSB
LODSW
执行的操作:
字节操作:(AL)<-((SI)),(SI)<-(SI)+-1
字操作: (AX)<-((SI)),(SI)<-(SI)+-2
该指令把由(SI) 指定的数据段中某单元的内容送到AL 或AX 中, 并根据
方向标志及数据类型修改SI 的内容. 指令允许使用段跨越前缀来指定非
数据段的存储区. 该指令也不影响条件码. 一般说来, 该指令不和REP 联
用. 有时缓冲区中的一串字符需要逐次取出来测试时, 可使用本指令.
2. 与REPE/REPZ 和REPNZ/REPNE 联合工作的CMPS 和SCAS 指令
.REPE/REPZ 当相等/ 为零时重复串操作
格式: REPE( 或REPZ) String Primitive
其中String Primitive 可为CMPS 或SCAS 指令.
执行的操作:
1) 如(CX)=0 或ZF=0( 即某次比较的结果两个操作数不等) 时退出,
否则往下执行
2)(CX)<-(CX)-1
3) 执行其后的串指令
4) 重复1)~3)
.REPNE/REPNZ 当不相等/ 不为零时重复串操作
格式: REPNE( 或REPNZ) String Primitive
其中String Primitive 可为CMPS 或SCAS 指令
执行的操作:
除退出条件(CX=0) 或ZF=1 外, 其他操作与REPE 完全相同.
.CMPS 串比较指令
格式: CMP SRC,DST
CMPSB
CMPSW
执行的操作:
1)((SI))-((DI))
2) 字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1
字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2
指令把由(SI) 指向的数据段中的一个字( 或字节) 与由(DI) 指向的
附加段中的一个字( 或字节) 相减, 但不保存结果, 只根据结果设置条
件码, 指令的其它特性和MOVS 指令的规定相同.
.SCAS 串扫描指令
格式: SCAS DST
SCASB
SCASW
执行的操作:
字节操作:(AL)-((DI)),(DI)<-(DI)+-1
字操作: (AL)-((DI)),(DI)<-(DI)+-2
该指令把AL( 或AX) 的内容与由(DI) 指定的在附加段中的一个字节( 或字) 进行比较, 并不保存结果, 只根据结果置条件码. 指令的其他特性和MOVS 的规定相同.
五、控制转移指令
1. 无条件转移指令
.JMP(j mp) 跳转指令
1) 段内直接短转移
格式:JMP SHORT OPR
执行的操作:(IP)<-(IP)+8 位位移量
2) 段内直接近转移
格式:JMP NEAR PTR OPR
执行的操作:(IP)<-(IP)+16 位位移量
3) 段内间接转移
格式:JMP WORD PTR OPR
执行的操作:(IP)<-(EA)
4) 段间直接( 远) 转移
格式:JMP FAR PTR OPR
执行的操作:(IP)<-OPR 的段内偏移地址
(CS)<-OPR 所在段的段地址
5) 段间间接转移
格式:JMP DWORD PTR OPR
执行的操作:(IP)<-(EA)
(CS)<-(EA+2)
2. 条件转移指令
1) 根据单个条件标志的设置情况转移
.JZ( 或JE )(Jump if zero,or equal) 结果为零( 或相等) 则转移
格式:JE( 或JZ) OPR
测试条件:ZF=1
.JNZ( 或JNE) (Jump if not zero,or not equal) 结果不为零
( 或不相等) 则转移
格式:JNZ( 或JNE) OPR
测试条件:ZF=0
.JS (Jump if sign) 结果为负则转移
格式: JS OPR
测试条件:SF=1
.JNS (Jump if not sign) 结果为正则转移
格式:JNS OPR
测试条件:SF=0
.JO (Jump if overflow) 溢出则转移
格式: JO OPR
测试条件:OF=1
.JNO (Jump if not overflow)
不溢出则转移
格式: JNO OPR
测试条件:OF=0
.JP( 或JPE)(Jump if parity,or parity even)
奇偶位为1 则转移
格式: JP OPR
测试条件:PF=1
.JNP( 或JPO)(Jump if not parity,or parity odd)
奇偶位为0 则转移
格式: JNP( 或JPO) OPR
测试条件:PF=0
.JB( 或JNAE,JC)(Jump if below,or not above or equal,or carry)
低于, 或者不高于或等于, 或进位位为1 则转移
格式:JB( 或JNAE,JC) OPR
测试条件:CF=1
.JNB( 或JAE,JNC)(Jump if not below,or above or equal,or not carry)
不低于, 或者高于或者等于, 或进位位为0 则转移
格式:JNB( 或JAE,JNC) OPR
测试条件:CF=0
2) 比较两个无符号数, 并根据比较的结果转移
.JB( 或JNAE,JC)
格式: 同上
.JNB( 或JAE,JNC)
格式: 同上
.JBE( 或JNA)(Jump if below or equal,or not above)
低于或等于, 或不高于则转移
格式:JBE( 或JNA) OPR
测试条件:CFVZF=1
.JNBE( 或JA)(Jump if not below or equal,or above)
不低于或等于, 或者高于则转移
格式:JNBE( 或JA) OPR
测试条件:CFVZF=0
3) 比较两个带符号数, 并根据比较的结果转移
.JL( 或LNGE)(Jump if less,or not greater or equal)
小于, 或者不大于或者等于则转移
格式:JL( 或JNGE) OPR
测试条件:SFVOF=1
.JNL( 或JGE)(Jump if not less,or greater or equal)
不小于, 或者大于或者等于则转移
格式:JNL( 或JGE) OPR
测试条件:SFVOF=0
.JLE( 或JNG)(Jump if less or equal,or not greater)
小于或等于, 或者不大于则转移
格式:JLE( 或JNG) OPR
测试条件:(SFVOF)VZF=1
.JNLE( 或JG)(Jump if not less or equal,or greater)
不小于或等于, 或者大于则转移
格式:JNLE( 或JG) OPR
测试条件:(SFVOF)VZF=0
4) 测试CX 的值为0 则转移指令
.JCXZ(Jump if CX register is zero)
CX 寄存器的内容为零则转移
格式:JCXZ OPR
测试条件:(CX)=0
注: 条件转移全为8 位短跳!
3. 循环指令
.LOOP 循环指令
格式: LOOP OPR
测试条件:(CX)<>0
.LOOPZ/LOOPE 当为零或相等时循环指令
格式: LOOPZ( 或LOOPE) OPR
测试条件:(CX)<>0 且ZF=1
.LOOPNZ/LOOPNE 当不为零或不相等时循环指令
格式: LOOPNZ( 或LOOPNE) OPR
测试条件:(CX)<>0 且ZF=0
这三条指令的步骤是:
1)(CX)<-(CX)-1
2) 检查是否满足测试条件, 如满足则(IP)<-(IP)+D8 的符号扩充.
4. 子程序
.CALL 调用指令
.RET 返回指令
5. 中断
.INT 指令
格式: INT TYPE
或 INT
执行的操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(TYPE*4)
(CS)<-(TYPE*4+2)
.INTO 若溢出则中断
执行的操作: 若OF=1 则:
(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW) ( 状态字寄存器)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(10H)
(CS)<-(12H)
.IRET 从中断返回指令
格式: IRET
执行的操作:(IP)<-((SP)+1,(SP))
(SP)<-(SP)+2
(CS)<-((SP)+1,(SP))
(SP)<-(SP)+2
(PSW)<-((SP)+1,(SP))
(SP)<-(SP)+2
六、处理机控制指令
1. 标志处理指令
.CLC 进位位置0 指令(Clear carry)CF<-0
.CMC 进位位求反指令(Complement carry)CF<-CF
.STC 进位位置1 指令(Set carry)CF<-1
.CLD 方向标志置0 指令(Clear direction)DF<-0
.STD 方向标志置1 指令(Set direction)DF<-1
.CLI 中断标志置0 指令(Clear interrupt)IF<-0
.STI 中断标志置1 指令(Set interrupt)IF<-0
2. 其他处理机控制指令
NOP(No Opreation) 无操作
HLT(Halt) 停机
WAIT(Wait) 等待
ESC(Escape) 换码
LOCK(Lock) 封锁
这些指令可以控制处理机状态. 这们都不影响条件码.
.NOP 无操作指令
该指令不执行任何操作, 其机器码占有一个字节, 在调试程序时往往
用这条指令占有一定的存储单元, 以便在正式运行时用其他指令取代.
.HLT 停机指令
该指令可使机器暂停工作, 使处理机处于停机状态以便等待一次外部中断到来, 中断结束后可继续执行下面的程序.
.WAIT 等待指令
该指令使处理机处于空转状态, 它也可以用来等待外部中断的发生,
但中断结束后仍返回WAIT 指令继续德行.
.ESC 换码指令
格式ESC mem
其中mem 指出一个存储单元,ESC 指令把该存储单元的内容送到数据总线去.
当然ESC 指令不允许使用立即数和寄存器寻址方式. 这条指令在使用协处理机(Coprocessor) 执行某些操作时, 可从存储器指得指令或操作数. 协处理机( 如8087) 则是为了提高速度而可以选配的硬件.
.LOCK 封锁指令
该指令是一种前缀, 它可与其他指令联合, 用来维持总线的锁存信号直到与其联合的指令执行完为止. 当CPU 与其他处理机协同工作时, 该指令可避免破坏有用信息.
三: C 语言与汇编语言的区别
1 :汇编语言的本质:是机器语言的助记符 。对于此句的理解 1>CPU 只能够运行它所支持的指令集,而这些指令集中的每条指令都是由 0 和 1 组成的有序序列 ; 2>0 和 1 的组合不便于程序员的记忆,所以就由汇编语言就产生了 , 如 mov A 0x40 。每一条汇编指令都对应着唯一一条机器指令。
2 :特点区别:汇编语言占用资源少、执行效率高,但是尅移植性很差 ( 不同的 CPU 其汇编语言可能有所差异 ) 。而 C 语言面向过程的高级语言,其特点是,可读性好,便于移植 ,但是占用资源多,执行效率不如汇编高 。
3 :汇编语言里一般没有支持浮点运算的指令,所以通常请况下要做浮点运算都必须写一个函数来完成。用汇编写程序对程序员的要求比较高,一般要掌握 CPU 的内存结构、总线结构、功能模块、堆栈系统、中断等。
四:汇编语言学习——王爽第二版
第二章:寄存器
1 :存储单元:一个字节就是一个存储单元 。
2 : CPU 要进行读写 必须和外部部件进行以下 3 类信息的交互:存储单元的地址、控制信息 ( 读或者写 ) 、读写的数据信息。
3 : 8086CPU 有 20 位地址总线 ,可以传送 20 位地址。 8086 是 16 位结构。
4 :在 8086 机器中,任意时刻,设 CS 中的内容为 M , IP 中的内容为 N ,那么 CPU 从 M*16+N 单元开始读取一条指令并执行。即,在任意时候, CPU 将 CS:IP 指向的内容当做指令执行 。
5 :能够修改 CS IP 内容的指令统称为转移指令 (jmp) 。如果相同时修改 CS IP 的内容,可以这样写: jmp 段地址:偏移地址。比如: jmp 2AE3 : 3 那么, CPU 将从 2AE33 开始的内容单元读取指令并执行
6 :“ jmp 某一合法寄存器 ”指令的功能为:用通用寄存器的值修改 IP 。比如: jmp ax 该指令执行前: ax=1000H CS=2000H IP=0003H , 执行后: ax=1000H CS=2000H IP=1000H
7 :对于 8086PC 机,编程时可以将一组内存单元定义为一个段 。
8 : CS 用来存放指令的段地址, IP 存放指令的偏移地址;
9 : 8086CPU 的工作过程: 1> : CPU 从 CS : IP 指向的内容读取指令,并存放到指令缓冲器 2> : IP 指向下一条指令 3> 执行刚才读取的指令 ( 转到 1 ,重复操作 ) 注: 8086 提供了转移指令用来修改 CS IP 的内容。
10 : CPU 从何处执行指令是由 CS 和 IP 的内容决定的 。
11 : CPU 寻址:可以这样理解, CPU 寻找所要操作数据的内存地址 。 CPU 寻址能力 ,是指最大能够查找多大范围的地址。
第三章:寄存器 ( 内存访问 )
1 :内存中用 2 个存储单元来存储一个字 (1 个字占 2 个字节 ) ,而 CPU 中用 16 位寄存器 来存储一个字。
2 :字单元:存放一个字的内存单元 (2 个字节 ) ,有 2 个连续的内存单元组成 。
3 : DS 寄存器:通常用来存放要访问数据的段地址 。
4 :传送指令 mov 的作用 : 1> :将数据直接送入寄存器 2> 将一个寄存器中的内容送入到另一个寄存器。 3> 将一个内存单元中的数据送入到寄存器中,此时的 mov 指令的格式:
mov 寄存器名 内存单元
5 :指令执行时, 8086CPU 自动读取 ds 中 的数据作为内存单元的段地址。
6 : 8086CPU 不支持将数据直接送入到段寄存器的操作 ( 这是硬件设计的问题 )
7 :多少位的 CPU 就有多少根数据线。
8 :数据段 :我们将一组长度为 N ( N <= 64KB )地址连续、 , 起始地址为 16 倍数的内存单元专门用来存储数据的内存空间称之为数据段。本质:是地址连续、起始地址为 16 倍数的内存空间。
9 :在进行 POP 和 PUSH 操作时, CPU 是如何确定栈顶位置的? 8086CPU 中提供了堆栈段寄存器 (SS) 和堆栈指针寄存器 (SP) ,栈顶的段地址存放在 SS 中,而栈顶的偏移地址存放在 SP 中 。任意时刻: SS : SP 指向栈顶
10 :当栈为空时 SS:SP 指向栈的最高地址单元的下一个单元
11 : 8086CPU 工作机理 :它只考虑当前的情况,当前的栈顶位置、当前执行的是那条指令 。
12 :栈的小结 : 1>SS 和 SP 分别存放栈顶的段地址和偏移地址 2> 入栈操作 SP=SP-2 ,然后向 SS:SP 指向的内存单元送入数据 3> 出战操作 将 SS:SP 指向的内存单元的数据取出来,然后 SP=SP+2 3> 任意时刻, SS:SP 指向栈顶元素 4>8086CPU 只记录栈顶,栈空间的大小要靠我们自己管理 5> 栈是一种非常重要的机制,一定要深入理解 。
13 : debug 进入汇编, d 命令式查看内存单元的, d 段地址:偏移地址——查看指定内存单元的内容,
第四章:完整的汇编程序
1 :伪指令 :汇编源程序中包含汇编指令和伪指令 两种指令。汇编指令有唯一的机器指令,故,汇编指令有 CPU 来执行。而伪指令没有对应的机器指令,故,只能由编译器来执行。
2 : segment 和 ends 是一对成对使用的伪指令 ,在编写汇编源程序时必须用到。用于说明段的开始和结束。
3 : end 伪指令:用于标识汇编程序的结束 。
4 :汇编程序的构成:源程序是由一些段构成的 。
5 :