240 likes | 446 Views
思考:. ( 1 )指出 EU 执行某条指令时,是否会请求 BIU 访问系统总线? MOV DS , AX MOV 【BX】 , AX IN AL , DX. ( 2 )执行以下指令时 CPU 将产生哪些控制信号? MOV AX , [BX] IN AL , DX. 3.4 程序设计的基本方法. 顺序结构 分支结构 循环结构 主-子程序结构. 2. 分支程序设计. 分支程序根据条件是真或假决定执行与否 判断的条件是各种指令,如根据 CMP 、 TEST 等执行后形成的状态标志
E N D
思考: (1)指出EU执行某条指令时,是否会请求BIU访问系统总线? MOV DS,AX MOV 【BX】,AX IN AL,DX (2)执行以下指令时CPU将产生哪些控制信号? MOV AX,[BX] IN AL,DX
3.4 程序设计的基本方法 • 顺序结构 • 分支结构 • 循环结构 • 主-子程序结构
2. 分支程序设计 • 分支程序根据条件是真或假决定执行与否 • 判断的条件是各种指令,如根据CMP、TEST等执行后形成的状态标志 • 转移指令Jcc和JMP可以实现分支控制
2-1 单分支程序设计 • 条件成立跳转,否则顺序执行分支语句体;注意选择正确的条件转移指令和转移目标地址
例:取数组DATA的第一个偶数,放入BUF单元 LEA SI , DATA NEXT: MOV BX , [SI] ADD SI , 2 TEST BX , 0001H JNZ NEXT MOV BUF , BX
2-2 双分支程序设计 条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体。 注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后
例1:AL中是字母Y或y,令AH=0;否则AH=-1 cmp al,’Y’ jz next cmp al,’y’ jz next mov ah,-1 jmp done next: mov ah,0 done: ...
2-3 多分支程序设计 例1:编写计算下面函数值的程序 1 X>0 Y= 0 X= 0 设输入数据为X、输出数据Y, -1 X<0 且皆为字节变量。
CMP X,0 ;与0进行比较 JGE A1 ;X≥0转A1 MOV Y,-1 ;X <0时,-1→Y JMP EXIT A1:JG A2 ;X>0转A2 MOV Y,0 ;X=0时,0→Y JMP EXIT A2:MOV Y,1 ;X>0,1→Y EXIT:……
3. 循环程序设计 • 循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体 • 循环指令和转移指令可以实现循环控制
循环结构 初始化 循环的初始状态 循环体 循环的工作部分 及修改部分 修改部分 Y 计数控制循环 条件控制循环 控制条件 N 结束
例1. 无符号字节数组累加 LEA SI, ARRAY MOV CX, n XOR AX, AX GOON: ADD AL, [SI] ADC AH, 0 INC SI LOOP GOON MOV SUM, AX
例2:从100,99,...,2,1倒序累加 xor ax,ax ;被加数AX清0 mov cx,100 ;循环计数器 again: add ax,cx ;倒序累加 loop again mov sum,ax ;和送入指定单元 ……
例3:求最大值 MOV BX , OFFEST DATA MOV AL , [BX] INC BX MOV CX , 99 AGAIN: CMP AL , [BX] JA NEXT MOV AL , [BX] NEXT: INC BX LOOP AGAIN MOV KVFF , AL HLT
例4:统计字数组中:正、负、0的个数 • DATA SEGMENT • BUFF DW 200 DUP(?) • N1 DB 0 ;正 • N2 DB 0 ;0 • N3 DB 0 ;负 • DATA ENDS • CODE SEGMENT • ASSUME CS:CODE, DS:DATA • START: MOV AX, DATA • MOV DS, AX
MOV BX, OFFEST BUFF • MOV CX, 200 • AGAIN: CMP WORD PTR [BX], 0 • JG NEXT1 • JE NEXT2 • INC N3 • JMP NEXT3 • NEXT1: INC N1 • JMP NEXT3 • NEXT2: INC N2 • NEXT3: ADD BX, 2 • LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS END START
例5:已知在以BUF为首址的字节存贮区中,存放以‘$’作为结束标志的字符串,试编写程序在屏幕上显示该字符串,并要求将小写字母以大写字母的形式显示出来。例5:已知在以BUF为首址的字节存贮区中,存放以‘$’作为结束标志的字符串,试编写程序在屏幕上显示该字符串,并要求将小写字母以大写字母的形式显示出来。 注1:大小写字母的ASCII码值相差20H。 如:‘A’=41H, ‘a’=61H 注2:INT 21H 显示操作: 要求AH=2,DL=字符
开始 BUF的EA->BX ([BX])->DL (DL)=‘$’ 结束 (DL)为小写字母 (DL)-20H->DL 显示DL中字符 (DX)+1->BX
DATA SEGMENT BUF DB ‘abc,45,END,A,10$’ DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX
LEA BX, BUF LOP: MOV DL, [BX] CMP DL, ’$’ ; CMP DL, ’a’ ; CMP DL, ’z’ ; JE EXIT JB ok JA ok SUB DL,20H ok: MOV AH,2 INT 21H INC BX JMP L0P EXIT: MOV AH,4CH INT 21H CODE ENDS END START
总结:表示数组地址的两种方法 1.以ARRAY为基准点 MOV BX,0 MOV AX,ARRAY[BX] ; 寄存器相对寻址 INC BX ; 字节数组 2.以段首址为基准点 MOV BX,OFFSET ARRAY ; 或LEA BX,ARRAY MOV AX,[BX] ; 寄存器间接寻址 ADD BX,2 ; 字数组
3.5 汇编语言程序格式 • 指令——使CPU产生动作、并在程序执行时才处理的语句,就是以上学习的处理器指令 • 伪指令——不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等 • 伪指令与具体的处理器类型无关,但与汇编程序的版本有关 指令和伪指令
指令性语句 MOV CX,0 ;传送指令,具有2个操作数 DELAY: NOP ;空操作指令,无操作数,带有标号 LOOP DELAY 指令:使CPU产生动作、并在程序执行时才处理的语句 标号:反映指令位置(逻辑地址)的标识符, 用冒号分隔
指示性语句 BUFFER DB 1,2,3,4,5,6,7 ;数据定义伪指令,在主存中开辟7个连续的字节单元,初值依次为1~7,BUFFER表示首地址 • 伪指令:不产生CPU动作、在程序执行前由汇编程序处理的说明性语句。 • 伪指令与具体的处理器类型无关,但与汇编程序的版本有关 名字:反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号