微机原理第02章(指令系统)3

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

第2章:例2.17 求较大值
cmp ax,bx ;比较AX和BX jae next ;若AX≥BX,转移 xchg ax,bx ;若AX<BX,交换 next: mov wmax,ax
如果AX和BX存放的是有符号数, 则条件转移指令应采用JGE指令
第2章:例2.17 求较大值(另解)
cmp ax,bx ;比较AX和BX jae next mov wmax, bx ;若AX<BX,wmax←BX jmp done next: mov wmax,ax ;若AX≥BX,wmax←AX done: ……
第2章:例2.17 求较大值(另解对比)
cmp ax,bx ;比较AX和BX jbe next mov wmax, ax ;若AX>BX,wmax←AX jmp done next: mov wmax,bx ;若AX≤BX,wmax←BX done: ……
第2章:2.2.8 循环指令
一段代码序列多次重复执行就是循环 8088设计有针对CX计数器的计数循环指令 LOOP label ;循环指令
;设置循环次数:1K=1024=400H
mov si,offset sbuf
;设置循环初值:SI指向数据段源缓冲区开始
mov di,offset dbuf again:
;DI指向附加段目的缓冲区开始(附加段) mov al,[si] ;循环体:实现数据传送 mov es:[di],al ;每次传送一个字节 inc si ;SI和DI指向下一个单元
第2章:例题2.15解答1 用JZ指令实现
test ax,01h ;测试AX的最低位D0(不用AND指令,以免改变AX) jz even ;标志ZF=1,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志ZF=0,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2
第2章:例题2.15解答3 用JNS指令实现
mov bx,ax 错误!循环指令不影响SF等标志 ror bx,1 ;将AX的最低位D0移进最高位(符号位SF) jns even ;标志SF=0,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志SF=1,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2
第2章:2.2.7.2 条件转移指令
条件转移指令Jcc根据指定的条件确定程序 是否发生转移。其通用格式为:
Jcc label
;条件满足,发生转移 ;IP←IP+8位位移量; ;否则,顺序执行
label是一个标号、一个8位位移量,表示Jcc指令 后的那条指令的偏移地址,到目标指令的偏移地 址的地址位移 label只支持短转移的相对寻址方式
;首先CX←CX-1;然后判断;若CX≠0,转移
JCXZ label
;为0循环指令
:如果CX=0,则转移
label操作数采用相对短寻址方式 还 有 LOOPZ/LOOPE 和 LOOPNZ/LOOPNE 两 条 指令 dec cx jnz label
第2章:例2.18 数据块传送(字节)
mov cx,400h
第2章:3. 比较有符号数大小
判断有符号数的大( Greater )、小( Less ), 需要组合 OF 、 SF 标志、并利用 ZF 标志确定相等 与否 两数的大小分成4种关系,分别对应4条指令
JL(JNGE):目的操作数小于(不大于等于)源操作数 JNL(JGE):目的操作数不小于(大于等于)源操作数 JLE(JNG):目的操作数小于等于(不大于)源操作数 JNLE(JG):目的操作数不小于等于(大于)源操作数
第2章:例2.17 偶校验
;对DL寄存器中8位数据进行偶校验 ;校验位存入CF标志 test dl,0ffh ;使CF=0,同时设置PF标志 jpe done ;DL中“1”的个数为偶数 ;正好CF=0,转向done stc ;DL中“1”的个数为奇数,设置CF=1 done: …… ;完成
第2章:2. 比较无符号数高低
用右移一位的方法实现除以2。 本例中用RCR指令比SHR指令更好。
第2章:例题2.15解答2 用JNC指令实现
mov bx,ax 还可用SAR、ROR和RCR指令 shr bx,1 ;将AX的最低位D0移进CF jnc even ;标志CF=0,即D0=0:AX内是偶数,程序转移 add ax,1 ;标志CF=1,即D0=1:AX内的奇数,加1 even: shr ax,1 ;AX←AX÷2
;DI指向附加段目的缓冲区开始(附加段) mov ax,[si] ;循环体:实现数据传送 mov es:[di],ax ;每次传送一个字 add si,2 ;指向下一个(字)单元
add di,2 loop again
;循环条件判定:循环次数减1,不为0转移(循环)
2、 过程( 子程序 )调用指令
子程序—程序中具有独立功能的部分编写成独立程序模块。 子程序(过程)定义格式:
第 2章
第2章:2.2.7 控制转移类指令
控制转移类指令用于实现分支、循环、 过程等程序结构,是仅次于传送指令 的常用指令 重点掌握:
JMP/JCC/LOOP/JCXZ CALL/RET INT n/IRET 常用系统功能调用 控制转移类指令通过改变 IP(和 CS)值, 实现程序执行顺序的改变
第2章:目标地址的寻址方式
相对寻址方式
用标号表达
指令代码中提供目的地址相对于当前 IP 的位移 量,转移到的目的地址(转移后的 IP 值)就是 当前IP值加上位移量
直接寻址方式
用标号表达
指令代码中提供目的逻辑地址,转移后的 CS 和 IP值直接来自指令操作码后的目的地址操作数
间接寻址方式
用寄存器或存储器操作数表达
指令代码中指示寄存器或存储单元,目的地址 从寄存器或存储单元中间接获得
代 码 段
代 码 段
第2章:2.2.7.1 无条件转移指令
JMP label
;程序转向label标号指定的地址
只要执行无条件转移指令 JMP,就使程序转到指 定的目标地址,从目标地址处开始执行指令 操作数label是要转移到的目标地址(目的地址、 转移地址) JMP指令分成4种类型:
⑴ ⑵ ⑶ ⑷ 段内转移、相对寻址 段内转移、间接寻址 段间转移、直接寻址 段间转移、间接寻址
第2章:无条件转移指令JMP(jump)
JMP label
;IP←IP+位移量
;段内转移、相对寻址
演示
JMP r16/m16
;IP←r16/m16
;段内转移、间接寻址
演示 演示
JMP far ptr label JMP far ptr mem
;段间转移、直接寻址
演示
;IP←偏移地址,CS←段地址
;段间转移,间接寻址 演示 ;IP←[mem],CS←[mem+2]
CALL调用指令 调用地址由指令给出
CALL调用指令有4种: 段内直接调用 段内间接调用 段间直接调用 段间间接调用

