目录
一、顺序程序设计
没有分支、循环等转移指令的程序,会按照指令书写的前后顺序进行执行。
例题1:执行下面的代码,求DX和ZF
设DX=5678H。
MOV CL,8;给CL传送8个字节
ROR DX,CL;循环右移8位(CL=8),DX=7856H
AND DX,0FFH;AND相与,取值都为1时,其值才是1,否则值都为0,7856H^00FFH=0056H,cf=of=0,zf=0
CMP DX,56H;0056H-0056H=0,CMP不回送但影响标志位,ZF=1,cf=of=0。
例题2:在屏幕上显示“hello.how are you!”
HDATA SEGMENT ;定义数据段开始(DS)
CHAR DB 'hello.how are you!','$' ;定义字符串,$为结束
HDATA ENDS ;定义数据段结束(DS)
CODE SEGMENT ;定义代码段开始(CS)
ASSUME CS:CODE,DS:HDATA ;定义每个段定义是为数据段还是代码段。
BEGIN:MOV AX,HDATA ;代码编写开头为数据段的传送
MOV DS,AX ;代码编写开头为数据段的传送
LEA DX,CHAR ;取CHAR有效地址给DX也就是:‘hello.how are you!’,'$'
MOV AH,09H ;DOS功能调09号功能,该功能是在屏幕输出字符串
使用条件是:(1)入口参数需要DS和DX(2)必须用‘$’为结束(3)要用AH进行
传送(4)要用INT 21H进行功能调用
INT 21H ;
MOV AH,4CH ;结束
INT 21H ;
CODE ENDS ;定义代码段结束(CS)
END BEGIN ;结束代码段的执行
二、分支程序设计
根据条件是真或假决定执行不执行,判断条件的指令如CMP、TEST。JCC类指令和JMP指令可以实现分支控制
例题1:首地址DAT的数据区中有3个互不相等的8位无符号整数,编写一个完整的程序,将这3个数的最大值存放到MAX单元。
HDATA SEGMENT ;定义数据段的开始
NUMBER DB 23H,32H,13H ;在数据段定义三个互不相等的数
MAX DB ? ;定义MAX一开始为空
HDATA ENDS ;定义数据段的结束
CODE SEGMENT ;定义代码段的开始
ASSUME CS:CODE,DS:HDATA
BEGIN:MOV AX,HDATA
MOV DS,AX
MOV AL,NUMBER ;AL=23H
MOV BL,NUMBER+1 ;BL=32H
MOV CL,NUMBER+2 ;CL=13H
LOP1:CMP AL,BL
JA LOP2 ;AL中的数据大于BL中的数据跳转到LOP2
MOV AL,BL ;如果不大于就将BL的值给了AL。
LOP2:CMP AL,CL
JA LOP3
MOV AL,CL
LOP3:MOV MAX,AL
MOV AH,4CH
INT 21H
CODE ENDS ;定义代码段的结束
END BEGIN
例题2:设输入数据为X、输出数据为Y、X和Y均为字节变量,请编制一个完整的程序计算下面的函数值。
DATA SEGMENT
X DB 6
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE DS:DATA
BEGIN:MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP AL,0
JZ ZERO;JZ判断结果为0时跳转到ZERO否则不跳转
JS NEG;JS利用符号标志位SF,判断结果是正还是负,是负跳转到NEG
MOV BL,1;如果X不是负且还不等于0就将1给了BL(x>0)
JMP SAV;然后跳转到SAV
ZERO:MOV BL,0;如果x等于0就会跳转到这里来,然后给BL赋值为0(x=0)
JMP SAV;然后跳转到SAV
NEG:MOV BL,-1;如果x是负数就会跳转到这里来,然后给BL赋值为-1(x<0)
JMP SAV;然后跳转到SAV
SAV:MOV Y,BL;将判断后BL的值给Y
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
三、循环程序设计
满足一定条件的情况下,重复执行某段程序;首先循环程序设计有3个组成部分(1)循环初始部分——为循环的开始准备必要的条件,如循环次数、循环体需要的数值等(2)循环体部分——也就是重复执行的代码,其中要包括对循环条件等的修改程序段(3)循环控制部分——判断循环条件是否成立,才决定是否循环;其次循环控制部分有两种结构分别是:先判断后循环以及先循环后判断两种结构;最后循环控制方法有计数控制循环和条件控制循环。
例题1:内存buf单元开始存放9个有符号字节数据,求最小值并存进min单元。
DATA SEGMENT
BUF DB,6,11,-3,19,2,8,-5,7,16
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEGIN:MOV AX,DATA
MOV DS,AX
LEA BUF
MOV AL,[BX]
MOV CX,9 ;9个数9次循环
LOP:INC BX ;BX+1也就是取后面的数
CMP AL,[BX]
JLE A ;有符号数JLE,如果AL小于等于BX就跳转到A
MOV AL,[BX]
A:LOOP LOP ;循环LOP
MOV MIN,AL
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN