文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言各种指令的解释与用法

汇编语言各种指令的解释与用法

汇编语言各种指令的解释与用法
汇编语言各种指令的解释与用法

【数据传输指令】

一、通用数据传送指令

1、传送指令MOV (move)

指令的汇编格式:MOV DST,SRC

指令的基本功能:(DST)<-(SRC) 将原操作数(字节或字)传送到目的地址。

指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令。指令的执行对标志位的影响:不影响标志位。

指令的特殊要求:目的操作数DST和源操作数SRC不允许同时为段寄存器;

目的操作数DST不能是CS,也不能用立即数方式。

2、进栈指令PUSH (push onto the stack)

出栈指令 POP (pop from the stack)

指令的汇编格式:PUSH SRC ;POP DST

指令的基本功能:PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。PUSH SRC (SP)<-(SP)-2 ;(SP)<-(SRC)

POP DST (DST)<-((SP));(SP)<-(SP)

指令支持的寻址方式:push 和 pop指令不能不能使用立即数寻址方式。

指令对标志位的影响:PUSH 和 POP指令都不影响标志位。

指令的特殊要求:PUSH 和 POP指令只能是字操作,因此,存取字数据后,SP的修改必须是+2 或者 -2; POP指令的DST不允许是CS寄存器;

3、交换指令XCHG (exchange)

指令的汇编格式:XCHG OPR1,OPR2

指令的基本功能:(OPR1)<->(OPR2)

指令支持的寻址方式:一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。指令对标志位的影戏:不影响标志位。

指令的特殊要求:不允许使用段寄存器。

二、累加器专用传送指令

4、输入指令IN (input)

输出指令 OUT (output)

指令的汇编格式:IN ac,port port<=0FFH

IN ac,DX port>0FFH

OUT port,ac port<=0FFH

OUT DX,ac port>0FFH

指令的基本功能:对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。IN指令将信息从I/O输入到CPU,OUT指令将信息从CPU输出到I/O 端口,因此,IN和OUT指令都要指出I/O端口地址。

IN ac,port port<=0FFH (AL)<-(port)传送字节或 (AX)<-(port+1,port)传送字

IN ac,DX port>0FFH (AL)<-((DX))传送字节或 (AX)<-((DX)+1,(DX))传送字

OUT port,ac port<=0FFH (port)<-(AL)传送字节或 (port+1,port)<-(AX)传送字

OUT DX,ac port>0FFH (DX)<-(AL)传送字节或 ((DX)+1,(DX))<-(AX)传送字

指令对标志位的影响:不影响标志位。指令的特殊要求:只限于在AL或AX与I/O端口之间传送信息。传送16位信息用AX,传送8位信息用AL,这取决于外设端口的宽度。

5、换码指令XLAT (translate)

指令的汇编格式:XLAT opr 或 XLAT

指令的基本功能:这条指令根据AL寄存器提供的位移量,将BX指使的字节表格中的代码换存在AL中。 (AL)<-((DS)*16+(BX)+(AL))

指令对标志位的影响:不影响标志位。

指令的特殊要求:所建字节表格的长度不能超过256字节,因为存放位移量的是8位寄存器AL。opr为表格的首地址,因为opr所表示的偏移地址已存入BX寄存器,所以opr在换码指令中可有可无,有则提高程序的可读性。

三、地址传送指令

6、有效地址传送器LEA (load effective address)

指令的汇编格式:LEA reg,src

指令的基本功能:LEA指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由src选定的一种存储器寻址方式确定的。

指令支持的寻址方式:各种存储器寻址方式。

指令对标志位的影响:不影响标志位。

指令的特出要求:指令中reg不能是段寄存器;

7、指针送寄存器和DS LDS (load DS with point)

指针送寄存器和ES LES (load ES with point)

指令的汇编格式:LDS reg,src LES reg,src

指令的基本功能:LDS和LES指令把确定内存单元位置的偏移地址送寄存器,段地址DS或ES。这个偏移地址和段地址(也称地址指针)是由src指定的两个相继字单元提供的。

LDS reg,src (reg)<-(src) (DS)<-(src+2)

LES reg,src (reg)<-(src) (ES)<-(src+2)

指令支持的寻址方式:src必须为存储器寻址方式

指令对标志位的影响:不影响标志位。

指令的特殊要求:指令中REG不能是段寄存器;

四、标志寄存器传送指令

8、标志寄存器的低字节送AH LAHF (load AH with FLAGS)

指令的汇编格式:LAHF

指令的基本功能:(AH)<-(FLAGS)0-7

指令对标志位的影响:不影响标志位

9、AH送标志寄存器低字节 SAHF(store AH into FLAGS)

指令的格式:SAHF

指令的基本功能:(FLAGS)0-7<-(AH)

指令对标志位的影响:由装入值来确定标志位的值。

10、标志进栈 PUSHF (push the flags)

指令的汇编格式:PUSHF

指令的基本功能:(SP)<-(SP)-2 ((SP)+1,(SP))<-(FLAGS)0-15

指令对标志位的影响:不影响标志位。

11、标志出栈 POPF (pop the FLAGES)

指令的汇编格式:POPF

指令的基本功能:(FLAGS)0-15<-((SP)+1,(SP)) (SP)<-(SP)+2

指令对标志位的影响:由装入值来确定标志位的值。

【算术指令】

一、加法指令

12、加法指令ADD (addition)

指令的汇编格式:add dst,src

指令的基本功能:(dst)<-(src)+(dst)

指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。

指令对标志位的影响:SF=1 加法结果为负数(符号位为1)

SF=0 加法结果为正数(符号位为0)

ZF=1 加法结果为零

ZF=0 加法结果不为零

CF=1 最高有效位向高位有进位

CF=0 最高有效位向高位无进位

OF=1 两个同符号数相加(正数+正数或负数+负数),结果符号与其相反。

OF=0 两个不同符号数相加,或同符号数相加,结果符号与其相同。

13、带进为加法指令ADC (add with carry)

指令的汇编格式:ADD dst,src

指令的基本功能:(dst)<-(src)+(dst)+CF

指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。

指令对标志位的影响:SF=1 加法结果为负数

SF=0 加法结果为正数

ZF=1 加法结果为零

ZF=0 加法结果不为零

CF=1 最高有效位向高位有进位

CF=0 最低有效位相高位无进位

OF=1 两个同符号数相加,结果符号与其相反,

OF=0 两个同符号数相加,或同符号相加,结果符号与其相同

14、加1指令INC (increament)

指令的汇编格式:INC opr

指令的基本功能:(opr)<-(opr)

指令支持的寻址方式可以使用除立即数方式外的任何寻址方式

指令对标志位的影响:SF=1 加法结果为负数

SF=0 加法结果为正数

ZF=1 加法结果为零

ZF=0 加法结果不为零

OF=1 两个同符号数相加,结果符号与其相反,

OF=0 两个同符号数相加,或同符号相加,结果符号与其相同。

二、减法指令

15、减法指令SUB (subtract)

指令的汇编格式:SUB dst,src

指令的基本功能:(dst)<-(dst)-(src)

指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况

外,源操作数和目地操作数必须有一个寄存器寻址方式。

指令对标志位的影响:SF=1 减法结果为负数(符号位为1)

SF=0 减法结果为正数(符号位为0)

ZF=1 减法结果为零

ZF=0 减法结果不为零

CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

16、带借位减法指令SBB (subtract with borrow)

指令的汇编格式:SBB dst,src

指令的基本功能:(dst)<-(dst)-(src)-CF

指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。

指令对标志位的影响:SF=1 减法结果为负数(符号位为1)

SF=0 减法结果为正数(符号位为0)

ZF=1 减法结果为零

ZF=0 减法结果不为零

CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

17、减1指令DEC (decrement)

指令的汇编格式:DEC opr

指令的基本功能:(opr)<-(opr)-1

指令支持的寻址方式:可以使用除立即数方式外的任何寻址方式。

指令对标志位的影响:SF=1 减法结果为负数(符号位为1)

SF=0 减法结果为正数(符号位为0)

ZF=1 减法结果为零

