汇编网首页登录博客注册
sirius的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
文章收藏
友情链接

[2008-05-29 15:57] 汇编指令总结

一.数据传送指令

1.传送指令(move)
语句格式:mov opd,ops
功能:将源操作数ops,传送至目的地址opd中,即(ops)->opd
影响标志位:无

2.数据交换指令(exchange)
语句格式:xchg opd,ops
功能:将源地址与目的地址中的内容互换,(opd)->ops,(ops)->opd
影响标志位:无

3.查表转换指令(translate)
语句格式:xlat ops或xlat
功能:描述为([bx+al])->al,即将以(bx)为首址,(al)为位移量的字节存储单元中的内容传送至al中
影响标志位:无

4.传送偏移地址指令(load effective address)
语句格式:lea reg,ops
功能:按ops提供的寻址方式计算偏移地址,并将其送入opd中
说明:(1)opd一定要是一个十六位的通用寄存器
(2)ops所提供的一定是一个存储器地址
影响标志位:无

5.传送偏移地址及数据段首址指令(load data segment register)
语句格式:lds opd,ops
功能:(ops)->opd,(ops+2)->ds
说明:(1)opd一定要是一个16位的通用寄存器
(2)ops所提供的一定要是一个存储器地址,且类型为DD
影响标志位:无

6.传送偏移地址及附加数据段首址指令(load extra-segment register)
语句格式:les opd,ops
功能:(ops)->opd,(ops+2)->es
说明:(1)opd一定要是一个16位的通用寄存器
(2)ops所提供的一定要是一个存储器地址,且类型为DD
影响标志位:无

7.进栈指令(push word onto stack)
语句格式:push ops
功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈
影响标志位:无

