资源描述
12加加 法法减减 法法SUB减法减法SBB带借位的减法带借位的减法DEC减量减量NEG取负取负CMP比较比较AAS减法的减法的ASCII调整调整DIV无符号数除法无符号数除法DAS减法的十进制调整减法的十进制调整IDIV整数除法整数除法乘乘 法法AAD除法的除法的ASCII调整调整MUL无符号数乘法无符号数乘法CBW把字节转换成字把字节转换成字IMUL整数乘法整数乘法CWD把字转换成双字把字转换成双字AAM乘法的乘法的ASCII调整调整3456067502010378逻辑运算逻辑运算循环移位循环移位循环左移循环左移循环右移循环右移通过进位的循环左移通过进位的循环左移通过进位的循环右移通过进位的循环右移91逻辑运算指令逻辑运算指令(Logical Operations) NOT取反指令取反指令(Logical Not)指令格式:指令格式:NOT 目的目的指令功能:指令功能:目的目的 目的取反目的取反操作数要求:操作数要求: 可以是可以是8位或位或16位寄存器、存储器。位寄存器、存储器。 对于存储器操作,需指明是字还是字节。对于存储器操作,需指明是字还是字节。 注意注意:指令执行后,:指令执行后,对标志位无影响。对标志位无影响。 例例 NOT AX;AX AX取反取反 NOT BL;BL BL取反取反 NOT BYTE PTRBX;对存储单元字节内容取反后送回该单元;对存储单元字节内容取反后送回该单元10 AND逻辑与指令(Logical AND)指令格式:AND 目的,源指令功能:目的目的源主要用于使操作数的某些位保留(和“1”相与),而使某些位清除(和“0”相与)。 OR逻辑或指令(Logical OR)指令格式:OR 目的,源指令功能:目的目的源 主要用于使操作数的某些位保留(和“0”相或),而使某些位置位(和“1”相或)。 例 MOV AX, 3538H AND AX, 0F0FH ; AX 0508H OR AX,3030H;AX 3538H11 XOR异或操作指令异或操作指令(Exclusive OR)指令格式:指令格式:XOR 目的,源目的,源指令功能:指令功能:目的目的目的目的源源主要主要用于使操作数的某些位保留用于使操作数的某些位保留(和(和“0”相异或),而使相异或),而使某些位取反某些位取反(和(和“1”相异或)相异或) TEST测试指令测试指令(Test)指令格式:指令格式:TEST 目的,源目的,源指令功能:指令功能:目的目的源源逻辑与操作,并修改标志位,但不回送结果,两个操作数都不变。逻辑与操作,并修改标志位,但不回送结果,两个操作数都不变。 常用于在要检测某些条件是否满足,但又不希望改变原有操作数的常用于在要检测某些条件是否满足,但又不希望改变原有操作数的 情况下。紧跟在这条指令后面的往往是一条条件转移指令,根据测情况下。紧跟在这条指令后面的往往是一条条件转移指令,根据测 试结果产生分支,转向不同的处理程序。试结果产生分支,转向不同的处理程序。 12对对AND 、 OR 、XOR和和TEST指令的说明:指令的说明: 源操作数可以是源操作数可以是8位或位或16位立即数、寄存器、存储器;位立即数、寄存器、存储器; 目的操作数只能是寄存器、存储器,两操作数不能同时为存储器;目的操作数只能是寄存器、存储器,两操作数不能同时为存储器; 指令执行后,均将指令执行后,均将CF和和OF清零清零,ZF、SF和和 PF反映操作结果,反映操作结果,AF未定未定义。义。例例 设设AL寄存器中存有报警标志。若寄存器中存有报警标志。若D71,表示温度报警,程序要转到温,表示温度报警,程序要转到温度报警处理程序度报警处理程序T_ ALARM;D61,则转压力报警程序,则转压力报警程序P_ALARM。用。用TEST指令来实现这种功能。指令来实现这种功能。 解:解: TEST AL, 80H; 查查AL的的D71? JNZ T_ALARM; 是是1(非零非零),则转温度报警程序,则转温度报警程序 TEST AL, 40H ; D70,D61? JNZ P_ALARM; 是是1,转压力报警,转压力报警 (其中:(其中:JNZ为条件转移指令,表示结果非为条件转移指令,表示结果非0 (ZF1)则转移)则转移)132算术逻辑移位指令(Shift Arithmetic and Shift Logical) 这类指令可对寄存器、存储器中的字或字节的各位进行算术移位或逻辑移位,移位的次数由指令中的计数值决定。 移位指令的操作示意图如下:14 SAL算术左移指令算术左移指令(Shift Arithmetic Left) 指令格式:指令格式:SAL 目的,计数值目的,计数值 SHL逻辑左移指令逻辑左移指令(Shift Logic Left)指令格式:指令格式:SHL 目的,计数值目的,计数值指令功能:指令功能:以上两条指令的功能完全相同,均将寄存器或存储器中的以上两条指令的功能完全相同,均将寄存器或存储器中的目的操作数目的操作数的各位的各位左移左移,每移一次,最低有效位,每移一次,最低有效位LSB补补0,而最高有效位而最高有效位MSB进入标志进入标志位位CF。例例 MOV AH,06H;AH=06H SAL AH,1;将;将AH的内容左移的内容左移1次,次,AH=0CH MOV CL,03H SHL DI,CL;将;将DI的内容左移的内容左移3次次 SAL BYTE PTRBX ;将内存单元的字节左移;将内存单元的字节左移1位位15注意:注意:移动一次,相当于将移动一次,相当于将目的操作数目的操作数乘以乘以2;计数值就是所要移位的次数。计数值就是所要移位的次数。若移位一次,直接将计数值置若移位一次,直接将计数值置l;移位次数大于移位次数大于1,将移位次数送进,将移位次数送进CL,再把,再把CL放在计数值位置上。放在计数值位置上。对标志位的影响对标志位的影响:移位次数为移位次数为1时,若移位后最高位的值被改变,时,若移位后最高位的值被改变,OF置置1,否则,否则OF清清0。多次移位时,多次移位时,OF的值不确定。的值不确定。不论移多少次,不论移多少次,CF总是等于目的操作数总是等于目的操作数最后被移出去的值最后被移出去的值。SF和和 ZF 将根将根据指令执行后目的操作数的状态来决定,据指令执行后目的操作数的状态来决定,PF只有当目的操作数在只有当目的操作数在AL中时才中时才有效,有效,AF不定不定。16 逻辑右移指令逻辑右移指令(Shift Logic Right)指令格式:指令格式:SHR 目的,计数值目的,计数值指令功能:指令功能:各位进行右移各位进行右移。每移一次,。每移一次,低位进入低位进入CF,最高位补最高位补0。 注意:注意:若目的操作数为若目的操作数为无符号数无符号数,每,每右移一次右移一次,目的操作数,目的操作数除以除以2,余数被丢掉。余数被丢掉。例例 用右移的方法作除法用右移的方法作除法1338165。 解:解: MOV AL,1000 0101B;AL133 MOV CL,03H ;CL移位次数移位次数 SHR AL,CL;右移;右移3次次 结果:结果:指令执行后,指令执行后,AL10H16,余数余数5被丢失被丢失。标志位标志位CF、AF不定。不定。 17 SAR算术右移指令(Shift Arithmetic Right)指令格式:SAR 目的,计数值指令功能:各位右移。每移位一次,最低位进入CF,但最高位(即符号位)保持不变。注意:每移一次,相当于对带符号数进行除2操作。例 用SAR指令计算128816。 解: MOV AL,1000 0000B ; AL128 MOV CL,03H ; 右移次数3 SAR AL,CL ; 算术右移3次后,AL11110000B 0F0H16 11110000B 原码为:10010000B181920212223指令名称指令名称字节字节/字操作字操作字节操作字节操作字操作字操作字符串传送字符串传送字符串比较字符串比较字符串扫描字符串扫描字符串装入字符串装入字符串存储字符串存储MOVS 目的串,源串目的串,源串CMPS 目的串,源串目的串,源串SCAS 目的串目的串LODS 源串源串STOS 目的串目的串MOVSCMPSSCASLODSSTOSMOVSWCMPSWSCASWLODSWSTOSW说明:说明:每种指令都有每种指令都有3种格式种格式。有两种方法用以说明是有两种方法用以说明是字节操作还是字操作。字节操作还是字操作。方法一:方法一:用指令中的源串和目的用指令中的源串和目的串名串名(即操作数即操作数)来来表明表明是字节还是字;是字节还是字;方法二方法二:在指令助记符后在指令助记符后加加B说明是字节,说明是字节,加加W说明是字操作。说明是字操作。24关于隐合约定:关于隐合约定: 源串源串:起始地址:起始地址(或末地址或末地址)为为DS:SI。源串允许源串允许使用使用段超越前缀来修段超越前缀来修 改段地址改段地址。目的串目的串:起始地址:起始地址(或末地址或末地址)为为ES:DI。目的串不允许目的串不允许使用使用段超越前缀修段超越前缀修改改ES。如果要在同一段内进行串运算,必须使。如果要在同一段内进行串运算,必须使DS和和ES指向同一段。指向同一段。指针指针:每执行一次字符串指令,:每执行一次字符串指令,指针指针SI和和DI会会自动修改自动修改,以指向下一个待,以指向下一个待操作单元。操作单元。DF标志:控制字符串处理的方向。标志:控制字符串处理的方向。 DF0为递增方向。为递增方向。DS:SI指向源串首地址,每执行一次串操作:指向源串首地址,每执行一次串操作:字节串操作时,字节串操作时,SI、DI分别增分别增1;字串操作时,;字串操作时,SI和和DI分别增分别增2; DF1为递减方向。为递减方向。DS:SI指向源串末地址,每执行一次串操作:指向源串末地址,每执行一次串操作:字节串操作时减字节串操作时减1;字串操作时减;字串操作时减2。 STD使使DF置置1,CLD将将DF清清0。串长度:串长度:要处理的要处理的字符串长度字符串长度(字节或字数字节或字数)放放在在CX寄存器中。寄存器中。25 关于重复前缀:关于重复前缀:功能:功能:在基本指令前加重复前缀,可在基本指令前加重复前缀,可加快加快串运算指令的串运算指令的执行速度执行速度。每重复执行。每重复执行一次,地址一次,地址指针指针SI和和DI按方向标志按方向标志自动修改自动修改,CX的值的值自动减自动减1。类型与格式:类型与格式: REP:无条件重复无条件重复(Repeat),常与,常与 (MOVS)连用连用,连续传送字符串。,连续传送字符串。直直 到到传送完毕,即传送完毕,即CX0为止为止。 REPE/REPZ:相等相等/结果为零则重复结果为零则重复(Repeat while Equal/Zero),常与,常与 (CMPS)连用连用,连续比较字符串。当两个字符串相等,连续比较字符串。当两个字符串相等(ZF1)和和CX0时,则时,则重复进行比较,重复进行比较,直到直到ZF0或或CX0为止为止。( 比较不同点)比较不同点) REPNE/REPNZ :不相等不相等/结果非零则重复结果非零则重复Repeat while Not Equal/Not Zero),常与常与 (SCAS)连用连用,当结果非,当结果非0(ZF0)和和CX0时,重复进行扫描,直时,重复进行扫描,直到到ZF1或或CX0为止。为止。(找关键字)(找关键字) 带有重复前缀的串指令执行过程中允许有中断进入带有重复前缀的串指令执行过程中允许有中断进入。26指令格式:指令格式:MOVS 目的串,源串目的串,源串指令功能:指令功能:SI作指针的源串中的一个字节或字作指针的源串中的一个字节或字DI作指针的目的串;自动作指针的目的串;自动修改指针修改指针SI和和DI。应用:应用:解决解决MOV指令不能直接在指令不能直接在存储单元间进行数据传送存储单元间进行数据传送的问题。的问题。若使用若使用重复前缀重复前缀,还可以利用一条指令,还可以利用一条指令传送一批数据传送一批数据。例例 要求把数据段中以要求把数据段中以SRC_MESS为偏移地址的一串字符为偏移地址的一串字符“HELLO!”,传送到附加段中以,传送到附加段中以NEW_LOC开始的单元中。开始的单元中。27 DATA SEGMENT;数据段;数据段 SRC_MESS DB HELLO!;源串;源串 DATA ENDS ; EXTRA SEGMENT;附加段;附加段 NEW_LOC DB 6 DUP(?) ;存放目的串;存放目的串 EXTRA ENDS ; CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:EXTRA START: MOV AX,DATA MOV DS,AX ;DS数据段段址数据段段址 28MOV AX,EXTRA MOV ES,AX;ES附加段段址附加段段址LEA SI,SRC_MESS;SI指向源串偏移地址指向源串偏移地址LEA DI,NEW_LOC;DI指向目的串偏移地址指向目的串偏移地址MOV CX,6;CX作串长度计数器作串长度计数器 CLD;清方向标志,地址增量;清方向标志,地址增量REP MOVSB ;重复传送串中各字节,直到;重复传送串中各字节,直到CX=0 其中其中“REP MOVSB”指令可用以下几条指令代替:指令可用以下几条指令代替: AGAIN: MOVS NEW_LOC, SRC_MESS DEC CX JNZ AGAIN 292CMPS字符串比较指令字符串比较指令(Compare Sting)指令格式:指令格式:CMPS 目的串,源串目的串,源串指令功能:指令功能:SI作指针的源串作指针的源串减去减去DI作指针的目的串数据,作指针的目的串数据,结果结果反映在反映在标志位标志位上上;两个数据串的;两个数据串的原始值不变原始值不变;源串和目的串;源串和目的串指针自动修改指针自动修改,指向下一对待,指向下一对待比较的串。比较的串。 加重复前缀:加重复前缀: REPE/REPZ CMPS ;直至;直至CX0(比完了比完了)或或ZF0(两串不相等两串不相等)时时停止停止操作。操作。 REPNE/REPNZ CMP;直至;直至CX0(比完了比完了)或或ZF1(两串相等两串相等)时时停停止止比较。比较。例例 比较两个字符串,一个是程序中设定的口令串比较两个字符串,一个是程序中设定的口令串PASSWORD,另一个是,另一个是从键盘输入的字符串从键盘输入的字符串IN_WORD,若输入串与口令串相同,程序将开始执行。,若输入串与口令串相同,程序将开始执行。否则,程序驱动否则,程序驱动PC机的扬声器发声,警告用户口令不符,拒绝往下执行。机的扬声器发声,警告用户口令不符,拒绝往下执行。 这可以用这可以用CMPS指令来实现,有关程序段如下:指令来实现,有关程序段如下:30DATASEGMENT;数据段数据段PASSWORDDB750424LI;口令串口令串IN_WORDDB750424LE;从键盘输入的串从键盘输入的串COUNTEQU8;串长度串长度DATAENDSCODESEGMENT;代码段代码段LEASI, PASSWORD;源串指针源串指针LEADI, IN_WORD;目的串指针目的串指针MOV CX, COUNT;串长度串长度CLD;地址增量地址增量31REPZ CMPSB;CX0且串相等时重复比较且串相等时重复比较JNESOUND;若不相等,转发声程序若不相等,转发声程序OK:;比完且相等,往下执行比完且相等,往下执行SOUND: ;使使PC机扬声器发声机扬声器发声;并退出并退出CODEENDS323. SCAS3. SCAS字符串扫描指令字符串扫描指令( (Scan String) ) 指令格式指令格式:SCAS 目的串目的串指令功能指令功能:AL/AX(字节字节/字操作字操作)内容内容减去减去ES:DI中的串元素,中的串元素,结果反映在标志位上结果反映在标志位上,源操作数不变源操作数不变,操作后目的串,操作后目的串指针会指针会自动修改自动修改,指向下一个待搜索的串元素。,指向下一个待搜索的串元素。应用:应用: 利用利用SCAS指令,可在内存中指令,可在内存中搜索关键字搜索关键字。指令执行前,。指令执行前,必须事先将关键字存在必须事先将关键字存在AL(字节字节)或或AX(字字)中,才能用中,才能用SCAS指令进行搜索。指令进行搜索。 SCAS指令指令可以加重复前缀可以加重复前缀。33 例例 在某一字符串中搜寻是否有字符在某一字符串中搜寻是否有字符A,若有,则把搜索次数记下来,送到,若有,则把搜索次数记下来,送到BX寄存器中,若没有查到,则将寄存器中,若没有查到,则将BX寄存器清寄存器清0。设字符串起始地址。设字符串起始地址STRING的的偏移地址为偏移地址为0,字符串长度为,字符串长度为CX。解:解: MOV DI,OFFSET STRING;DI字符串偏移地址字符串偏移地址 MOV CX,COUNT;CX字符串长度字符串长度 MOV AL,A;AL关键字关键字A的的A5CII码码 CLD;清标志方向;清标志方向 REPNE SCASB ;CX0(没查完)和(没查完)和ZF=0(不相等)时重复(不相等)时重复 JZ FIND;若;若ZF=1,表示已搜到,转出,表示已搜到,转出 MOV DI,0;若;若ZF=0,表示没搜到,表示没搜到,DI 0FIND:MOV BX,DI;BX搜索次数搜索次数 HLT说明:说明:DI初值存起始地址初值存起始地址偏移量偏移量0,搜索一次后,搜索一次后,DI自动加自动加1,使,使DI的值等于的值等于1;每执行一次搜索操作,每执行一次搜索操作,DI自动增自动增1;因此可用因此可用DI的值表示的值表示搜索次数搜索次数。344LODS数据串装入指令数据串装入指令(Load String)指令格式:指令格式:LODS 源串源串指令功能:指令功能:DS:SI中的串元素中的串元素 AL/AX(字节字节/字操作字操作)中,中,修改修改SI,以指向串,以指向串中的下一个元素,修改量中的下一个元素,修改量遵守隐含约定。遵守隐含约定。 注:注:该指令加该指令加重复前缀意义不大重复前缀意义不大,因为重复传送只能保留最后写入的数据。,因为重复传送只能保留最后写入的数据。 5STOS数据串存储指令数据串存储指令(Store string)指令格式:指令格式:STOS 目的串目的串指令功能:指令功能:AL/AX(字节字节/字操作字操作)的一个字节或字的一个字节或字ES:DI所指的目的串所指的目的串; 修改修改DI,以指向串中的下一个单元。,以指向串中的下一个单元。关于重复前缀关于重复前缀:“REP STOS” ,可用累加器中的常数,对,可用累加器中的常数,对数据串初始化数据串初始化。如初始化为全如初始化为全0串串35把数据块作为数据串处理:把数据块作为数据串处理: 用用SI作源串指针;作源串指针; DI和和BX分别作正、负数目的缓冲区的指针分别作正、负数目的缓冲区的指针; CX用于控制循环次数。用于控制循环次数。 技巧:技巧: 使用使用STOSB指令必须以指令必须以SI为源指针,为源指针,DI为目的指针;为目的指针; 负数区的目的指针在负数区的目的指针在BX中,中,要用要用XCHG指令指令将将BX内容送进内容送进DI,让,让DI指向指向负数区,同时也把负数区,同时也把DI中的正数区目的指针保护了起来;中的正数区目的指针保护了起来; 执行执行STOSB指令后,再用指令后,再用XCHG指令指令交换回来,以便下次重复执行时(交换回来,以便下次重复执行时(转回转回GOON标号后),标号后),LODS指令仍能正确执行。指令仍能正确执行。 写出如下程序段:写出如下程序段:例例 若在数据段中有一个数据块,起始地址为若在数据段中有一个数据块,起始地址为BLOCK,数据块中的数为,数据块中的数为8位带位带符号数,要求将其中所含的正、负数分开,然后把正数送到符号数,要求将其中所含的正、负数分开,然后把正数送到附加段附加段中始址为中始址为PLUSDATA的缓冲区,负数则送到的缓冲区,负数则送到附加段附加段中始址为中始址为MINUS DATA的缓冲区。的缓冲区。36START: MOVSI, OFFSET BLOCK;SI为源串指针为源串指针MOVDI, OFFSET PLUS_DATA;DI为正数目的区指针为正数目的区指针MOVBX, OFFSET MINUS_DATA;BX为负数目的区指针为负数目的区指针MOVCX, COUNT;CX放循环次数放循环次数CLDGOON: LODSBLOCK;AL源操作数的一个字节源操作数的一个字节TESTAL, 80H ;是负数?是负数?JNZMINUS;是,转是,转MINUSSTOSB;非负数,将字节送正数区非负数,将字节送正数区JMPAGAIN;处理下一个字节处理下一个字节MINUS: XCHGBX, DI;交换正负数指针交换正负数指针STOSB;负数送入负数区负数送入负数区XCHGBX, DI;恢复正负数指针恢复正负数指针AGAIN: DECCX;次数减次数减1JNZGOON;未处理完,继续传送未处理完,继续传送HLT;停机停机20:1137
展开阅读全文