段内直接调用
格式:CALL DST ;(SP)←(SP)-2, ((SP)+1,(SP))←(IP) ; (IP) ← (IP)+D16 DST—给出转向地址(子程序的入口地址)。 D16—机器指令中的位移量(转向地址和返回地址之差)。 位移量为D16范围-32768~+32767H,占有两个字节。
第2章:目标地址的寻址范围:段内寻址
段内转移——近转移(near)
在当前代码段 64KB 范围内转移( ±32KB 范围) 不需要更改 CS 段地址,只要改变 IP 偏移地 址 注意((IP)=(IP)+16位偏移量 ;系统根据 目的地址自动生成) 代 码 段
段内转移——短转移(short)
转移范围可以用一个字节表达,在段内- 128~+127范围的转移 操作:(IP)=(IP)+8位偏移量 ;系统根据 目的地址自动生成
第2章:Jcc指令的分类
Jcc指令不影响标志,但要利用标志(表2-4) 根据利用的标志位不同,分成三种情况:
⑴ 判断单个标志位状态 ⑵ 比较无符号数高低 ⑶ 比较有符号数大小
Jcc指令实际虽然只有16条,但却有30个助记符 采用多个助记符,目的是为了方便记忆和使用
第2章:1. 判断单个标志位状态
inc di loop again
;循环条件判定:循环次数减1,不为0转移(循环)
第2章:例2.18 数据块传送(字)
mov cx,200h
;设置循环次数:1K÷2=200H
mov si,offset sbuf
;设置循环初值:SI指向数据段源缓冲区开始
mov di,offset dbuf again:
子程序和调用程序在同一个程序模块中,子程序可以直接访问模 块中的变量。
DATASG SEGMENT
X Y DATASG CODESG MAIN DW 100 DW 10 ENDS SEGMENT PROC FAR subp PROC NEAR MOV AX,X MOV BX,Y MUL BX RET subp END CODESG ENDS END START
代 码 段
第2章:目标地址的寻址范围:段间寻址
段间转移——远转移(far) 从当前代码段跳转到另一个代码段, 可以在1MB范围 需要更改CS段地址和IP偏移地址 目标地址必须用一个 32位数表达,叫 做32位远指针,它就是逻辑地址
实际编程时,汇编程序会根据目标地址的 属性,自动处理成短转移、近转移或远转移 程序员可用操作符 short 、 near ptr 或 far ptr 强制成为需要的转移类型
第2章:例题2.15
题目:将 AX中存放的无符号数除以 2 ,如果是奇 数则加1后除以2 问题:如何判断AX中的数据是奇数还是偶数? 解答:判断AX最低位是“0”(偶数),还是“1” (奇数)。可以用位操作类指令
1:用逻辑与指令将除最低位外的其他位变成 0,保留最低位 不变。判断这个数据是0,AX就是偶数;否则,为奇数 2:将最低位用移位指令移至进位标志,判断进位标志是0, AX就是偶数;否则,为奇数 3:将最低位用移位指令移至最高位(符号位),判断符号 标志是0,AX就是偶数;否则,为奇数
工作过程如下: 例: NEAR 类型过程 code SEGMENT ;code段