ZF=0 减法结果不为零

OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

18、比较指令CMP (compare)

指令的汇编格式:CMP opr1,opr2

指令的基本功能:(opr1)-(opr2),根据相减结果设置条件码,但不回送结果。

指令支持的寻址方式:他们两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。

指令对标志位的影响:

SF=1 减法结果为负数(符号位为1)

SF=0 减法结果为正数(符号位为0)

ZF=1 减法结果为零

ZF=0 减法结果不为零

CF=1 二进制减法运算中

最高有效位向高位有借位(被减数小于减数,不够减的情况)

CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)

OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。

OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

19、求补指令NEG (negate)

指令的汇编格式:NEG opr

指令的基本功能:(opr)<- -(opr)

指令支持的寻址方式:可以使用除立即数方式外的任何寻址方式。

指令对标志位的影响:CF=1 不为0的操作数求补时

CF=0 为0的操作数求补时

OF=1 操作数为-128(字节运算)或操作数为-32768(字运算)

OF=0 当求补运算的操作数不为-128(字节)或-32768(字)时三、乘法指令

20、无符号乘法指令NUL (unsigned multiple)

有符号乘法指令 IMUL(signed muliple)

指令的汇编格式:NUL src IMUL src

指令的基本功能:(AX)<-(AL)*(src) (DX,AX)<-(AX)*(src)

指令支持的寻址方式:src可以使用除立即数方式以外的任一种寻址方式。

指令对标志位的影响:乘法指令只影响标志位CF和OF,其他条件码位无定义。

MUL指令的条件码设置为:

CF OF=0 0 乘积的高一半为0(字节操作的(AH)或字操作的(DX))

CF OF=1 1 乘积的高一半不为0

IMUL指令的条件码设置为:

CF OF=0 0 乘积的高一半为低一半的符号扩展.

CF OF=1 1 其他情况

指令的特殊要求:MUL和IMUL指令的区别仅在于操作数是无符号还是带符号数,它们的共同点是,指令中只给出源操作数src,目的操作数是隐含的,它只能是累加器(字运算为AX,字节运算为AL)。隐含的乘积寄存器是AX或DX(高位)和AX(低位)。

四、符号扩展指令

21、节扩展为字CBW (convert byte to word)

指令的汇编格式:CBW

指令的基本功能:(AH)=00H 当(AL)的最高有效位为0时

(AH)=FFH 当(AL)的最高有效位为1时

指令对标志位的影响:不影响标志位

指令的特殊要求:这是条无操作数的指令,进行符号扩展的操作数必须存放在AL寄存器 AX寄存器中。

22、字扩展为双字CWD (convert word to double word)

指令的汇编格式:CWD

指令的基本功能:(DX)=0000H 当(AX)的最高有效位为0时

(DX)=FFFFH 当(AX)的最高有效位为1时

指令对标志位的影响:不影响标志位

指令的特殊要求:这是条无操作数的指令,进行符号扩展的操作数必须存放在AL寄存器或AX 寄存器中。

五、除法指令

23、无符号数除法DIV (unsigned divide)

带符号数除法 IDIV (singed divide)

指令的汇编格式:DIV src IDIV src

指令的基本功能:字操作

(AL)<-(AX)/src的商 (AH)<-(AX)/src的余数

字节操作

(AX)<-(DX,AX)/src的商 (DX)<-(DX,AX)/src的余数

指令支持的寻址方式:src作为除数,可用除立即数以外的任一种寻址方式来取得。

指令对标志位的影响:不影响条件码。

指令的特殊要求:除法指令要求字操作时,被除数必须为32位,除数是16位,商和余数是16位的;字节操作时,被除数必须为16位,除数是8位,得到的商和余数是8位的。

六、十进制调整指令

【逻辑指令】

一、逻辑运算

指令的格式:AND dst,src

指令的基本功能:(dst)<-(dst)与(src)

指令支持的寻址方式:两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,源操作数和目地操作数必须有一个寄存器寻址方式。

指令对标志位的影响:指令执行后CF 和OF 置零,AF无定义。

SF=1 指令执行后的结果为负数(符号位为1)

SF=0 指令执行后的结果为正数(符号位为0)

ZF=1 指令执行后的结果为零

ZF=0 指令执行后的结果不为零

PF=1 结果操作数中1的个数为偶数时置1

PF=0 结果操作数中1的个数为奇数时置0

25、逻辑或OR (logic or)

指令的汇编格式:OR dst,src

指令的基本功能:(dst)<-(dst)或(src)

指令支持的寻址方式:两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,原操作数和目的操作数必须有一个寄存器寻址方式。

指令对标志位的影响:令执行后CF 和OF 置零,AF无定义。

SF=1 指令执行后的结果为负数(符号位为1)

SF=0 指令执行后的结果为正数(符号位为0)

ZF=1 指令执行后的结果为零

ZF=0 指令执行后的结果不为零

PF=1 结果操作数中1的个数为偶数时置1

PF=0 结果操作数中1的个数为奇数时置0

26、逻辑非NOT (logic not)

指令的汇编格式:NOT orc

指令的基本功能:(dst)<-(opr)

指令支持的寻址方式:除立即数寻址方式以外的其余寻址方式

指令对标志位的影响:对标志位无影响

27、异或XOR (exclusice or)

指令的汇编格式:XOR dst,src

指令的基本功能:(dst)<-(dst)异或(src)

指令支持的寻址方式:两个操作数不能同时为存储器寻址。即为除源操作数为立即数的情况外,原操作数和目的操作数必须有一个寄存器寻址方式。

指令对标志位的影响:令执行后CF 和OF 置零,AF无定义。

SF=1 指令执行后的结果为负数(符号位为1)

SF=0 指令执行后的结果为正数(符号位为0)

ZF=1 指令执行后的结果为零

ZF=0 指令执行后的结果不为零

PF=1 结果操作数中1的个数为偶数时置1

PF=0 结果操作数中1的个数为奇数时置0

28、测试指令TEST

指令的汇编格式:TEST opr1,opr2

指令的基本功能:(opr1)与(opr2)

指令支持的寻址方式:两个操作数不能同时为存储器寻址,即为除源操作数为立即数的情况外,源操作数和目的操作数必须有一个寄存器寻址方式。

指令对标志位的影响:令执行后CF 和OF 置零,AF无定义。

SF=1 指令执行后的结果为负数(符号位为1)

SF=0 指令执行后的结果为正数(符号位为0)

ZF=1 指令执行后的结果为零

ZF=0 指令执行后的结果不为零

PF=1 结果操作数中1的个数为偶数时置1

PF=0 结果操作数中1的个数为奇数时置0

二、移位指令

29、逻辑左移SHL (shift logical left)

指令的汇编格式:SHL dst,cnt

指令的基本功能:SHL指令向左逐位移动cnt次,每次逐位移动后,最低位用0来补充,最高位移入CF。

指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL寄存器中。

指令对标志位的影响:CF=移入的数值

OF=1 当cnt=1时,移动后最高位的值发生变化。

OF=0 当cnt=1时,移动时最高位的值未发生变化。

SF、ZF、PF根据移动后的结果设置

30、逻辑右移SHR (shift logical right)

指令的汇编格式:SHR dst,cnt

指令的基本功能:SHR指令向右逐位移动cnt次,每次逐位移动后,最高位用0来补充,最低位移入CF。

指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL 寄存器中。

指令对标志位的影响:CF=移入的数值

OF=0 当cnt=1时,移动时最高位的值未发生变化。

SF、ZF、PF根据移动后的结果设置。

31、算术左移SAL (shift arithmetic left)

指令的汇编格式:SAL dst cnt

指令的基本功能:SAL指令向左逐位移动cnt次,每次逐位移动后,最低位用0来补充,最高位移入CF。

指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL 寄存器中。

指令对标志位的影响:CF=移入的数值

OF=1 当cnt=1时,移动后最高位的值发生变化。

OF=0 当cnt=1时,移动时最高位的值未发生变化。

SF、ZF、PF根据移动后的结果设置。

32、算术右移SAR (shift arithmetic right)

