2-微处理器指令系统第4讲

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

段内直接无条件转移

JMP label;
IP=偏移地址label
举例: START: INC BL ADD AL,BL JMP START
条件转移指令


条件转移指令Jcc根据指定的条件确定程序是 否发生转移。其通用格式为: Jcc label ;条件满足,发生转移 ;IP←IP+8位位移量; ;否则,顺序执行 label是一个标号 label只支持短转移的相对寻址方式
2.6 控制转移类指令


控制转移类指令用于实现分支、循环、过 程(子程序)等程序结构 重点掌握: JMP/Jcc/LOOP/JCXZ CALL/RET INT n/IRET 常用系统功能调用
控制转移类指令通过改变 IP (和 CS )值,实现程 序执行顺序的改变
目标地址的寻址方式

LOOPZ举例
设内存中存放一字符串,找出第一个不是a的 字符,并记下它的地址放在ADDR单元,如果 都是a字符,则将ADDR单元清0。 Dseg segment String db ‘aaaaaabaaaa….’ Agin: inc si Count db 50 cmp al,[si] Addr dw ? loopz agin Dseg ends jnz next Cseg segment mov si,0 Assume cs:cseg,ds:dseg Next: mov addr,si Start: mov ax,dseg mov ah,4ch mov ds,ax int 21h lea si,string Cseg ends mov cl,count end start mov ch,0 mov al,’a’ dec si
代 码 段
代 码 段
实现转移的指令
无条件转移指令
条件转移指令
无条件转移指令
JMP label

;程序转向label标号指定的地址

只要执行无条件转移指令JMP,就使程序转到 指定的目标地址label处 JMP指令分成4种类型:
⑴ ⑵ ⑶ ⑷ 段内转移、直接寻址 段内转移、间接寻址 段间转移、直接寻址 段间转移、间接寻址
相对寻址方式 直接寻址方式 间接寻址方式
相对寻址方式

指令中提供目的地址为:相对于当前IP的位移 量,转移后的IP值=当前IP值加上位移量
MOV BX,0678H LP:DEC BX JNZ LP;该指令中操作数部分为相对位移量
直接寻址方式
转移后的目标地址直接来自指令中提供的目标 逻辑地址 MOV BX,0678H LP:DEC BX JMP LP;指令中操作数部分为逻辑符号地址LP 的值
ຫໍສະໝຸດ Baidu
N AL交换CL
比较有符号数大小


判断有符号数的大(Greater)、小(Less), 需要组合OF、SF标志、并利用ZF标志确定相 等与否 两数的大小分成4种关系,分别对应4条指令
JL(JNGE):目的操作数小于(不大于等于)源操作数 JNL(JGE):目的操作数不小于(大于等于)源操作数 JLE(JNG):目的操作数小于等于(不大于)源操作数 JNLE(JG):目的操作数不小于等于(大于)源操作数
子程序调用举例
将data单元中的一字节十六进制数转成两个 ASCII码,分别存放asch和ascl中
Dseg segment data db 8ah Asch db ? Ascl db ? Dseg ends Cseg segment Assume cs:cseg,ds:dseg Start: mov ax,dseg mov ds,ax Mov dl,data and al,0f0h Mov cl,4 Shr dl,cl Call htoasc mov asch,dl Mov dl,data And dl,0fh Call htoasc mov ascl,dl mov ah,4ch int 21h Htoasc proc … … ret Htoasc endp Cseg ends end start
;循环条件判定:循环次数减1,不为0转移(循环)
add di,2 loop again
子程序指令


子程序是完成特定功能的一段程序 采用CALL指令转移到该子程序的起始 处执行 采用RET指令回到主程序继续执行 用堆栈保存断点与现场 使用子程序时,注意堆栈的变化
子程序调用指令CALL
数据块传送(字)
mov cx,200h
;设置循环次数:1K÷2=200H
mov si,offset sbuf
;设置循环初值:SI指向数据段源缓冲区开始
mov di,offset dbuf again:
;DI指向附加段目的缓冲区开始(附加段) mov ax,[si] ;循环体:实现数据传送 mov es:[di],ax ;每次传送一个字 add si,2 ;指向下一个(字)单元
CMP AL,BL JNC NEXT XCHG AL,BL NEXT:CMP AL,CL JNC NEXT1 XCHG AL,CL NEXT1:MOV MAX,AL
N AL交换CL
比较无符号数高低
无符号数的大小用高(Above)、低(Below) 表示,需要利用CF确定高低、利用ZF标志确定 相等(Equal) 两数的高低分成4种关系,对应4条指令 JB(JNAE):目的操作数低于(不高于等于)源操作数 JNB(JAE):目的操作数不低于(高于等于)源操作数 JBE(JNA):目的操作数低于等于(不高于)源操作数 JNBE(JA):目的操作数不低于等于(高于)源操作数

间接寻址方式


目的地址从指令中寄存器或存储单元中间接获 得 例如:JMP [BX]
目标地址的寻址范围:段内寻址


段内转移——近转移(near) 在当前代码段64KB范围内转移 ( ±32KB范围) 只改变IP,CS不变 JMP START 段内转移——短转移(short) 转移范围可以用一个字节表达,在段 内-128~+127范围的转移 JNZ LP
循环指令



LOOPNZ/LOOPNE label;不为零/不相等时循环 操作:(CX)← (CX)-1 若ZF=0且(CX)≠0,转移到label;否则退出循 环 功能:将CX减1,如果CX为0或者ZF为1则退出 循环,在ZF=0且CX≠0时继续循环。 注意:循环指令都是短转移,转移地址在128~+127之间。
代 码 段
代 码 段
目标地址的寻址范围:段间寻址