CALL subp XXX:YYY … … subp PROC NEAR ;过程定义 ;调用 指令 YYY入栈 ,D16 =subp-yyy

RET subp code ENDP ENDS ;返回
例:两个数据变量X与Y相乘
⑴ JZ/JE和JNZ/JNE 利用零标志ZF,判断结果是否为零(或相等) ⑵ JS和JNS 利用符号标志SF,判断结果是正是负 ⑶ JO和JNO 利用溢出标志OF,判断结果是否产生溢出 ⑷ JP/JPE和JNP/JPO 利用奇偶标志PF,判断结果中“1”的个数是偶是奇 ⑸ JC/JB/JNAE和JNC/JNB/JAE 利用进位标志CF,判断结果是否进位或借位
符号名
PROC
……
类型
演示
符号名
ENDP RET(RETURN)
子程序调用和返回指令: CALL 过程有两种类型:
ห้องสมุดไป่ตู้
按过程与调用语句间的位置,过程有两种类型。
NEAR类型:调用指令与过程在同一个段中 FAR类型:调用指令与过程不在同一个段中 CALL指令和RET指令都不影响条件码。
(1)、 CALL( Call a procedure)调用
无符号数的大小用高( Above )、低( Below ) 表示,需要利用CF确定高低、利用ZF标志确定相 等(Equal) 两数的高低分成4种关系,对应4条指令
JB(JNAE):目的操作数低于(不高于等于)源操作数 JNB(JAE):目的操作数不低于(高于等于)源操作数 JBE(JNA):目的操作数低于等于(不高于)源操作数 JNBE(JA):目的操作数不低于等于(高于)源操作数
ADD BX,0 ;增加一条指令
第2章:例2.16 判断是否为字母Y
;寄存器AL中是字母Y(含大小写),则令AH=0, 否则令AH=-1 cmp al,‟y‟ ;比较AL与小写字母y je next ;相等,转移 cmp al,‟Y‟ ;不相等, ;继续比较AL与大写字母Y je next ;相等,转移 mov ah,-1 ;不相等,令AH=-1 jmp done ;无条件转移指令 next: mov ah,0 ;相等的处理:令AH=0 done: ……
相关文档
最新文档