指令的汇编格式:SAR dst,cnt

指令的基本功能:SAR指令向右逐位移动cnt次,每次逐位移动后,最高位用符号位来补充,最低位移入CF。

指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移位次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL 寄存器中。

指令对标志位的影响:CF=移入的数值

OF=1 当cnt=1时,移动后最高位的值发生变化。

OF=0 当cnt=1时,移动时最高位的值未发生变化。

SF、ZF、PF根据移动后的结果设置。

33、循环左移ROL (rotate left)

指令的汇编格式:ROL dst,cnt

指令的基本功能:ROL 对由dst指定的寄存器或存储器操作数左移循环移动cnt 所指定的次数,每左移一次,把最高位同时移入CF和操作数最低位。

指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移动次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL 寄存器中。

指令对标志位的影响:CF=移入的数值

OF=1 当cnt=1时,移动后最高位的值发生变化。

OF=0 当cnt=1时,移动时最高位的值未发生变化。

SF、ZF、PF根据移动后的结果设置。

34、循环右移ROR (rotate right)

指令的汇编格式:ROR dst,cnt

指令的基本功能:ROR 对由dst指定的寄存器或存储器操作数右移循环移动cnt 所指定的次数,每右移一次,把最低位同时移入CF和操作数最高位。

指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移动次数(或位数)cnt=1时,1可以直接写在指令中,cnt>1时,cnt必须放入CL 寄存器中。

指令对标志位的影响:CF=移入的数值

OF=0 当cnt=1时,移动时最高位的值未发生变化。

SF、ZF、PF根据移动后的结果设置。

35、带进位的循环左移 RCL (rotate left through carry)

指令的汇编格式:RCL dst,cnt

指令的基本功能:RCL 对由dst指定的寄存器或存储器操作数,连同进位标志CF左循环移动,m所指定的次数,每左移一次,把操作数的最高位移入CF,而CF中原有内容移入操作数的最低位。

指定支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移动次数(或位数)cnt=1时,1可以直接写在指令中,cnt〉1时,cnt必须放入CL 寄存器中。

指令对标志位的影响:CF=移入的数值。

OF=1 当cnt=1时,移动后最高位的值未发生变化。

OF=0 当cnt=1时,移动后最高位的值发生变化。

SF、ZF、PF标志位不受影响。

36、带进位的循环右移RCR (rotate right through carry)

指令的汇编格式:RCR dst,cnt

指令的基本功能:RCR 对由dst指定的寄存器或存储器操作数,连同进位标志CF右循环移动,m所指定的次数,每右移一次,把操作数的最高低位移入CF,而CF中原有内容移入操作数的最高位。

指令支持的寻址方式:目的操作数dst可以是除立即数外的任何寻址方式。移动次数(或位数)cnt=1时,1可以直接写入指令中,cnt〉1时,cnt必须放入CL 寄存器中。

指令对标志位的影响:CF=移入的数值。

OF=1 当cnt=1时,操作数最高位的值未发生变化。

OF=0 当cnt=1时,操作数最高位的值发生变化。

SF、ZF、PF标志位不受影响。

【串处理指令】

一、设置方向标志指令

37、DF置零CLD (clear direction flag)

DF置一 STD (set direction flag)

指令的汇编格式:CLD

STD

指令的基本功能:CLD DF=0

STD DF=1

二、串处理指令

38、串传送MOVSB / MOVSW (move string byte/word)

指令的汇编格式:MOVSB

MOVSW

指令的基本功能:(ES:DI)<-(DS:SI)

(DI)<-(DI)+/-1(字节)或+/-2(字)

指令对条件码的影响:不影响条件码。

指令的特殊要求:源串必须在数据段中,目的串必须在附加段中,串处理指令隐含的寻址方式是SI和DI寄存器的间接寻址方式。源串允许使用段跨越前缀来指定段。

39、存串STOSB / STOSW (stroe from string byte/word)

指令的汇编格式:STOSB

STOSW

指令的基本功能:(ES:DI)<-(AL)或(AX)

(DI)<-(DI)+/-1(字节)或+/-2(字)

指令对条件码的影响:不影响条件码。

指令的特殊要求:源串必须在数据段中,目的串必须在附加段中,串处理指令隐含的寻址方式是SI和DI寄存器的间接寻址方式。源串允许使用段跨越前缀来指定段。

40、取串LODSB / LODSW (load from string byte/word)

指令的汇编格式:LODSB

LODSW

指令的基本功能:(AL)或(AX)<-(DS:SI)

(SI)<-(SI)+/-1(字节)或+/-2(字)

指令对条件码的影响:不影响条件码。

指令的特殊要求:源串必须在数据段中,目的串必须在附加段中,串处理指令隐含的寻址方式是SI和DI寄存器的间接寻址方式。源串允许使用段跨越前缀来指定段。

41、串比较CMPSB / CMPSW (compare string byte/word)

指令的汇编格式:CMPSB

CMPSW

指令的基本功能:(DS:SI)-(ES:DI) 根据比较结果设置条件码

(SI)<-(SI)+/-1(字节)或+/-2(字)

(DI)<-(DI)+/-1(字节)或+/-2(字)

指令对条件码的影响:SF=1 减法结果为负数(符号位为1)

SF=0 减法结果为正数(符号位为0)

ZF=1 减法结果为零

ZF=0 减法结果不为零

CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

42、串扫描SCASB / SCASW (scan string byte / word)

指令的格式:SCASB

SCASW

指令的基本功能:(AL)<-(ES:DI)或(AX)<-(ES:DI) 根据扫描比较的结果设置条件码。

指令对条件码的影响:SF=1 结果为负数(符号位为1)

SF=0 结果为正数(符号位为0)

ZF=1 结果为零

ZF=0 结果不为零

CF=1 二进制减法运算中最高有效位向高位有借位(被减数小于减数,不够减的情况)

CF=0 二进制减法运算中最高有效为向高位无借位(被减数〉=减数,够减的情况)OF=1 两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同。OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。

三、串重复前缀

43、重复执行串REP

指令的汇编格式:REP (CX)=重复次数

指令的基本功能:① (CX)=0时,串指令执行完毕,否则执行② ~ ④

② (CX)←(CX)-1③ 执行串指令(MOVS或STOS)④ 重复执行①

44、相等/为零时重复执行串指令 REPE/REPZ

指令的汇编格式:REPE / REPZ (CX)=比较/扫描的次数

指令的基本功能:① (CX)=0或ZF=0时,结束执行串指令,否则继续② ~ ④

② (CX)←(CX)-1③ 执行串指令(CMPS或SCAS)④ 重复执行①

45、不等/不为零时重复执行串指令 REPNE / PEPNZ

指令的汇编格式:REPNE / PEPNZ (CX)=比较/扫描的次数

指令的基本功能:① (CX)=0或ZF=1,结束执行串指令,否则继续② ~ ④

② (CX)←(CX)-1③ 执行串指令(CMPS或SCAS)④ 重复执行①

【控制转移指令】

一、无条件转移指令

46、短转移JMP SHORT label (short jump)

指令的汇编格式:JMP SHORT label

指令的基本功能:(IP)<-当前(IP)+8位位移量 8位位移量是汇编程序在汇编源程序时,根据目标地址和当前IP之间的距离自动生成的。

指令对条件码的影响:对标志位无影响。

47、近转移 JMP NEAR PTR label (near jump)

指令的汇编格式:直接转移 JMP label (direct jump)

寄存器间接转移 JMP reg (register indirect jump)

存储器间接转移 JMP WORD PTR OPR (memory indirect jump)

指令的基本功能:JMP label (IP) <- OFFSET label = (IP)当前+16位位移量JMP reg (IP) <- (reg)

JMP WORD PTR OPR (IP) <- (PA+1,PA)

指令支持的寻址方式:指令中的转向地址可以是直接寻址方式、寄存器寻址方式、寄存器间接寻址方式和存储器寻址方式。

指令对条件码的影响:对标志位无影响。

48、远转移JMP FAR PTR label (for jump)

指令的汇编格式:JMP FAR PTR label

