汇编言语——移位指令
汇编语言常见指令
汇编语言常见指令汇编语言常见指令“PTR”操作符:强制类型转换MOV BYTE PTR [BX], 20H;1B立即数20H送DS:[BX]MOV WORD PTR [BX], 20H;立即数20H送DS:[BX],;00H送DS:[BX+1]2.LEA(Load Effective Address)设:变量X的偏移地址为1020H , (BP)=0020H 执行指令后:LEA DX, XLEA BX, [BP]; 执行后, (DX) = 1020H; 执行后, (BX) = 0020H3.地址传送指令LDS,LESLDS REG16, MEM ; 从存储器取出4B,送入REG16和DSLES REG16, MEM ; 从存储器取出4B,送入REG16和ES4.符号扩展指令CBW,CWDCBW ;将AL寄存器内容符号位扩展到AH CWD ;将AX寄存器内容符号位扩展到DX设:(AX)= 8060H,(DX)=1234H执行下列指令后CBW;(AX)= 0060H设:(AX)= 8060H,(DX)=1234H执行下列指令后CWD;(DX)= 0FFFFH,(AX)= 8060H 5.交换指令XCHG例如,(AX)= 5678H执行下面指令后XCHG A H, AL;(AX)= 7856H6.换码指令XLATXLAT ;AL←DS: [BX+AL]表格的首地址事先存放在内存逻辑地址DS: BX 中,AL的内容是相对于表格的位移量,把对应内存的内容取出放在AL寄存器。
7.逻辑运算符SHR(右移)SHL(左移)AND(与)OR(或)XOR(异或)NOT(取反8.关系运算符关系运算符用于两个数的比较,结果为“真(-1)”或“假(0)”GT(>)GE(>=)LT(<)LE(<=)EQ(=)NE(≠)9.地址运算符SEG 名称取地址表达式所在段的段基址OFFSET 名称取地址表达式的偏移地址10.类型操作符TYPE:取每个变量的字节数LENGTH:取变量定义了多少个取变量占用的字节总数11.加法指令(1)ADD(Addition):加法指令格式:ADD dest,src功能:dest ←dest + srcdest(目的操作数):8/16位的寄存器/存储器操作数src(源操作数):与目的操作数同类型的寄存器/存储器/立即数例:A DD AX, SI ; AX←(AX)+(SI),16位运算ADD X, 3 ; X←(X)+3, 运算位数由X的类型确定ADD [BX], DX ; DS:[BX]←DS:[BX]+DX, 16位运算说明:状态标志CF, OF, ZF, SF, PF, AF按照运算结果被刷新;(2)ADC(Addition with Carry):带进位的加法指令格式:ADC dest,src功能:dest←dest+src+CFdest(目的操作数):8/16位的寄存器/存储器src(源操作数):与目的操作数同类型的寄存器/存储器/立即数说明:状态标志CF, OF, ZF, SF, PF, AF按照运算结果被刷新;主要用于对数据分段相加时高位的加法运算。
汇编语言指令运用整理
传送指令MOVMOV dest,src ;dest←srcMOV指令把一个字节或字的操作数从源地址src传送至目的地址dest。
MOV指令是采用寻址方式最多的指令,用我们约定的符号可以表达如下:MOVreg/mem,imm;立即数送寄存器或主存MOVreg/mem/seg,reg;寄存器送寄存器(包括段寄存器)或主存MOVreg/seg,mem;主存送寄存器(包括段寄存器)MOVreg/mem,seg;段寄存器送主存或寄存器例2.1:立即数传送mov al,4;al←4,字节传送movcx,0ffh;cx←00ffh,字传送movsi,200h;si←0200h,字传送movbyteptr[si],0ah;ds:[si]←0ah,byteptr说明是字节操作movwordptr[si+2],0bh;ds:[si+2]←0bh,wordptr说明是字操作由于指定的寄存器有明确的字节或字类型,所以对应的立即数也必须分别是字节或字;但在涉及存储器单元时,指令中给出的立即数可以理解为字,也可以理解为字节,此时必须显式指明。
为了区别是字节传送还是字传送,可用汇编操作符byte ptr(字节)和word ptr(字)指定.例2.2:寄存器传送movax,bx;ax←bxmovah,al;ah←almovds,ax;ds←axmov[bx],al;DS:[bx]←al例2.3:存储器传送mov al,[bx] ; al←ds:[bx]mov dx,[bp] ;dx←ss:[bp]mov es,[si] ;es←ds:[si]例2.5:段寄存器传送mov[si],dsmovax,esmovds,axMOV指令的传送不是随心所欲的,下列是常见的错误:在包括传送指令的绝大多数双操作数指令中(除非特别说明),目的操作数与源操作数必须类型一致,或者同为字,或者同为字节,否则为非法指令。
例如:MOVAL,050AH;非法指令:050Ah为字,而AL为字节8086不允许立即数传送至段寄存器,所以下列指令是非法的:MOVDS,100H;非法指令:不允许立即数至段寄存器的传送8086指令系统除串操作类指令外,不允许两个操作数都是存储单元,所以也就没有主存至主存的数据传送。
汇编语言2-4逻辑移位指令
3、逻辑异或指令XOR
功能:对两个操作数执行按位逻辑异或运算,结果 送到目的操作数 XOR reg,imm/reg/mem ;reg←reg⊕imm/reg/mem XOR mem,imm/reg ;mem←mem⊕imm/reg 说明: (1)只有相“异或”的两位不相同,结果才是1; (2) XOR指令对操作数的限制和对标志位的影响同 AND指令; 思考: (1)某一个操作数自己和自己相异或? 寄存器清0 求反某些位 (2)XOR指令主要用在什么场合?
例题:逻辑指令应用
测试指令TEST
功能:对两个操作数执行逻辑与运算,结果不 回送到目的操作数,但要影响标志位,标志 位影响同AND指令。
说明: (1)本条指令通常是用于检测一些条件是否满足, 但又不希望改变原有的操作数的情况下。 (2)本条指令通常在其后紧跟一条条件转移指令。
TEST
例:测试为0或1
功能:对两个操作数执行按位的逻辑与运算,结 果送到目的操作数 AND reg,imm/reg/mem ;reg←reg∧imm/reg/mem
AND mem,imm/reg ;mem←mem∧imm/reg
说明:(1)按位的逻辑与运算; (2)操作数不能同时为存储器操作数; (3)注意对标志位的影响P44; 思考: (1)某一个操作数自己和自己相与? (2)AND指令主要用在什么场合? 屏蔽某些位P44的例3-18
2、逻辑或指令OR
功能:对两个操作数执行按位逻辑或运 算,结果送到目的操作数
OR reg,imm/reg/mem ;reg←reg∨imm/reg/mem OR mem,imm/reg ;mem←mem∨imm/reg
说明:(1)按位逻辑或运算; (2)OR指令对操作数的限制和对标志位的影响; 思考: (1)某一个操作数自己和自己相逻辑或? 置某些位 (2)OR指令主要用在什么场合?
汇编语言2-4逻辑移位指令
8086指令系统
一、数据传送类; 二、算术运算类; 三、位操作指令(逻辑运算和移位类); 四、串操作类; 五、控制转移类; 六、处理器控制类;
第 2章
8086指令系统
位操作指令,它们都是按位进行操作的包含逻辑运
算类指令和移位指令。 位操作类指令以二进制位为基本单位进行数据的操 作;这是一类常用的指令,都应该特别掌握 注意这些指令对标志位的影响 要求:全面而准确地理解每条指令的功能和应用 重点掌握以下指令:
第 2章
2、逻辑或指令OR
功能:对两个操作数执行按位逻辑或运 算,结果送到目的操作数
OR reg,imm/reg/mem ;reg←reg∨imm/reg/mem OR mem,imm/reg ;mem←mem∨imm/reg
说明:(1)按位逻辑或运算; (2)OR指令对操作数的限制和对标志位的影响; 思考: (1)某一个操作数自己和自己相逻辑或? 置某些位 (2)OR指令主要用在什么场合?
RCR reg/mem,1/CL
;带进位循环左移
;带进位循环右移
演示
第 2章
说明:循环移位指令
对操作数:同移位指令。 对标志的影响:
(1)按照指令功能设置进位标志CF (2)不影响SF、ZF、PF、AF (3)对于OF,同移位指令。如果进行一位移动, 则按照操作数的最高符号位是否改变,相应设置 溢出标志OF:如果移位前的操作数最高位与移位 后操作数的最高位不同(有变化),则OF = 1; 否则OF = 0。当移位次数大于1时,OF不确定
第 2章
例:移位指令
mov cl,4 mov al,0f0h ;al=f0h shl al,1 ;al=e0h ;CF=1,SF=1、ZF=0、PF=0,OF=0 shr al,1 ;al=70h ;CF=0,SF=0、ZF=0、PF=0、OF=1 sar al,1 ;al=38h ;CF=0,SF=0、ZF=0、PF=0、OF=0 sar al,cl ;al=03h ;CF=1,SF=0、ZF=0、PF=1 、OF=0
汇编指令详解
8086/8088指令详解一、数据传送指令(课本P47)1.通用数据传送指令(P47)MOV传送字或字节.PUSH把字压入堆栈.POP把字弹出堆栈.XCHG交换字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.MOV指令格式为: MOV DST,SRC执行的操作:(DST)<-(SRC)1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.PUSH进栈指令格式为:PUSH SRC执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(SRC)1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.2.入栈时高位字节先入栈,低位字节后入栈.POP出栈指令格式为:POP DST(SP)<-(SP)+21.出栈操作数除不允许用立即数和CS段寄存器外, 可为通用寄存器,段寄存器和存储器.2. 执行POP SS指令后,堆栈区在存储区的位置要改变.3. 执行POP SP 指令后,栈顶的位置要改变.XCHG交换指令格式为:XCHG OPR1,OPR2执行的操作:(OPR1)<-->(OPR2)1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.指令执行时只用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.2.累加器专用传送指令(P53)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+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))1.BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果.2.指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.3.有效地址送寄存器指令(P55)LEA(Load effective address)有效地址送寄存器LDS(Load DS with Pointer)指针送寄存器和DSLES(Load ES with Pointer)指针送寄存器和ESLFS 传送目标指针,把指针内容装入FS.LGS 传送目标指针,把指针内容装入GS.LSS 传送目标指针,把指针内容装入SS.LEA有效地址送寄存器格式为: LEA REG,SRC执行的操作:(REG)<-SRC指令把源操作数的有效地址送到指定的寄存器中.例: LEA DX,string ;把偏移地址string存到DX.注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS指针送寄存器和DS指令格式为: LDS REG,SRC执行的操作:(REG)<-(SRC)(DS)<-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器(将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。
汇编基础知识3之移位和乘除
汇编基础知识3之移位和乘除汇编真的挺有意思的,整理出了以前的学习的基本知识,为了图快都拿的书的截屏测试代码,但是我亲测有效,放⼼学习之,学汇编,除了这些,上看雪搜索玩命,看他的代码呗2018.5.7SHL 指令(逻辑左移)把⽬的操作数内的每位左移,以0填充最低位。
SHL 指令的⼀个最重要的应⽤就是⽤于实现与2 的次幂的快速乘法,把任何操作数左移n 位就相当于乘以了2"SHR 指令(逻辑右移)把操作数的每位右移,并以0填充最⾼位,把任何操作数右移n位就相当于除以了2”.SAL( 算术左移)和SAR( 算术右移)指令是为有符号数的移位特别设计的。
他们的⾼位或者低位填充是根据原来数字的符号位决定的ROL (循环左移)指令把每位左移并把最⾼位同时复制到进位标志和最低位中。
ROR (循环右移)指令把每位右移并把最低位同时复制到最⾼位和进位标志中。
RCL (带进位循环左移)指令把操作数的每位左移并把最⾼位复制到进位标志中,原进位标志复制到结果的低位。
RCR( 带进位循环右移)指令把每位右移,并把最低位复制到进位标志中.原进位标志值复制到结果的最⾼位。
SHLD (双精度左移)和SHRD (双精度右移)指令在1A-32 系列处理器上才能使⽤,对于⼤整数的移位是⾮常有效的。
MUL 和iMUL 指令分别进⾏有符号整数和⽆符号整数的乘法操作。
DIV 指令进⾏⽆符号整数的除法操作,IDIV进⾏有符号整数的除法操作。
MUL(⽆符号乘法,肯定不会溢出):MUL (⽆符号乘法)指令有三种格式:第⼀种将8 位的操作数与AL 相乘;第⼆种将16 位的操作数与AX 相乘;第三种将32 位的操作数与EAX 相乘。
乘数和被乘数⼤⼩必须相同,乘积的尺⼨是乘数/被乘数⼤⼩的两倍。
三种格式都既接受寄存器操作数,也接受内存操作数,但是不接受⽴即数操作数。
MUL r/m8MUL r/m16MUL r/m32指令中唯⼀的⼀个操作数是乘数。
汇编语言指令集.
汇编语言指令集 1.算术运算符 ADC:带进位加法 ADD:二进制数加法 DEC:减一DIV:无符号数除法 IDIV:带符号数(整数除法 IMUL:带符号数(整数乘法 INC:加一MUL:无符号书乘法 NEG:求补 SBB:带借位减法 SUB:二进制减法 XADD:交换并相加 2.ASCII-BCD转换 AAA:加后ASCII调整 AAD:除前ASCII调整 AAM:乘后ASCII调整 AAC:减后ASCII调整 DAA:加后十进制调整 DAS:减后十进制调整 3.移位 RCL:带进位循环左移 RCR:带进位循环右移 ROL:循环左移 ROR:循环右移 SAL:算术左移 SAR:算术右移 SHL:逻辑左移 SHR:逻辑右移 SHLD:双精度左移 SHRD:双精度右移 4.比较 BSF/BSR:位扫描 BT/BTC/BR/BB:位测试 CMP:比较 CMPSN:串比较 CMPXCHG:比较交换 CMPXCHG8B:比较并换?lt;br>TEST:测试位 5.数据传送LDS:装如数据段寄存器 LEA:装入有效地址 LES:装入附加段寄存器 LODS:从串取LSS:装入堆栈段寄存器 MOV:传送数据 MOVS:串传送 MOVSX:带符号扩展传送MOVZX:带零扩展传送 STOS:存入串 XCHG:交换 XLAT:换码 6.标志操作 CLC:清除位标志 CLD:清除方向标志 CLI:清除中断标志 CMC:进位标志求反 LAHF:标志送AH POPF:标志出栈 PUSHF:标志进栈 SAHF:AH送标志寄存器 STC:进位标志置1 CTD:方向标志置1 STI:中断标志置1 7.输入/输出 IN:输入字节或字 INSN:串输入OUT:输出字节或字 OUTSN:穿输出 8.逻辑操作 AND:逻辑与 NOT:逻辑非 OR:逻辑或 XOR:异或 9.循环 LOOP:循环直到完成 LOOPE:相等时循环 LOOPZ:为零是循环LOOPNE:不相等时循环 LOOPPNZ:不为零是循环 LOOPPNEW:不相等时循环LOOPNZW:不为零时循环 10.处理器控制 HLT:进入暂停状态 LOCK:封锁总线 NOP:无操作 WAIT:置处理器于等待状态 11.堆栈操作 ENTER:建立堆栈帧 LEAVE:结束堆栈帧 POP:字出栈 POPF:标志出栈 POPA:所有通用寄存器出栈 PUSH:字进栈PUSHA:所有通用积存器进栈 PUSHF:标志进栈 12.串操作 CMPS:串比较 LODS:从串取 MOVS:串传送 REP:串重复 REPE:相等时重复 REPZ:为零时重复 REPNE:不相等时重复 REPNZ:不为零时重复 SCAS:串扫描 STDS:存入串 13.转移(条件 INT溢出中断 JA:高于则转移 JAE:高于或等于则转移 JB:低于则转移 JBE:低于或等于则转移JC:进位为1则转移 JCXZ:CX为零则转移 JE:相等则转移 JG:大于则转移 JGE:大于或等于则转移 JL:小于则转移 JLE:小于或等于 JNC:进位为零则转移 JNE:不相等则转移 JNG:不大于则转移 JNGE:不大于或等于则转移 JNL:不小于则转移 JNLE:不小于或等于则转移 JNA:不高于则转移 JNB:不低于则转移 JNBE:不低于或等于则转移JNAE:不高于或等于则转移 JN不溢出则转移 JNP:奇偶位为0则转移 JNZ:结果不为零则转移 JNS:结果为正则转移 J若溢出则转移 JP:奇偶位为1则转移 JPE:奇偶性为偶则转移 JP奇偶性为奇则转移 JS:结果为负则转移 JZ:结果为零则转移 14.转移(无条件 CALL:调用过程 INT:中断 IRET:中断返回 JMP:无条件转移 RET:返回 RETN/RETF:近返回/远返回 15.类型转换 CBW:字节转换为字 CDQ:双字转换为四字 CWD:字转换为双字CWDE:字转换为扩展的双字。
2017年春季汇编语言第七讲基础指令(二)-v
第七讲 基础指令(二)
一、移位指令 二、乘除指令 三、杂项指令 四、字节指令 五、程序实例
一、移位指令
• • • • • • SHL:逻辑左移 SHR:逻辑右移 SAL:算术左移 SAR:算术右移 SHLD:双精度左移 SHRD:双精度右移
SHL/SAL
• SHL/SAL:逻辑左移/算术左移
• 当count = 0时,所有标志位不受影响 • 当count > 0时,CF位等于最后移出的一位,SF、ZF、 PF根据移位结果设置,AF未定义 • 当count = 1时,OF = 移位前dest的最高位;当count > 1时,OF未定义
SHR移位工作原理
SHR指令基本格式
指令格式(Intel syntax) shr r/m, 1 shr r/m, imm8 shr r/m, cl 说明 8/16/32寄存器或内存单元逻辑右移1位 8/16/32寄存器或内存单元逻辑右移imm8位 8/16/32寄存器或内存单元逻辑右移,位数为 cl寄存器的值
SHL/SAL移位工作原理
SHL/SAL指令基本格式
指令格式(Intel syntax) sal r/m, 1 sal r/m, imm8 sal r/m, cl shl r/m, 1 shl r/m, imm8 shl r/m, cl 说明 8/16/32寄存器或内存单元左移1位 8/16/32寄存器或内存单元左移imm8位 8/16/32寄存器或内存单元左移,位数为cl寄 存器的值 8/16/32寄存器或内存单元左移1位 8/16/32寄存器或内存单元左移imm8位 8/16/32寄存器或内存单元左移,位数为cl寄 存器的值
80X86汇编语言程序设计 第二章⑦.8086 8088指令系统(四)逻辑运算和移位指令
80X86汇编语言程序设计第二章 8086/8088寻址方式和指令系统(四)逻辑运算和移位指令1.逻辑运算指令(1)否操作指令NOT格式:NOT OPRD这条指令把操作数OPRD取反,然后送回OPRD。
操作数OPRD可以是通用寄存器,也可以是存储器操作数,不能是立即数。
此指令对标志位没有影响。
例如:MOV AL,03HNOT AL指令执行后:(AL)=0FCH(2)与操作指令AND格式:AND OPRD1,OPRD2这条指令对两个操作数进行按位的逻辑“与”运算,结果送到目的操作数OPRD1。
该指令执行以后,标志CF=0,标志OF=0,标志PF、ZF、SF反映运算结果,标志AF未定义。
某个操作数自己与自己相“与”,则值不变,但可使进位标志CF清0。
与操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位清为0的场合。
把要维持不变的这些位于“1”相“与”,而把要清为0的这些位于“0”相“与”就能达到这样的目的相“与”:两个操作数都是1的,结果为1,其他情况全是0。
例如:MOV AL,23HMOV BL,02HAND AL,BL指令执行后:(AL)=02H(AL)=23H,将AL寄存器的第一位和第三位清零,其余位不变,则BL是什么时,与AL 执行AND指令可完成?(BL)=F5HMOV AL,23HMOV BL,F5HAND AL,BL(3)或操作指令OR格式:OR OPRD1,OPRD2这条指令执行以后,标志CF=0,标志OF=0.,标志PF、ZF、SF反映运算结果,标志AF未定义。
某个操作数自己与自己相“或”,则值不变,但可使进位标志CF清0。
相“或”:两个操作数中有一个是1的,结果为1,其他情况全是0。
或操作指令主要用于在使一个操作数中的若干位维持不变,而另外若干位置为1的场合。
把要维持不变的这些位于“0”相“或”,而把要置为1的这些位与“1”相“或”就能达到这样的目的。
例如:MOV BL,12HOR BL,BL(BL)=12H CF=0(4)异或操作指令XOR格式:XOR OPRD1,OPRD2相“异或”:两个操作数,一个是0,一个是1,则为1;两个都为1,则为0;两个都为0,则为0。
指令学习——移位指令资料
右端1移入SM1.1和
LW0左
0
右端0移入SM1.1和
LW0左
例题分析:编写八只灯HL1、HL2、HL3、HL4、HL5、HL6、HL7、 HL8每0.5秒顺序点亮,连续循环20次的程序.
QB0
应用举例 :RRW LW0,3
运行结果 如下
移位 次 数
0
1
地址
LW0 LW0
2 LW0
3 LW0
单元内容
位SM1.1
说明
1011010100110011 1101101010011001 1110110101001100 0111011010100110
X
移位前
1
右端1移入SM1.1和
LW0左
1
• SLW和SRW,字左移和字右移。指令盒与字节 移位比较,只有名称变为SHR_W和SHR_W。 使能输入有效时,把字型输入数据IN左移或右 移N位后,再将结果输出到OUT所指的字存储 单元。最大实际可移位次数为16。
双字左移和双字右移
• (3)SLD和SRD,双字左移和双字右移。指令盒与字 节移位比较,只有名称变为SHL_DW和SHR_DW,其 他部分完全相同。使能输入有效时,把双字型输入数 据IN左移或右移N位后,再将结果输出到OUT所指的双 字存储单元。最大实际可移位次数为32。
2. 循环左移、循环右移
循环左移和循环右移根据所循环移位的数的长度分别又 可分为字节型、字型、双字型。
循环移位特点: 移位数据存储单元的移出端与另一端相连,同时又与
SM1.1(溢出)相连,所以最后被移出的位被移到另一 端的同时,也被放到SM1.1位存储单元。例如在循环右 移时,移位数据的最右端位移入最左端,同时又进入 SM1.1。SM1.1始终存放最后一次被移出的位。
汇编语言-移位指令
汇编语⾔-移位指令基本概念移位操作指令:移位操作指令是⼀组经常使⽤的指令,属于汇编语⾔逻辑指令中的⼀部分,它包括移位指令(含算术移位指令、逻辑移位指令),循环移位指令(含带进位的循环移位指令),双精度移位指令三⼤类。
其功能为将⽬的操作数的所有位按操作符规定的⽅式移动1位或按寄存器CL规定的次数(0~255)移动,结果送⼊⽬的地址。
⽬的操作数是8位(或16位)的寄存器数据或存储器数据。
基本格式格式为:xxx oper1,CL/1移位次数只能是1或者存放在CL⾥⾯。
移位指令⼀、算术移位指令1、算术左移指令SAL功能:左移⼀次,最低位补0,最⾼位送⼊CF标志位,如图:意义:左移n次,等于x2的n次幂。
所以可⽤于有符号操作数做x2的n次幂运算。
2、算术右移指令SAR功能:右移⼀次,最⾼位保持不变,最低位送⼊CF标志位,如图:意义:右移n次,等于/2的n次幂。
所以可⽤于有符号操作数做/2的n次幂运算。
⼆、逻辑移位指令1、逻辑左移指令SHL功能:同SAL,如图:意义:同SAL2、逻辑右移指令SHR功能:右移⼀次,最⾼位补0.区别!最低位送⼊CF标志位。
如图:意义:⽤于实现⽆符号数/2的n次幂操作。
三、循环移位指令1、循环左移指令ROL功能:左移⼀次,左移前的最⾼位送⼊最低位以及CF.如图:2、循环右移指令ROR功能:右移⼀次,右移前的最低位送⼊最⾼位以及CF.如图:3、带进位的循环左移指令RCL功能:左移⼀次,左移前的最⾼位送⼊CF,CF的内容送⼊最低位.如图:4、带进位的循环右移指令RCR功能:右移⼀次,右移前的最低位送⼊CF,CF的内容送⼊最⾼位.如图:四、双精度移位指令1、双精度左移指令SHLD2、双精度右移指令SHRD。
汇编语言指令详解
练习题1、8086CPU向0052H单元写入一个字,写入过程中BHE和A0的逻辑电平是()。
A、0和0B、0和1C、1和0D、1和12、8086CPU用()信号的下降沿在T1结束时将地址信息锁存在地址锁存器中。
A、M/IOB、BHEC、ALED、READY3、下列8086CPU标志寄存器FR的标志位中,不属于状态标志位的是( )A、OFB、IFC、AFD、PF4、8086CPU在进行读内存操作时,控制信号M/IO 和DT/R的状态是( )A、00B、01C、10D、115、当8086CPU采样到READY=0,则CPU将( )A、执行停机指令B、插入等待周期C、执行空操作指令 D、重新发送地址码6、在8086CPU的标志寄存器中,控制标志位占()A、3位B、9位C、4位D、16位7、8086 CPU内有指示下条指令有效地址的指示器是()A、IPB、SPC、BPD、SI8、现行数据段位于存储器B0000H到B0FFFH字节单元,则段寄存器DS的内容及该段长度(字节数)分别为()A、B000H,1000HB、0000H,0FFFHC、B000H,0FFFHD、B000H,00FFH9、指令MOV BX,[BP]中,约定的段寄存器是( )A、ESB、SSC、DSD、CS10、下列指令有语法错误的是()A、MOV [SI],[DI]B、IN AL,DXC、MOV AX,[0100H+BX+SI]D、PUSH BX11、堆栈操作时,段内偏移量由()寄存器指出。
A、SPB、BPC、SID、DI12、地址总线的“宽度”决定了计算机系统内存的最大容量,8086有20根地址线,可寻址()字节的存储单元。
A、512KB、1MC、2MD、4M13、条件转移指令JZ的测试条件()A、CF=0B、CF=1C、ZF=0D、ZF=114、INC指令不影响()标志A、OFB、CFC、ZFD、SF15、寄存器间接寻址方式中,操作数在()中。
汇编语言常用指令大全
MOV 指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 和段寄存器(但不允许用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=Tmp1.必须有一个操作数是在寄存器中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_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。
汇编(十一)——位操作类指令
汇编(十一)——位操作类指令位操作类指令对二进制的各个位进行操作,包括逻辑运算指令和移位指令。
一、逻辑运算指令逻辑运算指令用来对字或字节按位进行逻辑运算,包括逻辑与AND、逻辑或OR、逻辑非NOT、逻辑异或XOR和测试TEST五条指令。
1、逻辑与指令ANDAND dest,src ;des←dest∧src(符号∧表示逻辑与)AND指令对两个操作数执行按位的逻辑与运算:即只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0。
逻辑与的结果送到目的操作数。
用AND指令可以将一个字节或字中的某些特定位清零,或者说将某些位截取下来。
如将ASCII码的高4位清零,亦即截取低4位,假设这个ASCII码已在AL中,则AND AL,00001111B就会将AL中的低4位截取下来,将AL中的高4位清零。
其中00001111B称为逻辑乘常数。
AND指令及后面介绍的其他双操作数逻辑指令OR、XOR和TEST,源操作数可以是任意寻址方式,而目的操作数只能是立即数之外的其他寻址方式,并且两个操作数不能同时为存储器寻址方式。
所有双操作数的逻辑指令均设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。
2、测试指令TESTTEST dest,src ;dest∧src(符号∧表示逻辑与)TEST指令对两个操作数执行按位的逻辑与运算,但结果不回送目的操作数。
TEST指令执行的操作与AND相同,但不保存执行结果,只根据结果来设置状态标志。
TEST指令通常用于检测一些条件是否满足,但又不希望改变源操作数的情况,这条指令之后,一般都是条件转移指令,目的是利用测试条件转向不同的程序段。
3、逻辑或指令OROR dest,srcOR指令对两个操作数执行按位的逻辑或运算:即只要相“或”的两位有一位是1,结果就是1。
OR指令可用于置位某些位。
4、逻辑异或指令XORXOR dest,src相异或的两位不相同时,结果就是1,否则,异或的结果为0。
汇编言语移位指令
7.1.3 逻辑右移 【指令格式】SHR d1, d2 【功能】把操作数d1的各个二进制位依次向右移动d2位,移动造成左边的空位填0,结果放回操作数d1中。 【说明】 (1)对两个操作数的语法限制以及对标志位的设置情况都与SHL指令相同,见SHL指令说明的(1)、(2)和(5)。 (2)SHR指令在位的移动方向上与SHL指令刚好相反,其它方面则很类似,向右移出的最后一位放到CF中,右移造成左边的空位以0填充,如图7.2所示。
……
位号: 15/7 14/6 1 0
0
CF 操作数d1
(4)移动后d1中的数据是在其原值的后面加了d2个0,即把原数值扩大了倍,当扩大后的值超过表示范围时,超过d1类型(字节或字)规定位数的高位部分会自动丢失。 (5)该指令对其余标志位的影响情况是:移动后的结果为0则ZF置1,否则ZF清0;移动后d1最高位的值会复制到SF上;如果移动前后d1的最高位不同则OF置1,否则OF清0。 移位指令涉及数值计算问题,但并不复杂。比如AX的值是8D56H,CL的值是3,则下面几条指令是SHL指令的正确用法,后面也给出了移位后的结果: SHL AL,1 移位后,AL = 0ACH,CF = 0,AH不变 SHL AX,1 移位后,AX = 1AACH,CF = 1 SHL AH,CL 移位后,AH = 68H,CF = 0,AL不变 SHL AX,CL 移位后,AX = 6AD0H,CF = 0
7.1.7 带进位的循环左移 【指令格式】RCL d1,d2 【功能】把操作数d1的各位与CF联合在一起,构成9个或者17个二进制位,向左移动d2位,从左端移出的各位再依次移到右端空出的位上。 从功能上说,可以把d1的各位与CF一起,看作首尾相接的一个环状,如图7.5所示,把各位按逆时针方向旋转d2格,再从环原先的连接部断开,可以得到ROL指令执行后的结果,包括CF的设置情况。
汇编语言常用指令大全解释
汇编语言常用指令大全解释汇编语言常用指令大全解释常用汇编指令:MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用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=Tmp1.必须有一个操作数是在寄存器中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_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。
汇编语言学习之指令
1.BUFFER DB 100 DUP(0)表示以BUFFER为首地址的100个字节存放00H数据2.将从SLOT地址中取一个字送入AX中。
假如要将SLOT标号所在段的段地址送入AX寄存器,则可用运算符SEG,其指令如下:MOV AX,SEG SLOT 也就是说SEG送段地址3.若要将SLOT在段内的偏移地址送入AX寄存器,则可用运算符OFFSET,其指令如下:MOV AX,OFFSET SLOT 而OFFSET送偏移地址4.SLOT DW 25MOV AL,BYTE PTR SLOT如上的SLOT是字变量,我们用PTR取出它的第一个字节单元5. MOV [BX],5对该指令,汇编程序不能知道传送的是一个字节还是一个字。
若是一个字节,则应写成:MOV BYTE PTR [BX],5若是字,则应写成:MOV WORD PTR [BX],56.K1 DB 30H,31H,32HK2 DW 4041H,4043HK3 DW 20H DUP(0)K4 DD 50515253HMOV AL,TYPE K1 ;等效于MOV AL,1MOV AH,TYPE K2 ;等效于MOV AH,2MOV AL,LENGTH K3 ;(AL)←20H,返回DUP前面的数值MOV CL,LENGTH K4 ;(CL)←01HMOV BL,SIZE K3 ;(BL)←40HMOV DL,SIZE K4 ;(DL)←04H取有效地址指令LEA(Load Effective Address)指令LEA是把一个内存变量的有效地址送给指定的寄存器。
其指令格式如下:LEA Reg, Mem该指令通常用来对指针或变址寄存器BX、DI或SI等置初值之用。
其功能如右图所示。
例如:图5.4 LEA指令的功能示意图…BUFFER DB 100 DUP(?)…LEA BX, BUFFER ;把字节变量BUFFER在数据段内的偏移量送给BX…加法指令1.加法指令ADD(ADD Binary Numbers Instruction)指令的格式:ADD Reg/Mem, Reg/Mem/Imm受影响的标志位:AF、CF、OF、PF、SF和ZF指令的功能是把源操作数的值加到目的操作数中。
汇编语言各种指令的解释与用法
汇编语言各种指令的解释与用法【数据传输指令】一、通用数据传送指令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<=0FFHIN ac,DX port>0FFHOUT port,ac port<=0FFHOUT DX,ac port>0FFH指令的基本功能:对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。
第3章-4-移位-串-转移-G
3.3.3
汇 编 语 言 程 序 设 计
移位指令 算术移位指令 逻辑移位指令 循环移位指令 操作符OP 操作符OP OPD,1 OPD,CL
2
移位指令 格式:
或
3 指 令 系 统 和 寻 址 方 式
其功能 为将目的操作数的所有位按操作符规定的方式移 动1位或按寄存器 CL 规定的次数(0~255)移动 目的操作数是 8位(或16位)的寄存器数据 或存储器数据。
REPZ
REPNZ
存储器
A
B … F
20
(1)REP REP 前 缀 用 在 MOVS 、 STOS 、LODS 指令前。 功能:每执行一次串指令 (CX)-1,直到(CX)=0, 重复执行结束。
DS:SI DS:SI
CX 15 0
DS:SI DS:SI ES:DI
1
DF
0
3
A B …
指 令 系 统 和 寻 址 方 式
DS:SI CX
存储器
24 35 … 1
DF
AC
65
3
0
指 令 系 统 和 寻 址 方 式
…
5.往目的串中存数指令 STOS
汇 编 语 言 程 序 设 计
19
STOSB——往字节串中存数 STOSW——往字串中存数 功能:将AL 或AX 中的 数据 送入DI所指的目的串中的字 节(或字)存储单元中。 AC
1.算术左移和逻辑左移指令SAL(SHL)3
汇 编 语 言 程 序 设 计
语句格式:SAL OPD,1 或 SHL OPD,1 SAL OPD,CL 或 SHL OPD,CL CF
0
功能:将(OPD)向左移动CL指定的次数,最低位补入相 应的0,CF 的内容为最后移入位的值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)操作数d2 表示移动的位数,只能是立即数1或者寄 存器CL,当移动位数超过1位时,必须把移动位数放在CL 中,以CL作为d2操作数。 (3)操作数d1各位移动的情况如图7.1所示,从最高位起, 将有d2位移到操作数d1之外,除了最后移出的一位放到标志 位CF中之外,5/7 14/6 …… CF 操作数d1 1 0 0
(4)移动后d1中的数据是在其原值的后面加了d2个0,即 把原数值扩大了倍,当扩大后的值超过表示范围时,超过d1 类型(字节或字)规定位数的高位部分会自动丢失。 (5)该指令对其余标志位的影响情况是:移动后的结果 为0则ZF置1,否则ZF清0;移动后d1最高位的值会复制到SF 上;如果移动前后d1的最高位不同则OF置1,否则OF清0。 移位指令涉及数值计算问题,但并不复杂。比如AX的值是 8D56H,CL的值是3,则下面几条指令是SHL指令的正确用 法,后面也给出了移位后的结果: SHL SHL SHL SHL AL,1 移位后,AL = 0ACH,CF = 0,AH不变 AX,1 移位后,AX = 1AACH,CF = 1 AH,CL 移位后,AH = 68H,CF = 0,AL不变 AX,CL 移位后,AX = 6AD0H,CF = 0
7.1 移位指令
7.1.1 逻辑左移 【指令格式】SHL d1, d2 【功能】把操作数d1的各个二进制位依次向左移动d2位, 移动造成右边的空位填0,结果放回操作d1中。 【说明】 (1)操作数d1必须是通用寄存器或内存型寻址方式,必须 有确定的类型,可以是字节型,也可以是字型,并且对内存型 寻址方式可以使用段跨越。
位号:15/7 14/6 …… 操作数d1
……
1
0
CF
图7.3 算术右移指令SAR的功能
7.1.5 循环左移
【指令格式】ROL d1, d2 【功能】把操作数d1 的各个二进制位向左移动d2 位,从d1 左端移出的每一位再依次移到右端空出的位上,最后移出的 一位还要送到CF中。 可以把d1的各位看作是首尾相接的一个环状,如图7.4所 示,把各位的值按逆时针方向旋转d2格,再从环原先的连接 部断开,可以得到ROL指令执行后的结果。
……
14/6
1
15/7 CF
0
图7.5 带有CF的循环左移指令RCL的功能
7.1.8 带进位的循环右移
【指令格式】RCR d1, d2 【功能】把操作数d1 的各位与CF联合在一起,构成9个或 者17个二进制位,向右移动d2位,从右端移出的各位再依次 移到左端空出的位上。 带进位CF的循环右移指令的功能可以参照图7.5,把移 动方向改为顺时针即可。 逻辑移位与算术移位指令除了功能本身描述的二进制位 的移动之外,还用于把一个字节型或字型数据乘以/除以2n。 乘除法指令是所有8088指令中最耗时的,所花费的时间是加 减法的20~30倍,是移位指令的35~50倍,因此如果能用移 位指令和加减法指令代替乘除法指令,将大大提高程序的执 行速度。
7.1.2 算术左移
【指令格式】SAL d1, d2 【说明】这是一条与SHL完全相同的指令,该指令与SHL 指令是同一条机器指令的两种不同写法。
7.1.3 逻辑右移
【指令格式】SHR d1, d2 【功能】把操作数d1 的各个二进制位依次向右移动d2 位, 移动造成左边的空位填0,结果放回操作数d1中。 【说明】 (1)对两个操作数的语法限制以及对标志位的设置情况 都与SHL指令相同,见SHL指令说明的(1)、(2)和(5)。 (2)SHR指令在位的移动方向上与SHL指令刚好相反, 其它方面则很类似,向右移出的最后一位放到CF中,右移造 成左边的空位以0填充,如图7.2所示。
7.1.7 带进位的循环左移
【指令格式】RCL d1,d2 【功能】把操作数d1的各位与CF联合在一起,构成9个或者 17个二进制位,向左移动d2位,从左端移出的各位再依次移 到右端空出的位上。 从功能上说,可以把d1的各位与CF一起,看作首尾相接 的一个环状,如图7.5所示,把各位按逆时针方向旋转d2格, 再从环原先的连接部断开,可以得到ROL指令执行后的结果, 包括CF的设置情况。
(3)移动后的值是把d1中的原值作为无符号数,除以的商。 位号:15/7 14/6 …… 操作数d1 1 0
CF
图7.2 逻辑右移指令SHR的功能
7.1.4 算术右移 【指令格式】SAR d1, d2 【功能】把操作数d1 的各个二进制位依次向右移动d2 位, 移动造成左边的空位填d1原值的最高位,结果放回操作d1 中。 【说明】SAR指令的功能基本上与SHR的一样,仅仅是移 动造成的空位填充方式不同,如果操作数d1移动前最高位是1, 则移动造成的空位以1填充,否则以0填充,如图7.3所示。 SAR指令执行的结果是把d1中的原值作为带符号数,除以并 把除法的商放回d1中。
……
14/6
1
15/7 CF
0
图7.4 循环左移指令ROL的功能
7.1.6 循环右移
【指令格式】ROR d1, d2 【功能】把操作数d1 的各个二进制位向右移动d2 位,从 右端移出的各位再依次移到d1右端空出的位上,最后移出 的一位还要送到CF中。 ROR是循环右移指令,与ROL指令相比,只是移位的 方向不同,把图7.4中的移动方向改为顺时针方向,从第0 位上最后一次移出的位送到CF中,就是ROR指令的功能。