第三章程序设计的基本技术 同高级语言一样,汇编语言程序的基本结构 有:顺序程序,分支程序,循环程序。 解题的基本步骤也基本相同
第三章 程序设计的基本技术 同高级语言一样,汇编语言程序的基本结构 有:顺序程序,分支程序,循环程序。 解题的基本步骤也基本相同
§31顺序程序设计 以直线方式一条指令接着一条指令顺序执 行。常用的算术运算大多可用顺序程序来解决。 所以先介绍乘除指令与十进制运算指令 乘除指令 对加减运算,带符号数和不带符号数运算 指令相同(只要字节够);对于无符号,关心 CF,可知结果正确与否;对带符号数,关心 OFSF可知结果正确与否,且知正负。但乘除 运算则不行,为此8088提供了带符号与不带 符号的乘除指令
§3.1 顺序程序设计 以直线方式一条指令接着一条指令顺序执 行。常用的算术运算大多可用顺序程序来解决。 所以先介绍乘除指令与十进制运算指令。 一 . 乘除指令 对加减运算,带符号数和不带符号数运算 指令相同(只要字节够);对于无符号,关心 CF,可知结果正确与否;对带符号数,关心 OF,SF 可知结果正确与否,且知正负。但乘除 运算则不行,为此8088提供了带符号与不带 符号的乘除指令
1.无符号数乘法( MULtiply) 格式: MUL SRC 2.带符号数乘法( Signed Integer MULtiply 格式: IMUL SRO 操作:字节运算L*(SRC)→AX 字运算AX*(SRC)→DX:AX 有一个操作数隐含,即被乘数和乘积都在 规定的寄存器中,源操作数只能是寄存器或 存储器,且类型明确,不能为立即数 当CF=OF=1时,不表示进位和溢出,而 表示乘积已不是8位或16位,即高位为有效
1. 无符号数乘法(MULtiply) 格式:MUL SRC 2. 带符号数乘法(Signed Integer MULtiply) 格式: IMUL SRC 操作: 字节运算 AL * (SRC) →AX 字运算 AX * (SRC) →DX:AX 有一个操作数隐含,即被乘数和乘积都在 规定的寄存器中,源操作数只能是寄存器或 存储器,且类型明确,不能为立即数. 当 CF=OF=1 时,不表示进位和溢出,而 表示乘积已不是8位或16位,即高位为有效 位
例。 IMUL BX;AX大BX→DX:AX MUL25× IMUL [SI X IMUL BYTE PTR [SI: AL X(ISID-AX 两指令的操作相同,只是操作数是否带符号, 但对同一操作数进行操作,结果不一致。∵应视 操作对象,正确选择指令
例 . IMUL BX ; AX*BX→DX:AX MUL 25 ╳ IMUL [SI] ╳ IMUL BYTE PTR [SI] ; AL*([SI]) →AX 两指令的操作相同,只是操作数是否带符号, 但对同一操作数进行操作,结果不一致。∴应视 操作对象 ,正确选择指令
例1, MOV AL,0B4H;视做带符号数→-76 MoBL,11H;视做带符号数→17 IMUL BL ;AX=-76*17=-1292=0FAF4H←补码 ;CF=OF=1表示AH内容为有效位 例2. MOV AL,0B4H;视B4H为无符号→180 MOV BL,11H,视11为无符号数→17 MUL BL AX=180*17=3060=0BF4H
例1 . MOV AL , 0B4H ; 视做带符号数→ ﹣76 MOV BL , 11H ; 视做带符号数→ 17 IMUL BL ;AX=﹣76*17=﹣1292=0FAF4H 补码 ;CF=OF=1 表示AH内容为有效位 例2. MOV AL , 0B4H ; 视B4H为无符号→180 MOV BL , 11H ; 视11H为无符号数 →17 MUL BL ; ; AX=180*17=3060=0BF4H
实际上,对带符号数进行运算,可理解 (内部过程),先对数求其绝对值,再进行二进 制乘,再求补,得其补码结果。对无符号数乘贝 直接进行二进制运算 无符号数的乘法指令可用于多倍精度的乘法 操作(由乘移位,加实现)。多倍精度的负数乘 则只能将它们的绝对值用无符号乘法实现后,再 求补。 事实上,∴乘积的字长相对操作数来说总是加 倍的 乘法不会产生溢出
实际上,对带符号数进行运算,可理解 (内部过程),先对数求其绝对值,再进行二进 制乘,再求补,得其补码结果。对无符号数乘则 直接进行二进制运算。 无符号数的乘法指令可用于多倍精度的乘法 操作(由乘移位,加实现)。多倍精度的负数乘, 则只能将它们的绝对值用无符号乘法实现后,再 求补。 事实上,∵乘积的字长相对操作数来说总是加 倍的 ∴乘法不会产生溢出
例、将AX中的3位BCD数转换为二进制数→SB。 N2大102+N1大10+No=(N2大10+N1)大10+No SB DB MOV AX0125H MOV CH,10 MOV CL 4 MOV SB,AL→暂存 MOV ALAH D2大10→AL MUL CH MOV AHSB SHR AHCL D2大10+D1→AL ADD ALAH MUL CH →(D*10+D1)大10→>AL AND SB, OFH ADD SB.AL (D2*10+D1)大10+D→SB=7DH
例、将AX中的3位BCD数转换为二进制数→SB。 N2*102+N1*10+N0=(N2*10+N1)*10+N0 SB DB ? MOV AX,0125H M0V CH,10 MOV CL,4 MOV SB,AL →暂存 MOV AL,AH MUL CH MOV AH,SB SHR AH,CL ADD AL,AH MUL CH →(D2*10+D1)*10→AL AND SB,0FH ADD SB,AL D2*10→AL D2*10+D1→AL (D2*10+D1)*10+D0→SB=7DH
●对同一操作数进行两种运算结果不同。 除法运算可能产生溢出,但OF标志不能 标志这种溢出(除法对状态标志未定义) 而由溢出中断来指示,若溢出,则立即停 止程序的执行
• 对同一操作数进行两种运算结果不同。 除法运算可能产生溢出,但OF标志不能 标志这种溢出(除法对状态标志未定义), 而由溢出中断来指示,若溢出,则立即停 止程序的执行
例计算无符号数OF252H÷:20H MOV AX 0F252H 产生溢出, MOV BL, 20H 商>255, DIV BL AL存放不下 MOV AX, 0F252H MOV DX, 0 ;无符号数扩展,高位直接送0即可 MO∨BX,20H DIV BX 应使用字运算才正确
MOV AX , 0F252H MOV BL,20H DIV BL MOV AX,0F252H MOV DX,0 ;无符号数扩展,高位直接送0即可。 MOV BX , 20H ; DIV BX ; 应使用字运算才正确 例.计算无符号数 0F252H÷20H 产生溢出, ∵商﹥255, AL存放不下