指令的基本功能:(IP)<-label的段内偏移地址 (CS)<-label所在段的段地址指令支持的寻址方式:远转移的目的地址可以使用除立即寻址方式外的任何寻址方式来表示。指令对条件码的影响:对标志位无影响。

二、条件转移指令

指令的汇编格式及功能

根据条件码的值转移:

49、JZ(JE) OPR ZF=1 ZF=0(运算结果为0,ZF 就置1)

50、JNZ(JNE) OPR ZF=0

51、JS OPR SF=1 SF=0(二进制最高位是什么,SF就是什么,如最高位为1则SF=1)

52、JNS OPR SF=0

53、JO OPR OF=1 OF=1 (两个负数相加变成正数,溢出)

54、JNO OPR OF=0

55、JP OPR PF=1 PF=0 (反映结果“1”的个数,奇数?0 偶数个?1)

56、JNP OPR PF=0

57、JC OPR CF=1 CF=1(最高位有进位或借位就置1)

58、JNC OPR CF=0

比较两个无符号数,根据比较的结果转移

59、JB(JNAE,JC) OPR CF=1 被减数小于减数则转移

60、JNB(JAE,JNC) OPR CF=0 被减数大于或等于减数则转移

61、JBE(JNA) OPR CF或ZF=1 被减数小于或等于减数则转移

62、JNBE(JA) OPR CF或ZF=0 被减数大于减数则转移

比较两个带符号数,根据比较结果转移

63、JL/JNGE OPR SF异或OF=1 被减数小于减数则转移

64、JNL/JGE SF异或OF=0 被减数不小于减数则转移

65、JLE/JNE (SF异或OF)与ZF=1 被减数不大于减数则转移

66、JNLE/JG (SF异或OF)与ZF=0 被减数大于减数则转移

根据CX寄存器的值转移

67、JCXZ (CX)=0 CX内容为零则转移

指令的特殊要求:所有条件转移指令都是短转移指令,转移的目标地址必须在当前IP地址的-128至+127字节范围之内,因此条件转移指令是2字节指令。

三、循环指令

68、循环 LOOP (loop)

指令的汇编格式:LOOP label

指令的基本功能:① (CX)←(CX)-1 ② 若(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。

指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围

之内。

69、为零/相等时循环LOOPZ/LOOPE (loop while nonzero or equal)

指令的汇编格式:LOOPNZ/LOOPNE label

指令的基本功能:① (CX)←(CX)-1

② 若ZF=1且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。

指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8

位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。

70、不为零/不相等时循环LOOPNZ/LOOPNE(loop while nonzero or not equal) 指令的汇编格式:LOOPNZ/LOOPNE label

指令的基本功能:① (CX)←(CX)-1

② 若ZF=0且(CX)≠0,则(IP)←(IP)当前+位移量,否则循环结束。

指令的特殊要求:循环指令都是短转移格式的指令,也就是说,位移量是用8

位带符号数来表示的,转向地址在相对于当前IP值的-128 ~ +127字节范围之内。

四、子程序调用

71、段内直接近调用 CALL SUBROUT

指令的基本功能:(SP)<-(SP)-2

((SP)+1,(sp))<-(IP)

(IP)<-(IP)+16位位移量

段内间接近调用 CALL DESTIN

指令的基本功能:(SP)<-(SP)-2

((SP)+1,(SP))<-(IP)

(IP)<-(EA)

72、段间直接调用 CALL FAR PTR SUBROUT

指令的基本功能:(SP)<-(SP)-2,((SP))<-(CS)当前

(SP)<-(SP)-2,((SP))<-(IP)当前

(IP)<-偏移地址(在指令的第2、3个字节)

(CS)<-段地址(在指令的第4、5个字节)

五、返回指令

73、段内返回(近返回) RET

指令的基本功能:(IP)<-((SP)+1,(SP))

(SP)<-(SP)+2

段间返回(远返回) RET

指令的基本功能:(IP)<-((SP)),(SP)<-(SP)+2

(CS)<-((SP)),(SP)<-(SP)+2

带立即数返回 RET N

执行操作:① 返回地址出栈(操作同段内或段间返回)

② 修改堆栈指针:(SP) ← (SP)+N

六、中断及中断返回指令

74、INT n 中断指令(interrupt),n为中断类型号

执行操作:① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)

② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)

(SP) ← (SP)-2,((SP)) ← (IP)

③ 转中断处理程序:(IP) ← (n×4)

(CS) ← (n×4+2)

75、IRET 中断返回指令(return from interrupt)

执行操作:① 返回地址出栈:(IP) ← ((SP)),(SP) ← (SP)+2

(CS) ← ((SP)),(SP) ← (SP)+2

② FLAGS出栈:(FLAGS) ← ((SP)),(SP) ← (SP)+2

76、INTO 溢出则中断(中断类型为4)

执行操作:若OF=1(有溢出),则:

① 入栈保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS)

② 入栈保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS)

(SP) ← (SP)-2,((SP)) ← (IP)

③ 转中断处理程序:(IP) ← (4×4)= (10H)

(CS) ← (4×4+2)= (12H

HELLO,WORLD进阶汇编程序系列

Editor:admin Time:2004-3-21 12:49 Read:9785 Score:8 Print

Writer:LLUCT

Excerpt:80x86汇编小站

Preface:

感谢网友lluct为本站提供原创......适合初学者学习哦

Content:

TITLE ***HELLO,WORLD进阶程序之选择分支BY LLUCT***

DATA SEGMENT ;定义数据段

MSG1 DB '***WELCOME TO MY PROGRAM BY LLUCT***','$'

;定义输出的第一个字符串信息,字符串必须用DB定义,$为结束标志

MSG2 DB '1:BASIC MESSAGE 2:ADVANCED MESSAGE','$'

;定义输出的字符串信息:选择菜单

MSG3 DB 'PLEASE CHOOSE:','$'

;定义输出的字符串信息:选择前缀

MSG4 DB 'HELLO,WORLD!^-^','$'

;定义输出的字符串信息:分支1的信息

MSG5 DB 'THIS IS MY FIRST ASM_86 PROGRAM! @^-^@','$'

;定义输出的字符串信息:分支2的信息

ERRMSG DB 'CHOOSE ERROR! -_-b','$'

;定义输出的字符串信息:选择错误信息

DATA ENDS ;数据段结尾

CODE SEGMENT ;定义代码段

ASSUME CS:CODE ;规定CS的内容

ASSUME DS:DATA ;规定DS的内容

START: MOV AX,DATA ;程序从START开始

MOV DS,AX ;DS置初值,DATA的段地址

CALL ENTER ;调用显示回车换行子程序

LEA DX,MSG1 ;输出第一个字符串的偏移地址

CALL DISPCHS ;调用显示字符串子程序

CALL ENTER ;调用显示回车换行子程序

CALL ENTER ;这个...同上啊^-^

LEA DX,MSG2 ;输出第二个字符串的偏移地址

CALL DISPCHS ;调用显示字符串子程序

AGAIN: CALL ENTER ;定义AGAIN标号.用于选择错误循环

LEA DX,MSG3 ;输出第三个字符串的偏移地址

CALL DISPCHS ;调用显示字符串子程序

MOV AH,01H ;调用1号功能:从键盘输入一个字符并回显

INT 21H ;完成输入回显

CMP AL,'1' ;输入的字符和1相比较

JE BASICP ;如果相等,转移到BASICP标号(JE=Jump if Equal)

CMP AL,'2' ;输入的字符和2相比较||

JE ADVANP ;如果相等,转移到ADVANP标号(JE=如果相等就转移)

JMP ERROR ;否则就无条件转移到ERROR标号

EXIT: MOV AH,4CH ;4C号功能调用:终止当前程序并返回调用程序INT 21H ;返回DOS

BASICP: CALL ENTER ;什么,还要解释啊.晕-_-!!!

LEA DX,MSG4 ;输出第三个字符串的偏移地址

CALL DISPCHS ;调用显示字符串子程序

CALL ENTER ;..........

JMP EXIT ;无条件转移到EXIT标号

ADVANP: CALL ENTER ;55555555

LEA DX,MSG5 ;解释了四次,应该懂了吧

CALL DISPCHS ;调用显示字符串子程序

CALL ENTER ;再问就死给你看

JMP EXIT ;无条件转移到EXIT标号

ERROR: CALL ENTER

LEA DX,ERRMSG ;输出选择错误信息

CALL DISPCHS ;调用显示字符串子程序

MOV DL,07H ;输出ASCII码的报警(响铃)控制符BEL(07H)

CALL DISPCH ;调用显示单个字符子程序

CALL ENTER

JMP AGAIN

DISPCH PROC NEAR

;显示单个字符子程序,NEAR说明子程序和主程序在同一个代码段中(现无主程序调用) MOV AH,02H ;2号功能调用:显示器输出字符

INT 21H ;完成输出显示

RET ;返回

DISPCH ENDP ;子程序结尾

ENTER PROC NEAR ;显示回车换行子程序

MOV DL,0DH ;输出ASCII码的回车控制符CR(0DH)

CALL DISPCH ;调用显示单个字符子程序

MOV DL,0AH ;输出ASCII码的换行控制符LF(0AH)

CALL DISPCH ;调用显示单个字符子程序

RET ;返回

ENTER ENDP ;子程序结尾

DISPCHS PROC NEAR

;显示字符串子程序,NEAR说明子程序和主程序在同一个代码段中(现无主程序调用) MOV AH,09H ;9号功能调用:显示字符串

INT 21H ;完成输出显示

RET

DISPCHS ENDP

CODE ENDS ;代码段结尾

END START ;结束汇编

;把以上代码复制到记事本等文本程序中,并保存.(如helloch.asm)

;编译:masm helloch.asm

;连接:link helloch.obj

;执行:helloch.exe

======================================================

title ***hello,world进阶之字符串输入输出by lluct***

data segment ;定义数据段

input db 100 dup(?)

;定义输入的字符串,字符串必须用db定义,长度为100个字节

msg1 db 'Hello,','$'

;定义输出的前缀字符串信息,字符串必须用db定义,$为结束标志(24h)

msg2 db ',Welcome to here!','$'

;定义输出的后缀字符串信息

headmsg db 'PLEASE INPUT YOUR NAME:','$'

;开始显示的字符串信息

data ends ;数据段结尾

code segment ;定义代码段

assume cs:code ;规定cs的内容

assume ds:data ;规定ds的内容

start: mov ax,data ;程序从start开始

mov ds,ax ;ds置初值,data的段地址

mov si,0 ;变址寄存器置初值0

call enter ;调用显示回车换行子程序

lea dx,headmsg ;输出开始显示的字符串的偏移地址

call dispchs ;调用显示字符串子程序

repeat: mov ah,01h

;定义repeat标号,用于循环输入单个字符.调用1号功能:从键盘输入一个字符并回显int 21h ;完成输入回显

cmp al,0dh ;输入的字符和CR(回车)比较

je exit ;如果等于回车就转移到exit

mov input[si],al ;把al的值传送到input的si地址中(好像是这样吧)

inc si ;si加1

jmp repeat ;无条件转移到repeat

exit: call enter

mov input[si],24h ;给输入完成的字符串加上结束标志($)

call enter

lea dx,msg1 ;输出前缀字符串的偏移地址

call dispchs ;调用显示字符串子程序

lea dx,input ;输出刚才输入的字符串

call dispchs

lea dx,msg2

call dispchs

call enter

mov ah,4ch ;4c号功能调用:终止当前程序并返回调用程序

int 21h ;返回dos

enter proc near ;显示回车换行子程序

mov dl,0dh ;输出ascii码的回车控制符cr(0dh)

call dispch

mov dl,0ah ;输出ascii码的换行控制符lf(0ah)

call dispch

ret ;返回

enter endp ;子程序结束

dispch proc near

mov ah,02h ;2号功能调用:显示器输出字符

int 21h ;完成输出显示

ret ;返回

dispch endp

dispchs proc near

mov ah,09h ;9号功能调用:显示字符串

int 21h ;完成输出显示

ret ;返回

dispchs endp

code ends ;代码段结尾

end start ;结束汇编

;把以上代码复制到记事本等文本程序中,并保存.(如heinout.c)

;编译:masm heinout.asm

;连接:link heinout.obj

;执行:heinout.exe

中断是指CPU对系统发生的某个事件作出的一种反应:CPU暂停正在执行的程序,保留现场后自动转去执行相应的处理程序,处理完该事件后再返回断点继续执行被"打断"的程序在我们所用的电脑中,所有的硬件都需要执行中断请求的动作,简单说它的作用就是用来停止其相关硬件的工作状态。我们可以举一个日常生活中的例子来说明,假如你正在给朋友写信,电话铃响了,这时你放下手中的笔去接电话,通话完毕再继续写信。这个例子就表现了中断及其处理的过程:电话铃声使你暂时中止当前的工作,而去处理更为急需处理的事情

——接电话,当把急需处理的事情处理完毕之后,再回过头来继续原来的事情。在这个例子中,电话铃声就可以称为―中断请求‖,而你暂停写信去接电话就叫作―中断响应‖,那么接电话的过程就是―中断处理‖。由此我们可以看出,在计算机执行程序的过程中,由于出现某个特殊情况(或称为―事件‖),使得系统暂时中止现行程序,而转去执行处理这一特殊事件的程序,处理完毕之后再回到原来程序的中断点继续向下执行,而这个过程就被称为中断。

中断的作用

我们可以再举一个例子来说明中断的作用。假设有一个朋友来拜访你,但是由于不知何时到达,你只能在门口等待,于是什么事情也干不了;但如果在门口装一个门铃,你就不必在门口等待而可以在家里去做其他的工作,朋友来了按门铃通知你,这时你才中断手中的工作去开门,这就避免了不必要的等待。而计算机也一样,例如打印文稿的操作。因为cpu传送数据的速度高,而打印机速度较慢,如果不采用中断技术,cpu将经常处于等待状态,这会使得电脑的工作效率极低。而采用了中断方式后,cpu就可以在打印的同时进行其他的工作,而只在打印机缓冲区内的当前内容打印完毕,而发出中断请求之后才予以响应,这时才暂时中断当前的工作转去执行停止打印的操作,之后再返回执行原来的程序。这样就大大地提高了计算机系统的效率。

irq中断

计算机中的中断有好几种,根据中断信号产生的来源可以分为:硬件中断和软件中断。硬件中断多由外围设备和计算机系统控制器发出,软件中断一般由软件命令产生。在硬件中断中又有―可屏蔽中断‖和―不可屏蔽中断‖之分。顾名思义,可屏蔽中断可以由计算机根据系统的需要来决定是否进行接收处理或是延后处理(即屏蔽),而不可屏蔽中断便是直接激活相应的中断处理程序,它不能也不会被延误。而irq中断就是可屏蔽的硬件中断,它的全称为interrupt request 即―中断请求‖。

在电脑的系统中,是由一个中断控制器8259或是8259a的芯片(现在此芯片大都集成到其他的芯片内)来对系统中每个硬件的中断进行控制。目前共有16组irq,去掉其中用来作桥接的一组irq,实际上只有15组irq可供硬件调用。而这些irq都有自己建议的配置。

分配irq中断

我们日常所用的操作系统对于irq的设置也不尽相同,所以在安装新硬件的时候,系统往往并不能自动检测正确的irq来分配给所需调用的硬件,这就会造成此硬件设备或是原来的旧硬件出现不能正常工作的现象。其实这是系统自动将该硬件的irq分配给了其他与此irq相同的硬件上,从而发生冲突使硬件不能正常工作。一般如果遇到这种情况,只要将新旧两个硬件的irq配置手动调开就可以解决了。

对于一些常用的硬件一般都有其默认的irq数值。比如声卡常常使用irq5或7。虽然这些配件使用其他的irq值大多数也能工作,但假如碰到特别“挑剔”的软件或游戏等程序,例如只能识别irq值为5或7的声卡,那么如果将它设成irq9

就白费心机了。

8.3.1 中断的基本概念

中断(Interrupt)是指计算机在实行期间,系统内发生非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行响应的事件处理程序。待处理完毕后又返回原来中断处继续执行或调度新的程序执行的过程。

现代计算机系统一般都具有处理突发事件的能力。例如:从磁带上读入一组信息,当发现读入信息有错误时,只要让磁带退回重读该组信息就可能克服错误,而得到正确的信息。

这种处理突发事件的能力是由硬件和软件协作完成的。首先由硬件的中断装置发现产生的事件,然后,中断装置中止现行程序的执行,引出处理该事件的程序来处理。计算机系统不仅可以处理由于硬件或软件错误而产生的事件,而且可以处理某种预定处理伪事件。例如:外围设备工作结束时,也发出中断请求,向系统报告它已完成任务,系统根据具体情况作出相应处理。引起中断的事件称为中断源。发现中断源并产生中断的硬件称中断装置。在不同的硬件结构中,通常有不同的中断源和平不同的中断装置,但它们有一个共性,即:当中断事件发生后,中断装置能改变处理器内操作执行的顺序。

中断源:引起中断发生的事件被称为中断源。

中断请求:中断源向CPU发出的请求中断处理信号。

中断响应:CPU收到中断请求后转相应的事件处理程序。

禁止中断(关中断):CPU内部的处理机状态字PSW的中断允许位已被清除,不允许CPU响应中断。

开中断:PSW的中断允许位的设置。

中断屏蔽:在中断请求产生之后,系统用软件方式有选择地封锁部分中断而允许蓁部分的中断仍能得到响应。

8.3.4 中断处理过程

中断处理过程:

(1) CPU检查响应中断的条件是否满足。CPU响应中断的条件是:有来自于中断源的中断请求、CPU允许中断。如果中断响应条件不满足,则中断处理无法进行。

(2) 如果CPU响应中断,则CPU关中断,使其进入不可再次响应中断的状态。

(3) 保存被中断进程现场。为了在中断处理结束后能使进程正确地返回到中断点,系统必须保存当前处理机状态字PSW和程序计数器PC等的值。这些值一般保存在特定堆栈或硬件寄存器中。

(4) 分析中断原因,调用中断处理子程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。

(5) 执行中断处理子程序。对陷阱来说,在有些系统中则是通过陷阱指令向当前执行进程发软中断信号后调用对应的处理子程序执行。

(6) 退出中断,恢复被中断进程的现场或调度新进程占据处理机。

(7) 开中断,CPU继续执行。

1.什么叫中断?

简单来说,中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作。这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因。

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

汇编语言调试DEBUG命令详解

汇编语言调试DEBUG命令详解 1、显示命令D ① D [地址] ② D [范围] 如不指定范围,一次显示8行×16个字节。 -D ;默认段寄存器为DS,当前偏移地址 -D DS:100 / -D CS:200 -D 200:100 -D 200;200为偏移地址,默认段寄存器DS -D DS:100 110/ -D 100 L 10 2.修改命令E ① E 地址;从指定地址开始,修改(或连续修改)存储单元内容。DEBUG首先显示指定单元内容,如要修改,可输入新数据;空格键显示下一个单元内容并可修改,减号键显示上一个单元内容并可修改;如不修改,可直接按空格键或减号键;回车键结束命令。 ② E 地址数据表;从指定的地址开始用数据表给定的数据修改存储单元。 -E DS:100 F3 ‘AB’ 8D。 3.添充命令F F 范围数据表; 将数据表写入指定范围的存储单元;数据个数多,忽略多出的数据,个数少,则重复使用数据表。 -F DS:0 L5 01,02,03,04,05 -F DS:0 L5 01 02 03 04 05(空格分隔) -F DS:0 L5 FF ;5个字节重复使用FF 4.显示修改寄存器命令R R;★显示所有寄存器和标志位状态; ★显示当前CS:IP指向的指令。 显示标志时使用的符号: 标志标志=1 标志=0 OF OV NV DF DN UP IF EI DI SF NG PL ZF ZR NZ AF AC NA PF PE PO CF CY NC

5.汇编命令A A [地址];从指定的地址开始输入符号指令;如省略地址,则接着上一个A命令的最后一个单元开始;若第一次使用A命令省略地址,则从当前CS:IP 开始(通常是CS:100)。 注释:①在DEBUG下编写简单程序即使用A命令。 ②每条指令后要按回车。 ③不输入指令按回车,或按Ctrl+C结束汇编。 ④支持所有8086符号硬指令,伪指令只支持DB、DW,不支持各类符号名。 6.反汇编命令U ① U [地址];从指定地址开始反汇编32个字节的机器指令;省略地址时,则接着上一个U命令的最后一个单元开始;若第一次使用U命令省略地址,则从当前CS:IP开始(通常是CS:100)。 ② U 范围;对指定范围的单元进行反汇编。 -U -U100 -U100L10 7.运行程序命令G ① G;从CS:IP指向的指令开始执行程序,直到程序结束或遇到INT 3。 ② G=地址;从指定地址开始执行程序,直到程序结束或遇到INT 3。 ③ G 断点1[,断点2,…断点10];从CS:IP指向的指令开始执行程序,直到遇到断点。 ④G=地址断点1[,断点2,…断点10] -G ;从CS:IP指向的指令开始执行程序。 -G=100 ;从指定地址开始执行程序。 -G=100 105 110 120 8.跟踪命令(单步执行命令)T ① T;从当前IP开始执行一条指令。 ② T 数值;从当前IP开始执行多条指令。 ② T =地址; ③ T =地址数值; -T -T5 / -T=100 5 9.跟踪执行并跳过子程序命令P P [=地址] [数值];类似T命令,但跳过子程序和中断服务程序。 10.退出DEBUG命令Q Q;返回DOS环境。 -Q 11.命名命令N N 文件标示符;指定文件,以便用W命令在磁盘上生成该文件,或者用L命令从磁盘装入该文件。 -N MY_https://www.wendangku.net/doc/f88855011.html,

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

汇编语言指令表

汇编语言指令表文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

伪指令 1、定位伪指令 ORG m 2、定义字节伪指令 DB X1,X2,X3,…,Xn 3、字定义伪指令 DW Y1,Y2,Y3,…,Yn 4、汇编结束伪指令 END 寻址方式 MCS-51单片机有五种寻址方式: 1、寄存器寻址 2、寄存器间接寻址 3、直接寻址 4、立即数寻址 5、基寄存器加变址寄存器间接寻址 6、相对寻址 7、位寻址 数据传送指令 一、以累加器A为目的操作数的指令(4条) MOV A,Rn ;(Rn)→A n=0~7 MOV A,direct ;( direct )→A MOV A,@Ri ;((Ri))→A i=0~1 MOV A,#data ; data →A 二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)→ Rn MOV Rn ,direct;( direct )→ Rn MOV Rn ,#data; data → Rn 三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)→direct MOV direct,Rn;(Rn)→direct MOV direct,direct ;(源direct)→目的direct MOV direct,@Ri;((Ri))→direct MOV direct,#data; data→direct 四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)→(Ri) MOV @Ri,direct;(direct)→(Ri) MOV @Ri,#data; data→(Ri) 五、十六位数据传送指令(1条) MOV DPTR,#data16;dataH→DPH,dataL →DPL

微机原理与接口技术汇编语言指令详解吐血版

第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过 程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及 有效地址的计算。 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码 操作数 …… 操作数 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。 例如:MOV AX ,3000H

立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄

《汇编语言》习题及解答

第1章基础知识 检测点(第9页) (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为13位。 (2)1KB的存储器有1024个存储单元,存储单元的编号从0到1023。 (3)1KB的存储器可以存储8192(2^13)个bit,1024个Byte。 ~ (4)1GB是24(2^30)个Byte、1MB是1048576(2^20)个Byte、1KB是1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64(KB)、1(MB)、16(MB)、4(GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1(B)、1(B)、2(B)、2(B)、4(B)。 (7)从内存中读取1024字节的数据,8086至少要读512次,80386至少要读256次。 (8)在存储器中,数据和程序以二进制形式存放。 解题过程: ' (1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=24B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。 (5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。

汇编语言指令汇总

汇编语言程序设计资料简汇 通用寄存器 8位通用寄存器8个:AL、AH、BL、BH、CL、CH、DL、DH。 16位通用寄存器8个:AX、BX、CX、DX、SI、DI、BP、SP。 AL与AH、BL与BH、CL与CH、DL与DH分别对应于AX、BX、CX和DX的低8位与高8位。专用寄存器 指令指针:IP(16位)。 标志寄存器:没有助记符(FLAGS 16位)。 段寄存器 段寄存器:CS、DS、ES、SS。 内存分段:80x86采用分段内存管理机制,主要包括下列几种类型的段: ?代码段:用来存放程序的指令序列。 ?数据段:用来存放程序的数据。 ?堆栈段:作为堆栈使用的内存区域,用来存放过程返回地址、过程参数等。 物理地址与逻辑地址 ?物理地址:内存单元的实际地址,也就是出现在地址总线上的地址。 ?逻辑地址:或称分段地址。 ?段地址与偏移地址都是16位。 ?系统采用下列方法将逻辑地址自动转换为20位的物理地址: 物理地址= 段地址×16 + 偏移地址 ?每个内存单元具有唯一的物理地址,但可由不同的逻辑地址描述。 与数据有关的寻址方式 立即寻址方式 立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位数或16位数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。 例:MOV AL,18 指令执行后,(AL)= 12H 寄存器寻址方式 在寄存器寻址方式中,操作数包含于CPU的内部寄存器之中。这种寻址方式大都用于寄存器之间的数据传输。 例3:MOV AX,BX 如指令执行前(AX)= 6789H,(BX)= 0000H;则指令执行后,(AX)= 0000H,(BX)保持不变。 直接寻址方式 直接寻址方式是操作数地址的16位偏移量直接包含在指令中,和指令操作码一起放在代码段,而操作数则在数据段中。操作数的地址是数据段寄存器DS中的内容左移4位后,加上指令给定的16位地址偏移量。直接寻址方式适合于处理单个数据变量。 寄存器间接寻址方式 在寄存器间接寻址方式中,操作数在存储器中。操作数的有效地址由变址寄存器SI、DI或基址寄存器BX、BP提供。 如果指令中指定的寄存器是BX、SI、DI,则用DS寄存器的内容作为段地址。 如指令中用BP寄存器,则操作数的段地址在SS中,即堆栈段。

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

汇编语言期末考试试题及复习资料

汇编语言模拟试题及答案 一,单项选择题(在每小题的四个备选答案中,选出一个正确的答案,并将其号码填在题干后的括号内,每小题1分,共20分) 1.指令JMP FAR PTR DONE属于参考答案为:C A.段内转移直接寻址 B.段内转移间接寻址 C.段间转移直接寻址 D.段间转移间接寻址 [解析]略 2.下列叙述正确的是参考答案为:C A.对两个无符号数进行比较采用CMP指令,对两个有符号数比较用CMPS指令 B.对两个无符号数进行比较采用CMPS指令,对两个有符号数比较用CMP指令 C.对无符号数条件转移采用JAE/JNB指令,对有符号数条件转移用JGE/JNL 指令 D.对无符号数条件转移采用JGE/JNL指令,对有符号数条件转移用JAE/JNB 指令 [解析]对于无符号数和有符号数的比较都采用CMP指令; CMPS指令是串比较指令; 对两个无符号数的条件转移指令应是:JAE、JNB、JBE、JNA; 对两个有符号数的条件转移指令应是:JGE、JNL、JLE、JNG。 3.一个有128个字的数据区,它的起始地址为12ABH:00ABH,请给出这个数据区最末一个字单元的物理地址是参考答案为:C A.12CSBH B.12B6BH C.12C59H D.12BFEH [解析]末字与首字相隔(128-1=)127个字,且每个字占用2个字节,因此末字单元的物理地址应为: 首字单元的物理地址+(128-1)×2 即 12ABH×10H+00ABH+(128-1)×2=12C59H。 4.在下列指令的表示中,不正确的是参考答案为:C A.MOV AL,[BX+SI] B.JMP SHORT DONI C.DEC [BX] D.MUL CL [解析]当只有一个存储器操作数时,这个操作数的类型不明确,例如选项C中的[BX],没有明确的说明访问该存储单元的类型,此时存储器操作数就必须需用类型说明,如 DEC BYTE PTR [BX] 或 DEC WORD PTR [BX] 但是在题目的选项C中,没有指出存储器操作数类型,所以该指令是不正确的;而其它选项中的指令均是正确的。

汇编指令大全

ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令 L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少) INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用 S001C: RRC A ;累加器A的内容带进位位右移(设A=11H,C=0 ;单步执行后查A和C内容为多少) DEC A ;A的内容减1 DEC 01H ;直接地址(01H)内容减1 DEC @R0 ;R0间址减1,即R0的内容为地址,该地址的内容减1 DEC @R1 ; R1间址减1 DEC R0 ; R0内容减1 DEC R1 ; R1内容减1 DEC R2 ; R2内容减1 DEC R3 ; R3内容减1 DEC R4 ; R4内容减1 DEC R5 ; R5内容减1 DEC R6 ; R6内容减1 DEC R7 ; R7内容减1 JB 20H,L002D;如果位(20H,即24H的0位)为1则转移 L002D: AJMP L0017 ;绝对转移 RET ;子程序返回指令 RL A ;A左移 ADD A,#01H ;A的内容与立即数(01H)相加 ADD A,01H ; A的内容与直接地址(01H内容)相加 ADD A,@R0 ; A的内容与寄存器R0的间址内容相加 ADD A,@R1 ; A的内容与寄存器R1的间址内容相加

汇编语言指令分类详解

3.1 8086/8088寻址方式 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在 操作码的后面,与操作码一起放在代码段区域中。 如图所示。 例如:MOV AX,3000H 立即数可以是8位的,也可以是16位的。若 是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如:MOV AX,DS:[2000H];

图2-2 (对DS来讲可以省略成MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以 分成两种情况: (1)以SI、DI、BX间接寻址,则 通常操作数在现行数据段区域 中,即数据段寄存器(DS)*16 加上SI、DI、BX中的16位偏移 量,为操作数的地址, 例如:MOV AX,[SI] 操作数地址是:(DS)*16+(SI) (2)以寄存器BP间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS)*16与BP的内容相加作为操作数的地址, 例如:MOV AX,[BP] 操作数地址是:(SS)*16+(BP)若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。 例如:MOV AX,DS:[BP] 操作数地址是:(DS)*16+(BP)5.变址寻址 由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。 XCHG交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。 LEA 16位寄存器存储器操作数传送有效地址指令:必须是一个16位寄存器和存储器操作数。 LDS 16位寄存器存储器操作数传送存储器操作数32位地址,它的16位偏移地址送16位寄存器,16位段基值送入DS中。 LES :同上,只是16位段基址送ES中。 堆栈操作指令 PUSH 操作数,操作数不能使用立即数, POP 操作数,操作数不能是CS和立即数 标志操作指令 LAHF:把标志寄存器低8位,符号SF,零ZF,辅助进位AF,奇偶PF,进位CF传送到AH 指定的位。不影响标志位。 SAHF:与上相反,把AH中的标志位传送回标志寄存器。 PUSHF:把标志寄存器内容压入栈顶。 POPF:把栈顶的一个字节传送到标志寄存器中。 CLC:进位位清零。 STC:进位位为1。 CMC:进位位取反。 CLD:使方向标志DF为零,在执行串操作中,使地址按递增方式变化。 STD:DF为1。 CLI:清中断允许标志IF。Cpu不相应来自外部装置的可屏蔽中断。 STI:IF为1。 加减运算指令

注意:对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。 ADD。 ADC:把进位CF中的数值加上去。 INC:加1指令 SUB。 SBB:把进位CF中数值减去。 DEC:减1指令。 NEG 操作数:取补指令,即用0减去操作数再送回操作数。 CMP:比较指令,完成操作数1减去操作数2,结果不送操作数1,但影响标志位。可根据ZF(零)是否被置1判断相等;如果两者是无符号数,可根据CF判断大小;如果两者是有符号数,要根据SF和OF判断大小。 乘除运算指令 MUL 操作数:无符号数乘法指令。操作数不能是立即数。操作数是字节与AL中的无符号数相乘,16位结果送AX中。若字节,则与AX乘,结果高16送DX,低16送AX。如乘积高半部分不为零,则CF、OF为1,否则为0。所以CF和OF表示AH或DX中含有结果的有效数。IMUL 操作数:有符号数乘法指令。基本与MUL相同。 DIV 操作数:被除数是在AX(除数8位)或者DX和AX(除数16位),操作数不能是立即数。如果除数是0,或者在8(16)位除数时商超过8(16)位,则认为是溢出,引起0号中断。IDIV:有符号除法指令,当除数为0,活着商太大,太小(字节超过127,-127字超过32767,-32767)时,引起0号中断。 符号扩展指令 CBW,CWD:把AL中的符号扩展到寄存器AH中,不影响各标志位。CWD则把AX中的符号扩展到DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用XOR 清高8位或高16位。 逻辑运算指令与位移指令 注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。 NOT:取反,不影响标志位。 AND 操作数1 操作数2:操作结果送错作数1,标志CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志) SF(符号)反映运算结果,AF(辅助进位)未定义。自己与自己AND值不变,她主要用于将操作数中与1相与的位保持不变,与0相与清0。(都为1时为1)OR 操作数1 操作数2:自己与自己OR值不变,CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志)SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置1:

汇编语言的各条指令

常用命令 数据传送指令 一通用数据传送指令 MOV指令为双操作数指令,两个操作数中不能全为内存操作数 格式:MOV DST,SRC 执行操作:dst = src 注:1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作。 格式:PUSH SRC //Word 执行操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) 注:1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器。

2.入栈时高位字节先入栈,低位字节后入栈。 格式:POP DST //Word 执行操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 注:1.出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器。 2.执行POP SS指令后,堆栈区在存储区的位置要改变。 3.执行POP SP 指令后,栈顶的位置要改变。 XCHG(eXCHanG)交换指令: 将两操作数值交换。 格式:XCHG OPR1,OPR2 //Byte/Word 执行的操作:(OPR1)<-->(OPR2) 注:1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 存储器与存储器之间不能交换数据。 二累加器专用传送指令 IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节)

8088汇编语言指令

8088指令系统总结 预备知识:符号含意、数据传送原则 符号含意 符号含意 opr 操作数 src 源操作数 dst 目的操作数 mem 存储器 im 立即数 seg 段寄存器 reg 通用寄存器 EA 偏移地址 PA 物理地址 nn直接地址DISP8:8位偏移地址DISP16:16位偏移地址 数据传送原则 口诀数据传送原则 寄段储间互传数,seg、reg、mem之间的数据可以相互传送。 立即只入寄和储。im可入reg、mem 只有寄间互换数,reg之间的数据可以传送。Mem间、seg间不可自传CS立即不可目,CS和立即数不可入,不能当目的操作数 8088指令系统 8088指令系统分六大类 一、数据传送指令 二、算术运算指令 三、逻辑运算与位移指令 四、串操作指令 五、控制与转移指令 六、CPU控制指令 一、数据传送指令 1.通用传送指令 (1)传送指令MOV dst, src功能:dst←src (2)堆栈操作指令人W PUSH src作用:SP←SP-2 ((SP+1)+SP)←src src(reg seg mem) POP dst 作用:dst←((SP+1)+SP)SP←SP-2 dst(reg seg mem)

(3)交换指令XCHG OPR1,OPR2 OPR1←→OPR2 2.累加器传送指令 (1)输入输出指令 256B短格式:直接寻址,64K长格式:直接、间接寻址,PORT为8位口地址输入指令:直接寻址IN AX,PORT IN AL,PORT 间接寻址IN AX,DX IN AL,DX 输出指令:直接寻址OUT AX,PORT OUT AL,PORT 间接寻址OUT AX,DX OUT AL,DX (2)换码指令XLAT AL←(BX+AL)(BX)为mem地址 3.地址传送指令 (1)有效地址传送寄存器 LEA reg16, mem作用:mem的EA→reg16 (2)指针送寄存器和DS指令 LDS reg16, mem32 作用:reg16←mem32的低字高字→DS (3)指针送寄存器和有ES指令 LES reg16, mem32 作用:reg16←mem32的低字高字→ES 4.标志寄存器传送指令 (1)取标志指令:LAHF F的低字节→AH (2)置标志指令:SAHF AH→flag的低字节 (3)标志入栈指令:PUSHF SP-2→SP F→(SP+1):SP (4)标志出栈指令:POPF (SP+1):SP→F SP+2→SP 二、算术运算指令 1.加法类指令(Add)opr-reg mem B/W (1)不带进位加法ADD dst, src dst←dst+src 影响OSZAPC (2)带进位加法ADC dst, src dst←dst+src+CF影响OSZAPC (3)加1指令INC opr opr←opr+1影响OSZP (4)组合十进制调整DAA放在ADD后 (5)非组合十进制调整AAA放在ADC后 原理:2个十进制数相加,可能出现非法数(A到F),需用调整指令,进行加6调整变成合法十进制数。十进制=BCD组合=压缩组合BCD占4位非组合BCD占8位 2 . 减法类指令(substract) (1)减法指令SUB dst, src;dst←dst-src影响标志位OSZAPC (2)带借位减法指令SBB dst, src;dst←dst-src-CF影响标志位