段间转移——远转移(far) 从当前代码段跳转到另一个代码段, 可以在1MB范围 需要更改CS段地址和IP偏移地址
实际编程时,汇编程序会根据目标地址的 属性,自动处理成短转移、近转移或远转移 程序员可用操作符 short 、 near ptr 或 far ptr 强制成为需要的转移类型

CALL指令分成4种类型(类似JMP)

CALL label ;段内调用、直接寻址
CALL r16/m16;段内调用、间接寻址
CALL far ptr label;段间调用、直接寻址 CALL far ptr mem ;段间调用、间接寻址
子程序调用指令CALL

CALL指令需要保存返回地址: 段内调用——只保护IP 如CALL PROC SP←SP-2,SS:[SP]←IP,IP ← OFFSET PROC 段间调用——保护IP和CS 如CALL FAR PTR PROC SP←SP-2,SS:[SP]←CS SP←SP-2,SS:[SP]←IP CS←SEG PROC,IP ←OFFSET PROC

例题

题目:找出无符号数AL,BL,CL中的最大值, 设三个数不相等
CMP AL,BL AL>BL N Y CMP AL,CL AL>CL Y MAX=AL AL交换BL
CMP AL,BL JAE NEXT; XCHG AL,BL NEXT:CMP AL,CL JNB NEXT1 XCHG AL,CL NEXT1:MOV MAX,AL
例:将数据段的sbuf开始的1KB数据传送到附加 段的Dbuf开始的区域

可以以字节或字为单位传送
以字节为单位传送:


一次传送1字节
利用循环 初始化源、目标地址和循环计数
数据块传送(字节)
mov cx,400h;设置循环次数:1K=400H mov si,offset sbuf;SI指向数据段源缓冲区首址 mov di,offset dbuf;DI指向附加段目的缓冲区首址 again:mov al,[si] ;循环体:实现数据传送 mov es:[di],al ;每次传送一个字节 inc si ;SI和DI指向下一个单元 inc di loop again;CX=CX-1,不为0转移(循环)

需要弹出CALL指令压入堆栈的返回地址


例: 十六进制转换为ASCII码的子程序

将DL低4位的一位16进制数转换成ASCII码
0-9:30h-39h(+30h)
A-F:41h-46h(+30h+07h)
PROC与ENDP必须成对出现, PROC 后可加参数 near和far分 例: 十六进制转换为 ASCII 码的子程序 别表示近过程和远过程,如 省略,为近过程 htoasc proc;定义子程序(过程)开始伪指令 and dl,0fh ;只取DL的低4位 or dl,30h ;+30h cmp dl,39h ;是0~9,还是0Ah~0Fh ? jbe htoend ;是0~9,转移 add dl,7 ;是0Ah~0Fh,再+7 htoend: ret ;子程序返回 htoasc endp;定义过程结束伪指令
JCXZ label;如果CX=0(直接判断),则转移到
label


label操作数采用相对短寻址方式 还有LOOPZ/LOOPE和LOOPNZ/LOOPNE两条指令
循环指令



LOOPZ/LOOPE label;为零/相等时循环 操作:(CX)← (CX)-1 若ZF=1且CX≠0,则转移到label;否则退出循 环 功能:将CX减1,如果CX为0或者ZF为0则退出 循环,在ZF=1且CX≠0时继续循环。 注意:CX中的值为0时,并不会影响标志位ZF。
例: 求两符号数较大值
cmp ax,bx ;比较AX和BX jge next ;若AX≥BX,转移 xchg ax,bx ;若AX<BX,交换 mov wmax,ax
next:
循环指令

8088设计有针对CX计数器的专门计数循环指令 LOOP label ;循环指令
;首先CX←CX-1;然后判断;若CX≠0,转移
Jcc指令的分类

Jcc指令不影响标志,但要利用标志(表2-3) 根据利用的标志位不同,分成两种情况: (1)判断单个标志位状态
(2)判断多个标志状态(用于比较有符号数 大小与比较无符号数高低)
判断单个标志位状态
⑴ JZ/JE和JNZ/JNE 利用零标志ZF,判断结果是否为零(或相等) ⑵ JS和JNS 利用符号标志SF,判断结果是正是负 ⑶ JO和JNO 利用溢出标志OF,判断结果是否产生溢出 ⑷ JP/JPE和JNP/JPO 利用奇偶标志PF,判断结果中“1”的个数是偶是奇 ⑸ JC/JB/JNAE和JNC/JNB/JAE 利用进位标志CF,判断结果是否进位或借位
子程序返回指令RET

根据段内和段间、有无参数,分成4种类型

RET ;无参数段内返回 RET i16;有参数段内返回,SP+i16 RET ;无参数段间返回 RET i16;有参数段间返回,SP+i16 段内返回——出栈偏移地址IP IP←SS:[SP], SP←SP+2 段间返回——出栈偏移地址IP和段地址CS IP←SS:[SP],SP←SP+2 CS←SS:[SP],SP←SP+2
例题

题目:判断AX与BX内容是否相等,如果相等, 则将MAX单元置0,不相等则置-1
CMP AX,BX JZ ZERO MOV MAX,0FFH JMP NXET
ZERO:MOV MAX,0 NEXT:
例题

题目:找出无符号数AL,BL,CL中的最大值, 设三个数不相等
CMP AL,BL AL>BL N Y CMP AL,CL AL>CL Y MAX=AL AL交换BL
相关文档
最新文档