8.出栈指令(pop word off stack into destination
语句格式:pop ops
功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器中
影响标志位:无

9.标志寄存器进栈指令(push flags onto stack)
语句格式:pushf
功能:将标志寄存器的内容压入堆栈
影响标志位:无

10.标志寄存器出栈指令(pop flags off stack)
语句格式:popf
功能:将栈顶元素弹出送入标志寄存器中
说明:用popf对改变TF及OF位是唯一可行的置位方法
影响标志位:均有影响

11.标志寄存器传送指令(load AH from flags)
语句格式:lahf
功能:将标志寄存器的低8位送入ah中
影响标志位:无

12.标志寄存器传送指令(store AH into flags)
语句格式:sahf
功能:将ah中的内容送入标志寄存器的低8位中,而高8位保持不变
影响标志位:影响SF、ZF、PF、AF、CF位,对OF、DF、IF、TF均不影响

13.输入指令(input byte and input word)
语句格式:in (四种形式之一)
功能:从指定的外设寄存器取信息送入累加器中
说明:四种形式
(1)in al,port
(2)in ax,port
(3)in al,dx
(4)in ax,dx
port及(dx)均是外设寄存器地址,当外设寄存器地址为0~255时,直接将其地址码写在指令中;当外设寄存器地址大于255时,则要首先将地址码送入dx中,然后将dx写入指令中

14.输出指令(output byte and output word)
语句格式:out (四种形式之一)
功能:将累加器的内容送入指定的外设寄存器中
说明:四种形式
(1)out port,al
(2)out port,ax
(3)out dx,al
(4)in dx,ax
port及(dx)均是外设寄存器地址,当外设寄存器地址为0~255时,直接将其地址码写在指令中;当外设寄存器地址大于255时,则要首先将地址码送入dx中,然后将dx写入指令中

二.算术运算指令

1.加1指令(increment)
语句格式:inc opd
功能:(opd)+1->opd
影响标志位:AF、OF、PF、SF、ZF

2.加指令(addition)
语句格式:add opd,ops
功能:(opd)+(ops)->opd,即将目的操作数与源操作数相加,结果存入目的地址中,而源地址中的内容并不改变
影响标志位:AF、OF、PF、SF、ZF、CF

3.带进位加指令(add with carry)
语句格式:adc opd,ops
功能:(opd)+(ops)+CF->opd
影响标志位:AF、OF、PF、SF、ZF、CF

4.减1指令(decrement)
语句格式:dec opd
功能:(opd)-1->opd
影响标志位:AF、OF、PF、SF、ZF

5.求补指令(negate)
语句格式:neg opd
功能:将目的操作数的每一位取反(包括符号位)后加1送回目的地址
影响标志位:AF、OF、PF、SF、ZF、CF

6.减指令(subtract)
语句格式:sub opd,ops
功能:(opd)-(ops)->opd
影响标志位:AF、OF、PF、SF、ZF、CF

7.带借位减指令(subtract with borrow)
语句格式:sbb opd,ops
功能:(opd)-(ops)-CF->opd
影响标志位:AF、OF、PF、SF、ZF、CF

8.比较指令(compare)
语句格式:cmp opd,ops
功能:(opd)-(ops),比较目的操作数与源操作数,然后根据比较的结果设置标志位
说明:比较的结果并不存入目的地址,所以在语句执行后,opd及ops中的内容均不改变,此语句后面通常是条件转移语句,用来根据比较的结果实现程序的分支
影响标志位:AF、OF、PF、SF、ZF、CF

9.无符号乘指令(multiply(unsigned))
语句格式:mul ops
功能:字节乘法:(al)*(ops)->ax;字乘法:(ax)*(ops)->dx,ax
说明:源操作数只能是存储器操作数或寄存器操作数而不能是立即数
影响标志位:如果乘积的高位不为0,即ah或dx中包含有乘积的有效位,则CF=1,OF=1,否则CF=0,OF=0,系统未定义该乘法指令影响SF、ZF、PF和AF标志位

10.有符号乘指令(integer multiply(signed))
语句格式:imul ops
功能:字节乘法:(al)*(ops)->ax;字乘法:(ax)*(ops)->dx,ax
说明:格式与mul相同,只是参与运算的操作数及相乘后的结果均为有符号数
影响标志位:如果乘积的高位不为0,即ah或dx中包含有乘积的有效位,则CF=1,OF=1,否则CF=0,OF=0,系统未定义该乘法指令影响SF、ZF、PF和AF标志位

11.字节转换为字指令(convert byte to word)
语句格式:cbw
功能:将al中的符号位的值(0或1)扩展到ah中
影响标志位:无

12.字转换为双字指令(convert word to double word)
语句格式:cwd
功能:ax中的符号位的值(0或1)扩展到dx中
影响标志位:无

13.无符号除指令(divide(unsigned))
语句格式:div ops
功能:字节除法:(ax)/(ops)->al(商)、ah(余数);字除法:(dx、ax)/(ops)->ax(商)、dx(余数)
说明:(1)ops不能是立即数
(2)如果除数为0或运算结果溢出,则会发生溢出中断,立即中止程序的运行
影响标志位:除数为0或除法结果溢出引起的中断会影响TF、IF,系统未定义除法指令影响AF、OF、PF、SF、ZF、CF标志位

14.有符号除指令(integer divide(signed))
语句格式:idiv ops
功能:字节除法:(ax)/(ops)->al(商)、ah(余数);字除法:(dx、ax)/(ops)->ax(商)、dx(余数)
说明:(1)ops不能是立即数
(2)如果除数为0或运算结果溢出,则会发生溢出中断,立即中止程序的运行
(3)相除后,商和符号与数学上规定相同,但余数与被除数同号
影响标志位:除数为0或除法结果溢出引起的中断会影响TF、IF,系统未定义除法指令影响AF、OF、PF、SF、ZF、CF标志位

三.位操作指令

1.求反(not)
语句格式:not opd
功能:将目的地址中的内容逐位取反后再送入目的地址中
影响标志位:无

2.逻辑乘指令(and)
语句格式:and opd,ops
功能:即目的操作数和源操作数做逻辑乘运算,其结果存入目的地址中
说明:(1)运算法则:1∧1=1,1∧0=0,0∧1=0,0∧0=0
(2)该指令主要用来在目的操作数中清除与源操作数中置0的对应位
影响标志位:OF、PF、SF、ZF、CF,而AF未定义

3.测试指令(test)
语句格式:test opd,ops
功能:即目的操作数与源操作数做逻辑乘运算,并根据结果置标志位SF、ZF、PF,操作结束后,源地址和目的地址的内容并不改变
说明:该指令主要用来检测与源操作数中为1的位相对应的目的地址中的那几位是否为0(或为1),它的后面往往跟着转移指令,根据测试的结果决定转移方向
影响标志位:OF、PF、SF、ZF、CF,而AF未定义

4.逻辑加(or)
语句格式:or opd,ops
功能:目的操作数与源操作数做逻辑加运算,结果存入目的地址中,即是说对应于源操作数中的置1的位,目的操作数中的相应位也转置1,而其余位不变
说明:(1)运算法则:1∨1=1,1∨0=1,0∨1=1,0∨0=0
(2)常常用该指令将目的地址中的某一位或某几位置1
影响标志位:OF、PF、SF、ZF、CF,而AF未定义

5.按位加(exclusive or)
语句格式:xor opd,ops
功能:目的操作数与源操作数做按位加运算,其结果存入目的地址中
说明:(1)运算法则:1∨1=0,1∨0=1,0∨1=1,0∨0=0
(2)该指令主要用于将目的地址中与源操作数置1的对应位取反,如果操作数自身做按位加,其结果为0
影响标志位:OF、PF、SF、ZF、CF,而AF未定义

6.算数左移指令(shift arithmetic left)和逻辑左移指令(shift logical left)
语句格式:sal opd,1或sal opd,cl
        shl opd,1或shl opd,cl
功能:将(opd)向左移动指定的位数,而低位补入相应个数的0,CF的内容为最后移入位的值
说明:sal和shl可以很方便地实现有符号数与无符号数乘2的N次方运算(N为移位次数),在使用时要注意是否会发生溢出
影响标志位:OF、PF、SF、ZF、CF,而AF未定义

7.算术右移指令(shift arithmetic right)
语句格式:sar opd,1或sar opd,cl
功能:将(opd)向右移动指定的位数且最高位保持不变,CF的内容为最后移入位的值
说明:sar可以很方便地实现对有符号数除2的N次方运算(N为移位次数)
影响标志位:OF、PF、SF、ZF、CF,而AF未定义

8.逻辑右移指令(shift logical right)
语句格式:shr opd,1或shr opd,cl
功能:将(opd)向右移动指定的位数,而高位补入相应个数的0(注意:此为与sar的区别),CF的内容为最后移入位的值
说明:(1)shr可以很方便地实现对无符号数除2的N次方运算(N为移位次数)
(2)shr的另一个重要用途是可以将一个字或字节中的某一位(或几位)移动到指定的位置,从而达到分离出这些位的目的
影响标志位:OF、PF、SF、ZF、CF,而AF未定义

9.循环左移指令(rotate left)
语句格式:rol opd,1或rol opd,cl
功能:将目的操作数的最高位与最低位连接起来,组成一个环,将环中的所有位一起向左移动所规定的次数,CF的内容为最后移入位的值
影响标志位:CF、OF,如果(cl)不大于1,则OF无定义

10.循环右移指令(rotate right)
语句格式:ror opd,1或ror opd,cl
功能:将目的操作数的最高位与最低位连接起来,组成一个环,将环中的所有位一起向右移动所规定的次数,CF的内容为最后移入位的值
影响标志位:CF、OF,如果(cl)不大于1,则OF无定义

11.带进位的循环左移指令(rotate left through carry)
语句格式:rcl opd或rcl opd,cl
功能:将目的操作数连同CF标志位一起向左循环移动所规定的位数
影响标志位:CF、OF,如果(cl)不大于1,则OF无定义

12.带进位的循环右移指令(rotate right through carry)
语句格式:rcr opd或rcr opd,cl
功能:将目的操作数连同CF标志位一起向右循环移动所规定的位数
影响标志位:CF、OF,如果(cl)不大于1,则OF无定义

四.串操作指令

1.串传送指令(mov byte/word string)
语句格式:(1)movs opd,ops
(2)movsb 字节传送 
(3)movsw 字传送
功能:(1)(ds:[si])->es:[di]
(2)修改指针si和di使之指向串的下一个元素
当DF=0时,(si)和(di)增量1(字节操作)或2(字操作)
当DF=1时,(si)和(di)减量1(字节操作)或2(字操作)
说明:该指令带上重复前缀rep可用于数据串的成块传送,由于串传送指令不影响标志位,因此它不带repz/repe和repnz/repne两种重复前缀
影响标志位:无

2.串比较指令(compare byte/word string)
语句格式:(1)cmps opd,ops
(2)cmpsb 字节串比较 
(3)cmpsw 字串比较
功能:(1)([si]-[di]),即将si所指的源串中的一个字节(或字)存储单元中的数据与di所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志位,但结果并不保存
(2)修改指针si和di使之指向串的下一个元素
当DF=0时,(si)和(di)增量1(字节操作)或2(字操作)
当DF=1时,(si)和(di)减量1(字节操作)或2(字操作)
说明:(1)串比较指令与一般比较指令比较指令cmp的区别:串比较指令在比较时是源操作数减目的操作数,而一般比较指令cmp是目的操作数减源操作数
(2)通常可带repz/repe或repnz/repne两种重复前缀:带前者时比较操作被安排为当源串与目的串未比较完(即(cx)≠0)且两元素相等(即ZF=1)时继续比较;带后者时比较操作被安排为当源串与目的串未比较完(即(cx)≠0)且两元素不相等(即ZF=0)时继续比较
影响标志位:AF、OF、PF、SF、ZF、CF

3.串搜索指令(scan byte/word string)
语句格式:(1)scas opd
(2)scasb 字节串搜索
(3)scasw 字串搜索
功能:(1)字节操作:(al)-([di]),字操作:(ax)-([di]),并根据相减的结果置标志位,但结果并不保存
(2)修改指针di使之指向串的下一个元素
当DF=0时,(di)增量1(字节操作)或2(字操作)
当DF=1时,(di)减量1(字节操作)或2(字操作)
说明:可带repz/repe或repnz/repne两种重复前缀:带前者时搜索操作被安排为当目的串未搜索完(即(cx)≠0)且串元素与搜索值相等(即ZF=1)时继续搜索;带后者时搜索操作被安排为当目的串未搜索完(即(cx)≠0)且串元素与搜索值不相等(即ZF=0)时继续搜索
影响标志位:AF、OF、PF、SF、ZF、CF

4.从源串中取数指令(load byte/word string)
语句格式:(1)lods ops
(2)lodsb 从字节串中取数
(3)loadsw 从字串中取数
功能:(1)字节操作:([si])->al,字操作([si])->ax,即将si所指的源串中的一个字节(或字)存储单元中的数据取出送入al(或ax)中
(2)修改指针si使之指向串的下一个元素
当DF=0时,(si)增量1(字节操作)或2(字操作)
当DF=1时,(si)减量1(字节操作)或2(字操作)
说明:带重复前缀无意义
影响标志位:无

5.往目的串中存数指令(store byte/word string)
语句格式:(1)stos opd
(2)stosb 往字节串中存数
(3)stosw 往字串中存数
(1)字节操作:al->[di],字操作ax->[di],即将al(或ax)中的数据送入di所指的目的串中的字节(或字)存储单元中
(2)修改指针使之指向串的下一个元素
当DF=0时,(di)增量1(字节操作)或2(字操作)
当DF=1时,(di)减量1(字节操作)或2(字操作)
说明:由于不影响标志位,所以一般只带rep重复前缀
影响标志位:无

6.重复前缀(repeat string operation)
语句格式及功能:
(1)rep 重复,即无条件地重复cx寄存器中指定的次数
(2)repe/repz 相等/为0时重复,即(cx)≠0(重复次数还未为0)同时ZF=1(比较时相等)时重复,否则重复终止
(3)repne/repnz 不相等/不为0时重复,即(cx)≠0同时ZF=0时重复,否则重复终止

五.控制转移指令

1.简单条件转移指令:根据标志CF、ZF、SF、OF、PF为0或为1可表示的十种状态来设置的十条简单的条件转移指令
(1)je/jz(jump if equal/zero):前次操作结果等于0,即测试到ZF=1时跳转
(2)jne/jnz(jump if not equal/zero):前次操作结果不等于0,即测试到ZF=0时跳转
(3)js(jump on sign):前次操作结果为负,即测试到SF=1时跳转
(4)jns(jump if positive):前次操作结果为正,即测试到SF=0时跳转
(5)jo(jump on overflow):前次操作结果溢出,即测试到OF=1时跳转
(6)jno(jump on not overflow):前次操作结果未溢出,即测试到OF=0时跳转
(7)jc(jump on carry):前次操作结果有进位或借位,即测试到CF=1时跳转
(8)jnc(jmup on not carry):前次操作结果无进位或借位,即测试到CF=0时跳转
(9)jp/jpe(jump if parity eren):前次操作结果中1的个数为偶数个,即测试到PF=1时跳转
(10)jnp/jpo(jump if parity odd):前次操作结果中1的个数为奇数个,即测试到PF=1时跳转
说明:“前次操作”是指前一次影响标志位的操作

2.无符号数条件转移指令:
(1)ja/jnbe(jump if above/not below nor equal):ja即高于转移,jnbe即不低于且不等于转移,两种写法等价,它们都是当CF=0且ZF=0时转移,即对于两个无符号数a和b比较,若a>b则跳转
(2)jae/jnb(jump if above or equal/not below):jae即高于或等于转移,jnb即不低于转移,两种写法等价,它们都是当CF=0或ZF=1时转移,即对于两个无符号数a和b比较,若a≥b则跳转
(3)jb/jnae(jump if below/not above nor equal):jb即低于转移,jnae即不高于且不等于转移,两种写法等价,它们都是当CF=1且ZF=0时转移,即对于两个无符号数a和b比较,若a<b则跳转
(4)jbe/jna(jump if below or equal/not above):jbe即低于或等于转移,jna即不高于转移,两种写法等价,它们都是当CF=1或ZF=1时转移,即对于两个无符号数a和b比较,若a≤b则跳转
说明:此类指令一般跟在比较指令之后,视比较的对象为无符号数,根据运算结果设置的CF、ZF标志状态确定转移方向

3.无符号数条件转移指令:
(1)jg/jnle(jump if greater/not less nor equal):jg即大于转移,jnle即不小于且不等于转移,两种写法等价,它们都是当SF=CF且ZF=0时转移,即对于两个有符号数a和b比较,若a>b则跳转
(2)jge/jnl(jump if greater or equal/not less):jge即大于或等于转移,jnl即不小于转移,两种写法等价,它们都是当SF=CF或ZF=1时转移,即对于两个有符号数a和b比较,若a≥b则跳转
(3)jl/jnge(jump on less/not greater nor equal):jl即小于转移,jnge即不大于且不等于转移,两种写法等价,它们都是当SF≠CF且ZF=0时转移,即对于两个有符号数a和b比较,若a<b则跳转
(4)jle/jng(jump if less or equal/not greater):jle即小于或等于转移,jng即不大于转移,两种写法等价,它们都是当SF≠CF或ZF=1时转移,即对于两个有符号数a和b比较,若a≤b则跳转
说明:此类指令视比较的对象为有符号数,根据运算结果设置的CF、ZF、SF标志状态及其不同的组合确定转移方向

3.无条件转移指令(jump)
语句格式及功能:
(1)jump 标号  段内直接转移,(ip)+位移量->ip
(2)jump opd  段内间接转移,(opd)->ip;
(3)jump 标号 段间直接转移,标号的EA->ip,段首址->cs
(4)jump opd  段间间接转移,(opd)->ip,(opd+2)->cs
影响标志位:无

4.cx值为0时跳转指令(jump if cx is zero)
语句格式:jcxz 标号
功能:当(cx)=0时,(ip)+8位位移->ip
说明:8位位移=“标号”处的地址-jcxz指令后的第一个字节的地址
影响标志位:无

5.循环指令(loop)
语句格式:loop 标号
功能:(cx)-1->cx,如果(cx)≠0,则(ip)+8位位移->ip
说明:8位位移=“标号”处的地址-loop指令后的第一个字节的地址
影响标志位:无

6.相等/为零循环(loop on equal/zero)
语句格式:loope/loopz 标号
功能:(cx)-1->cx,如果(cx)≠0且ZF=1,则(ip)+8位位移->ip
说明:8位位移=“标号”处的地址-loope/loopz指令后的第一个字节的地址
影响标志位:无

7.不相等/不为零循环(loop on not equal/zero)
语句格式:loopne/loopnz 标号
功能:(cx)-1->cx,如果(cx)≠0且ZF=0,则(ip)+8位位移->ip
说明:8位位移=“标号”处的地址-loope/loopz指令后的第一个字节的地址
影响标志位:无

8.调用子程序(call a procedure)
语句格式及功能:
(1)段内直接 call 过程名
功能:(ip)入栈,目的地址EA->ip
(2)段间直接 call far ptr 过程名
功能:(cs)、(ip)入栈,目的地址的段地址->cs,目的地址EA->ip
(3)段内间接 call word ptr opd
功能:(ip)入栈,(opd)->ip
(4)段间间接 call dword ptr opd
功能:(cs)、(ip)入栈,(opd+2)->cs,(opd)->ip
说明:对于间接调用,其opd可以使用各种寻址方式
影响标志位:无

9.从子程序返回指令(return from procedure)
语句格式:ret
功能:通常做为子程序的最后一条指令,用来控制CPU返回到主程序的断点处继续往下执行,段间返回操作为(1)从栈中弹出一个字单元内容送入ip,(2)再从栈中弹出一个字单元内容送cs,段内返回只执行(1)操作
说明:(1)无论是段间返回还是段内返回,当ret指令执行后,主程序的断点地址信息已送入ip、cs中,而栈中恢复了转子前的状态
(2)返回指令的另一种形式:ret n,其中n为偶数,当用栈来给子程序传递参数时,调用者在调用子程序时要向栈中压入参数,子程序在返回时就可以用ret n指令将栈顶指针修改为调用前的值
影响标志位:无

10.软中断(interrupt)
语句格式:int n
功能:(1)(flags)入栈;(2)0->IF,0->TF;(3)(cs)、(ip)入栈;(4)(4*n)->ip,(4*n+2)->cs
说明:n为中断类型码,取值范围为0~255
影响标志位:IF,TF被置0

11.中断返回(interrupt return)
语句格式:iret
功能:(1)从栈中弹出一个字单元内容送入ip,(2)再从栈中弹出一个字单元内容送cs,(3)最后从栈中弹出一个字单元内容送flags
说明:执行iret指令后,恢复了被中断程序的断点地址和处理机状态,使处理机从中断处理子程序返回到被中断的程序继续执行
影响标志位:均有影响

六.处理机控制指令

1.置进位标志(set carry flag)
语句格式:stc
功能:1->CF
影响标志位:CF

2.清除进位标志(clear carry flag)
语句格式:clc
功能:0->CF
影响标志位:CF

3.进位标志取反(complement carry flag)
语句格式:cmc
功能:进位标志取反
影响标志位:CF

4.置方向标志(set directiom flag)
语句格式:std
功能:1->DF,配合串传送指令使用,使si、di递减1(字节操作)或递减2(字操作)
影响标志位:DF

5.清除方向标志(clear direction flag)
语句格式:cld
功能:0->DF,配合串传送指令使用,使si、di递增1(字节操作)或递增2(字操作)
影响标志位:DF

6.置中断标志(set interrupt flag)
语句格式:sti
功能:1->IF,使CPU处于开可屏蔽中断状态,能够响应外设的可屏蔽中断请求
影响标志位:IF

7.清除中断标志(clear interrupt flag)
语句格式:cli
功能:0->IF,使CPU处于关可屏蔽中断状态,拒绝响应外设的可屏蔽中断请求
影响标志位:IF

8.空操作(no operation)
语句格式:nop
功能:空指令
影响标志位:无
评论次数(4)  |  浏览次数(2618)  |  类型(学习笔记) |  收藏此文  | 

[  younggay   发表于  2008-05-30 11:03  ]

好久不见喽。呵呵。收藏一下。等待你的
to be continued !

[  sirius   发表于  2008-05-30 16:07  ]

自己将常用的指令过了一遍,简单归纳一下,这样以后就基本不用翻书了,忘记的时候可以打开查一下

[  oldmtn   发表于  2008-08-16 15:30  ]

真的勇士,敢于直面枯燥的汇编

好耶
,可是我从来没 感觉汇编是枯燥的

[  zouhehui   发表于  2009-11-29 11:21  ]

写的非常好,佩服!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码