常见汇编语言指令解释:

PC是一个16位的程序计数器。用于存放和指示下一条要执行的指令的地址。寻址范围达64KB。PC有自动加1功能,以实现程序的顺序执行。PC没有地址,是不可寻址的,无法用指令对它进行读写。但在执行转移、调用、返回等指令时能自动改变其内容,以改变程序的执行顺序。 参数代表的意义: 1、Rn 表示R0~R7中的一个 2、#data 表示8位的数值 00H~FFH 3、direct 表示8位的地址 00H~FFH(指的是内部RAM或SFR的地址) 4、@Ri 表示寄存器间接寻址只能是R0或者R1 5、@DPTR 表示数据指针间接寻址 6、bit 表示位地址 7、$ 表示当前地址 常见汇编语言指令解释: 寄存器寻址 MOV A,R1将R1中的数值赋予A 直接寻址 MOV A,3AH将地址3AH中的数值赋予A 立即寻址 MOV A,#3AH将3AH数值赋予A

寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A 变址寻址 MOVC A,@A+DPTR以A中的数值为地址偏移量进行查表 相对寻址 AJMP MATN跳转到行号为MATN处 位寻址 MOV C,7FH 将位地址7FH的数值赋予C MOV A,#3AH数据传输、赋值命令 PUSH direct将direct为地址的数值压入堆栈中 POP direct将direct为地址的数值弹出堆栈 XCH A,direct将direct中的数值与A进行交换 ADD A,direct将direct中的数值与 INC direct将direct中的数值加1 SUBB A,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零:CLR C DEC direct将direct中的数值减1 DA A 用于对BCD码加减法后进行10进制调整 MUL A B将A和B相乘,并把高八位放在B中,低八位放在A中 DIV A B将A和B相除,并把商放在A中,余数放在B中 ANL A,direct将A与direct中的数值进行与运算,结果保留在A 中(与运算规律:有0出0,全1出1) ORL A,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0) XRL A,direct将A与direct中的数值进行异或运算,结果保留在A 中(异或运算规律:全0出0,全1出0,01、10出1)

汇编语言常用指令大全解释

常用汇编指令:MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。 LES (Load ES with pointer) 指针送寄存器和ES指令 LES REG , SRC //常指定DI寄存器 执行操作: REG=(SRC) , ES=(SRC+2) //与LDS大致相同,不同之处是将ES代替DS而已. LAHF( Load AH with Flags ) 标志位送AH指令

相关文档