第九章 顺序程序设计
1,算术运算指令
2,位运算指令
3,输入 /输出系统功能调用
4,简单程序设计举例第 1节,算术运算指令
1.加法指令
1)不带进位加法指令 ADD
格式,ADDOPD,OPS
执行的操作,OPD + OPS → OPD
例如,ADD EAX,EBX; EAX+ EBX→ EAX
若指令执行前 CF=0,EAX=00000054H,
EBX=00120330H。
则指令执行后 EAX=00120384H,CF=0。
2)带进位加法指令 ADC
格式,ADC OPD,OPS
执行的操作,OPD十 OPS+ CF→ OPD
其中 CF为进位位的值。
例如,ADCAX,DX; AX+ DX→ AX
若指令执行前 CF=1,AX=1234H,
DX=0112H。
则指令执行后 EAX=1347H,CF=0。
3)增量指令 INC
格式,INCOPD
执行的操作,OPD + 1→ OPD
例如,INC DX; DX+ 1→ DX
若指令执行前 CF=1,DX=3562H。
则指令执行后 DX=3563H,CF=1。
2,减法指令
1)不带借位减法指令 SUB
格式,SUBOPD,OPS
执行的操作,OPD- OPS → OPD
例如,SUB AX,DX; AX- DX→ AX
若指令执行前 CF=1,AX=1234H,
DX=0100H。
则指令执行后 AX=1134H,CF=0。
2)带借位减法指令 SBB
格式,SBBOPD,OPS
执行的操作,OPD – OPS-CF→ OPD
其中 CF为进位位的值。
例如,SBBAX,DX
若指令执行前 CF=1,AX=1234H,
DX=0100H。
则指令执行后 AX=1133H,CF=0。
3)减量指令 DEC
格式,DECOPD
执行的操作,OPD 一 1→ OPD
例如,DECCX;CX- 1→ AX
若指令执行前 CF=0,CX=1000H。
则指令执行后 AX=0FFFH,CF=0
4)算术比较指令 CMP
格式,CMPOPD,OPS
执行的操作,OPD - OPS
该指令与 SUB指令一样执行减法操作,但它并不保存结果,只是根据结果设置条件标志位。 CMP指令后往往跟一条条件转移指令,
根据比较结果产生不同的程序分支。
3.乘法指令
MUL无符号数乘法
IMUL带符号数乘法
1) MUL无符号数乘法指令格式,MULOPS
执行的操作:
字节操作数,AL* OPS→ AX
字操作数,AX* OPS→ DX,AX
双字操作数,EAX* OPS→ EDX,EAX
2) IMUL带符号数乘法指令格式,IMULOPS
执行的操作与 MUL相同,但必须是带符号数,
而 MUL是无符号数。
例如,IMULCL
若指令执行前 AL=0B4H,CL=11H
则指令执行后 AX=0FAF4H。
4.除法指令
DIV无符号数除法指令
IDIV带符号数除法指令
1) DIV无符号数除法指令格式,DIVOPS
若 OPS为字节类型,则:
AX/OPS的商 → AL
AX/OPS的余数 → AH
若 OPS为字类型,则:
DX,AX/OPS的商 → AXDX,AX/OPS的余数 → DX
若 OPS为双字类型,则:
EDX,EAX/OPS的商 → EAXEDX,EAX/OPS的余数
→ EDX
以上几种形式商和余数均为无符号数。
2) IDIV带符号数除法指令格式,IDIVOPS
执行的操作:与 DIV相同,但操作数必须是带符号数,商和余数也都是带符号数,且余数的符号和被除数的符号相同。
例如,IDIVBL
若指令执行前 AX=0400H,BL=0B4H。
则指令执行后 AL=0F3H(商),AH=24H
(余数)
6.调整指令
1) DAA加法的压缩 BCD码十进制调整指令格式,DAA
这条指令之前必须执行 ADD或 ADC指令。加法指令必须把两个压缩 BCD码相加,并把相加结果存放在 AL寄存器中。
如果 AF标志(辅助进位位)为 1,或者 AL寄存器的低 4位是 16进制的 A~ F中的任意一位数,
则 AL 寄存器内容加 06H修正,且将 AF位置 1;
2) DAS减法的压缩 BCD码十进制调整指令格式,DAS
执行的操作:把 AL中的两个压缩 BCD码之差调整成压缩 BCD码的格式 → AL。
应该注意的是,在执行这条指令之前,必须先执行
SUB或 SBB指令。
如果 AF标志为 1,或者 AL寄存器的低 4位是 16进制的
A~ F中的任意一位数,则 AL寄存器的内容减 06H,
且将 AF位置 1;
如果 CF标志为 1,或者 AL寄存器的高 4位是 16进制的
A~ F中的任意一位数,则 AL寄存器内容减 60H,
并将 CF位置 1。
如果 AL寄存器的高 4位和低 4位都满足以上条件,则将 AL寄存器的内容减 66H。
3) AAA加法的非压缩 BCD码调整指令本指令的调整步骤是:
①如 AL寄存器的低 4位在 A~ F之间或 AF为 1,
则 AL寄存器的内容加 06H,AH寄存器的内容加 1,并将 AF位置 1;
②清除 AL寄存器的高 4位;
③ AF位的值送 CF位。
4) AAS减法的非压缩 BCD码调整指令本指令的调整步骤是:
①如 AL寄存器的低 4位在 A~ F之间,或 AF位为 1,则把 AL寄存器的内容减 6,AH寄存器的内容减 1,并将 AF位置 1;
②清除 AL寄存器的高 4位;
③ AF位的值进 CF位。
例如,AAS
若指令执行前 AX=0407H,AF=0,CF=0。
则指令执行后 AX=0407H,AF=0,CF=0。
5) AAM乘法的非压缩 BCD码调整指令格式,AAM执行的操作:
AX /10的商 → AH ; AX/10的余数 → AL
注意:在执行这条指令之前,必须先执行
MUL指令,把两个非压缩的 BCD码(此时要求其高 4位为 0)相乘,结果存放在 AL寄存器中。
例如,AAM
若指令执行前 AX=0062H。
则指令执行后 AX=0908H。
6) AAD除法的非压缩 BCD码调整指令格式,AAD
AAD指令执行的操作是:
AH*10+ AL→ AL; 0→ AH
例如,AAD
DIVBL
若指令执行前 AX=0302H,BL=8。
则执行 AAD后 AX=32
再执行 DIVBL 后 AX=32
第 2节,位运算指令
1.逻辑运算指令
( 1)逻辑非指令 NOT
格式,NOT OPD
功能,OPD← OPD
说明:操作数不能用立即数,指令执行后对标志无影响,也可用于求补
( 2)逻辑与指令 AND
格式,AND DOPD,SOPD
功能,DOPD← DOPD∧ SOPD
( 3)逻辑或指令 OR
格式,OR DOPD,SOPD
功能,DOPD← DOPD∨ SOPD
( 4)逻辑异或指令 XOR
格式,XOR DOPD,SOPD
功能,DOPD← DOPD+SOPD
( 5)逻辑测试指令 TEST
格式,TEST DOPD,SOPD
功能:除不回送结果外与 AND指令功能相同
2.移位操作指令
( 1)算术移位指令
1)算术左移指令 SAL
格式,SAL DSOPD,CL|1
功能:向左移位指定次数,每左移 1次低位补 0,最高位移入 CF
2)算术右移指令 SAR
格式,SAR DSOPD,CL|1
功能:向右移位指定次数,最高位固定,每次将低位移入的低位。
( 2).逻辑移位指令逻辑移位指令包括逻辑左移指令 SHL和逻辑右移指令 SHR。
逻辑左移指令 SHL和算术左移指令 SAL完全相同。
逻辑右移指令 SHR与算术右移指令 SAR的区别在于移空的高位补 0。
移位操作可快速实现 2”的乘除运算,刀对应移位次数。左移等于做乘法,乘 2;右移等于做除法,除以 2。算术移位适用于符号数运算,逻辑移位适用于无符号数运算。
( 3).循环移位指令循环移位指令包括不带进位的循环移位指令 ROL、
ROR和带进位的循环移位指令 RCL、
RCR,共计 4条。
格式,ROL I RCL I ROR f RCR DSOPD,CL I l
功能:
1)ROL,不带进位的循环左移指令。将 DSOPD循环左移指定次数,但 CF不包含在循环的环中。每左移一次,把最高位移入 CF的同时,
又移回操作数最低位。
2)ROR,不带进位的循环右移指令。将 DSOPD循环右移指定次数,但 CF不包含在循环的环中。每左移一次,把最低位移入 CF的同时,
又移回操作数最高位。
3)RCL,带进位的循环左移指令。与 ROL指令不同的是 CF包含在循环的环中,每左移一次,操作数最高位移入 CF,而 CF移至最低位。
4)RCR,带进位的循环右移指令。与 ROR指令不同的是 CF包含在循环的环中,每右移一次,操作数最低位移入 CF,而 CF移至最高位。
第3节 输入 /输出系统功能调用
1.系统功能调用方式为了调用方便,DOS系统将各个功能子程序顺序编号,这个编号称为功能号。通过功能号调用系统提供的相应功能。进行系统功能调用要做三方面的工作:
( 1).设置入口参数
DOS系统功能调用一般都是通过寄存器传送入口参数,但也有一些系统功能调用不需要设置入口参数。存放入口参数的寄存器大多数功能号指定的是 DL/ DX寄存器。
( 2).设置功能号将所需要调用的子程序的功能号送入 AH寄存器。
注意功能号只能指定在寄存器 AH中。
( 3).执行软中断指令 INT
该指令将程序控制自动转向相应子程序的入口,并执行相应功能处理。
调用结束后,一般会有出口参数,但保存于特定的寄存器中。有些功能调用结束时会在屏幕上显示结果或在打印机上打印结果。
2.输入,输出系统功能调用
( 1)键盘输入 (1号功能调用 )
入口参数:无调用方式,MOV AH,1
INT21H
出口参数,AL中为输入字符的 ASCII码。
功能:等待从键盘输入一个字符,并将输入字符的 ASCII码送入 AL寄存器。
说明:执行该功能调用首先扫描键盘,等待按键。若有键按下,则对所按键码进行检查;
( 2)显示字符 (2号功能调用 )
入口参数,DL寄存器内容,为要显示字符的
ASCII码。
调用方式,DL一要显示字符的 ASCII码
MOV AH,2
INT21H
出口参数:无。
功能:将 DL寄存器中的字符送标准输出设备
(如显示器 )输出。
说明:若 DL中的内容为 CTRL+BREAK的 ASCII
码,退出功能调用
( 3)打印输出 (5号功能调用 )
入口参数,DL寄存器中内容,为要打印的字符的 ASCII码。
调用方式,DL一要打印输出的字符
MOV AH,5
INT 21H
功能:将 DL寄存器中的字符送标准打印设备打印输出。
说明:完成的功能与 2号功能调用类似,
只是输出设备不同。
( 4)控制台调用 (7号功能调用 )
调用方式:同 l号功能调用。
功能:从键盘输入字符送 AL,但不在屏幕上显示,且对键入字符不做 cTRL+BREAK检查。
( 5)控制台输入 (8号功能调用 )
调用方式:同 1号功能调用。
功能:从键盘输入字符送 AL,不在屏幕上显示,
对键入字符要做 CTRL+BREAK检查和处理。
( 6)字符串显示 (9号功能调用 )
入口参数,DX,要显示的字符串的首地址。
调用方式,Dx一要显示的字符串的首地址
MOV AH,9
INT21H
出口参数:无。
功能:显示以,$”为结束标志的字符串。
说明:显示字符串 (不含 $)后,做
CTRL+BREAK检查和处理。
(7)字符串输入 (10号功能调用 )
入口参数,DX,缓冲区首地址。
调用方式,Dx一从键盘接收字符的输入缓冲区首地址第4节 简单程序设计举例概念,顺序程序设计是程序设计中最简单的一种程序设计方法。从程序的流程图看,顺序程序是以一个开始框开始,
以一个结束框终止,中间有一个或多个顺序的执行框组成的程序结构形式。只要遵照算法步骤依次写出相应的指令即可。这种程序设计方法称为直流方法。
例 5.1设 X,Y,Z为有符号字变量,编写程序计算 R=(( X * Y+5) +4 * X) /Z表达式。
数据段定义如下:
DATA SEGMENT
XDW?
YDW?
ZDW?
RDW2DUP( 0)
DATA ENDS
例 5.1程序
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA
MOV DS,AX
MOV AX,X
IMULY;计算 X* Y
ADDAX,5;计算 X* Y+5
ADC DX,0
MOV CX,DX
MOV BX,AX
MOV AX,X;计算 4* X
MOV SI,4
IMULSI
ADD AX,BX ;算( X* Y+5) +4* X
ADC DX,CX
IDIVZ;计算(( X* Y+5) +4* X) /Z
MOV R,AX
MOV R+2,DX
MOV AH,4CH
INT21H
CODE ENDS
END START
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA
MOV DS,AX
MOV AX,X
IMULY;计算 X* Y
ADD AX,5;计算 X* Y+5
ADC DX,0
MOV CX,DX
MOV BX,AX
MOV AX,X;计算 4* X
例 5.2
编写程序将 A字变量中的 48位二进制数与 B字变量中的 16位二进制数做无符号数相乘,其结果放在 C字变量中。
在本例中,如果用一个字母表示一个 16位二进制数,48位二进制被乘数用 LMN表示,16
位二进制乘数用 P表示,则 N× P=RZ,
M× P=TS,L× P=UV,两个数相乘可表示为:
例 5.2程序清单如下
DATA SEGMENT
ADW 3745H,2948H,7068H
BDW1231H
CDW4DUP( 0)
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOVAX,DATA
MOV DS,AX
MOV AX,A+4
MULB
MOV C+6,AX
MOV C+4,DX
MOV AX,A+2
MULB
ADD C+4,AX
ADC DX,0
MOV C+2,DX
MOV AX,A
MULB
ADD C+2,AX
ADC DX,0
MOV C,DX
MOV AH,4CH
INT21H
CODE END SEND START
例 5.3
将 BUF中的一字节压缩 BCD码转换为 ASCII码显示输出。
程序清单如下:
DATA SEGMENT
BUFDB34H
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA
MOV DS,AX
MOV DL,BUF;
MOV CL,4
SHRDL,CL
ADD DL,30H
MOV AH,2
INT21H
MOV DL,BUF
AND DL,0FH
ADD DL,30H
MOV AH,2
INT21H
MOV AH,4CH
INT21H
CODE ENDS
END START
例 5.4
设 A,B变量中存放的是 64位的二进制数,请用 386及其后继机型的相应指令编写 A+ B→ C
的程序
,586
STACK SEGMENT STACK
DW200 DUP( 0)
STACK ENDS
DATA SEGMENT USER16
ADQ372869AF63DE3710H
BDQ1239876ABCFDE020H
CDQ0
DATA ENDS
CODE SEGMENT USER16
ASSUME CS,CODE,DS,DATA,SS:
STACK
START,MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV EAX,DWORDPTRA+4
ADD EAX,DWORDPTRB+4
MOV DWORDPTRC+4,EAX
MOV EAX,DWORDPTRA
ADC EAX,DWORDPTRB
MOV DWORDPTRC,EAX
MOV AX,4C00H;返回 DOS
INT21H
CODE END SEND START