汇编语言指令及几个例题
• 3.DR1 DB 10H,30H • DR2 DW 10H DUP(0,2,DUP(2)) • .......... • MOV BL LENGTH DRI • MOV CL LENGTH DR2 • 执行该指令后BL=1,CL=10H
• 4.设AL,BL,CL中的内容均为76H • XOR AL,0FH//将AL低四位取反,高四位 不变AL=79H • AND BL,0FH //将BL高四位清零低四位不 变BL=06H • OR CL,0FH //将CL低四位置一,高四位不 变得到CL=7FH • 所以上述指令执行后AL=79H,BL=06H, CL=7FH
• • • • •
MOV AL,25 MOV BL,20 MUL BL 除法也是如此。 带符号数乘除法方法是一样,只是要考虑符号而已。例如 教材71页第10题:设(AL)=96H,(BL)=12H,分别 执行MUL BL和IMUL BL指令后AX的值? • 对于无符号数乘法只需先将96H和12H换成十进制然 后相乘即可。96H=150,12H=18。二者的积为2700用16 进制表示为0A8CH。如果是有符号数乘法那么98H代表 的就不是150。96H的二进制表示为10010110B因为符号 位是1所以是负数而负数的表示为其补码(负数的补码:符 号位不变,按位取反,末尾加一)所以要得到96H真正表 示的负数。步骤如下:第一步:符号位不变,末尾减一得 到10010101B • 第二步:符号位不变,按位取反得到11101010B所以 96H代表的数是 • -106。所以乘积为-1908表示为0F8CH。
汇编语言常用指令总结
1· 数据传送指令
一.通用数据传送指令 1.MOV
对于MOV指令来说需要注意一下几点: a:立即数不能作为目的操作数。例如: MOV 5 ,BX b:立即数不能送段寄存器(ES(附加段),SS(堆栈 段),DS(数据段),CS(代码段)) 例如:MOV ES,1234H c:目标寄存器不能为CS(因为在汇编语言中代码段是默认的 如P91页的此类程序)例如:MOV CS,BX d:两个段寄存器之间不能直接传送 例如:MOV ES,DS
• e:两个存储器操作数之间不能直接传送 • 例如MOV [AX],[BX] • f:在传送过程中要注意长度匹配 • 例如:MOV BL,AX • MOV CX,BL 二.堆栈操作指令 • a. 进栈指令PUSH • PUSH后的源操作数只能是16位的寄存器或存储器操作数。 例如: • PUSH AX • PUSH AL • PUSH [BX] •
• • • • • • • • • • • • •
d:类型转换指令(略) 三. 二进制指令 a:加法指令ADD ,带进位加法指令ADC。 ADD DST,SRC实现DST=DST+SRC ADC DST,SRC实现DST=DST+SRC+CF 减法指令SUB, 带进位减法指令SBB。 SUB DST,SRC实现DST=DST-SRC SBB DST,SRC实现DST=DST-SRC-CF 要特别注意的是源操作数和目的操作数的长度必须得匹配, 如ADD BX,AX 而ADD BL,AX 是错误的。其次段寄存器不能参加算术运算如: ADD ES,BX. b:INC,DEC,NEG等指令其中尤其注意NEG指令 NEG BX实现的是0-BX=BX
• 循环移位指令(略) 至于第二章中其他指令基本没有什么特别注意的地方,只 需按照书上的介绍使用就行了。
• • • • •
例题选讲: 1.设(SP)=100H,(AX)=0FFFFH STC //置CF=1 PUSH AX //将AX压入堆栈,SP=SP-2 ADC AX,0 //AX=AX+0+CF(CF=1) PUSH BX // 将BX压入堆栈,SP=SP-2 • POP BX //将SP所指向的内容弹出送到 BX中,SP=SP+2 • 上述程序执行后BX=0;SP=0FEH
• • • • • • • • • • •
•
Байду номын сангаас
POP AX POP BX 最后AX=9ABCH,BX=5678,SP=1FFEH c:地址传送指令LEA LEA REG,SRC 其中源操作数只能是存储器操作数即[?]型.例如: LEA BX,[BX] 这种指令主要在变成题较广: 例如:DATA SEGMENT DATA DW 10 DUP(?) DATA ENDS 这是一个定义了一个以DATA为首地址的10个字(20个字) 型的空间
• 5.写一段代码判断AL中的数是否为偶数, 若为偶数则执行AAA,否则执行BBB • 代码如下: • TEST AL,01H • JZ AAA • BBB
• • • • • • • •
6.假设数据段定义如下: DA1 DW 'C','D' DA2 DB 18 DUP(?) DA3 DW $-DA2 ....... MOV BX,DA3 MOV AX,DA1 执行上述指令后,BX=12H,AX=0043H (C的ASICII码)
• 8.期末考试编程题第一题; • 判断一个16进制数AX的二进制表示有多少 个1,若个数为偶数则置CF=1,否则CF=0; • ........ • MOV CX,15 MOV BX, 01H MOV BL, 0 LOOP:TEST AX,BX • JNZ • INC BL •
SAL BX,1 JMP LOOP TEST BL,01 JZ JMP NEXT STC NEXT:CLC ............
•
•
• •
• • • • • •
其中第二个是错误的,注意BX在这里代表的的是一个 地址[BX]代表的事这个地址中所存储的数。所以第三个指 令是将[BX]中的数压入堆栈,其中这个指令存在歧义。在 这里默认了[BX]是16位的。 指令在执行过程中时先将指针SP-2(即修改栈顶指针) 再将源操作数压入栈顶 b:出栈指令POP POP的源操作数要注意额地方和PUSH一样但是要特 别注意的是POP CS这条指令时错误的。 综合这两条指令在考题中以这种题型出现: 例如:AX=1234H, BX=5678H,CX=9ABCH,SP=2000H。 问执行下列指令后AX,BX中的值和SP=? PUSH AX PUSH BX PUSH CX
• 基本移位指令SHL,SAL,SHR,SAR • 基本格式SHL(SAL,SHR,SAR) DST,CNT • 注意当CNT=1时,可直接写1。如果CNT大于1,那么必 须用计数器CX表示移的位数。 • 如逻辑左移1位SHL AX,1。 • 逻辑右移4位正确指令为 • MOV CX,4 • SHR AX,CX • 需要特别注意的是逻辑左移SHL和算术左移SAL是没 有区别的。但是SAR和SHR有很大区别。这个却别主要体 现在最高位。例如将10001000B逻辑右移一位得到 01000100B • 但是将其算术右移一位得到11000100B,也就是说在 逻辑右移过程中移入位为0,而算术右移过程中移入位与 最高位相同
谢谢观赏! 祝大家新年快乐!
• 7.已知 • AX=0A33AH,DX=0F0F0H • AND AH,DL //AH =A3H,DL=F0H功能AH 高四位不变,低四位清零得到AH=A0H • XOR AL,DH //AL=3AH=00111010B,DH=F0H.高四位 取反,低四位不变AL=CFH=11001010B • NEG AH //AH=0-AH= • 0-10100000=01100000B • NOT AL //AL 按位取反AL=00110101B • 上述指令执行后AH=60H,AL=35H.
• 2.分析下面程序段 • MOV AL,200 //AL=200,二进制表示为 11001000B • SAR AL,1 //AL=11100100B=E4H • MOV BL,AL //BL=Al=E4H • MOV CL,2 //CL=2 • SAR AL,CL //AL=11111001B • ADD AL,BL //AL=11111001B+11100100B=1101110 1 • 注意在此处产生了溢出真实值为 111011101B但是AL只能装8位所以 AL=11011101B=0DDH • 执行该程序后BL=0E4H,AL=0DDH
• • • • • •
位操作指令 NOT指令(按位取反) AND指令 XOR指令 OR指令 TEST指令 其中AND指令主要用于对某位清零。如清零AL中的高 四位,低四位保持不变。正确指令为AND AL,0FH XOR指令主要用于将某位变反(与1异或),与0异或 保持不变;如将AL的高四位取反,低四位不变。正确的 指令为XOR AL,F0H。 OR指令主要用于将某位置一。如将AL中高四位置一, 低四位不变。正确指令为OR AL,F0H TEST指令主要用于检测某位是否为1。 如TEST AL,01H如果AL是奇数那么ZF=0
• 通过LEA AX,DATA • MOV DS,AX • 就可以将DATA的地址传送到DS的段基址中 • 同时,可以用SEG来获得起始地址,用OFFSET来获取偏 移地址。例如: • MOV SI,OFFSET DI • MOV BX,SEG DATA
• c:二进制乘除法指令 • 无符号乘法指令MUL,无符号除法指令DIV • 如果是字节型乘法(一个字节等于8位,如AL,BL等)那 么乘积放在AX中;如果是字型(一个字为两个字节)乘 法那么乘积在DS:AX中 • 无符号除法是如果是字节型除法那么商在AL中,余 数在AH中;如果是字型除法那么商在AX中,余数在DX中; • 特别注意的是,乘除法指令不能直接与立即数想乘除。 例如要实现25乘以20的无符号乘法功能 • MOV AL,25 • MOV 20 • 上面的第二条指令时错误的。正确的语句应该是: