汇编语言第5章

SP→
SI
CX
BX
AX IP
调用程序 的IP
SP→ AX
IP
保护现场后的堆栈 状态
恢复现场后的堆栈 状态
程序执行时堆栈的状态
注意:子程序中使用到的寄存器是应该保存与 恢复,但是其中用来向子程序传递参数的寄 存器,可不需保护与恢复,特别是向调用程 序回送结果的寄存器,就千万不要保护与恢 复,否则,子程序的回送结果就会被恢复而 破坏。

第一节
子程序的结构
一、子程序定义伪指令 格式:子程序名 PROC 属性 ;子程序的开始 ┇ 子程序名 ENDP ;子程序的结束。 功能:定义子程序的开始和结束,将子程序的功能部分包含起来。 子程序名是由用户定义的、子程序入口的符号地址,是调用 子程序时的调用名。结束的名字必须和开始的名字相同。 子程序开始时定义的属性决定了子程序的调用和返回的属性, 必须在定义时考虑好。如果子程序与调用程序在同一个段中, 即段内调用,则属性选NEAR;如果子程序与调用程序不在同 一个段中,即段间调用,则属性选FAR。对段内调用可以省 写属性‘NEAR’。
SP→
DX
CX AX BP→ BP IP S 调用程序 的IP
程序执行中堆栈最满时的状态
SQUR PROC NEAR PUSH BP ;现场的保护 MOV BP,SP 源程序如下: PUSH AX DATA SEGMENT PUSH CX S DW 101H PUSH DX SUM DW 2 DUP(?) MOV AX,[BP+4];被开平方值 DATA ENDS MOV CX,0 ;平方根 STA1 SEGMENT STACK MOV DX,1 ;自然奇数的首项 DW 40 DUP(?) REP1: CMP AX,DX STA1 ENDS JB EXIT CODE SEGMENT SUB AX,DX INC CX ASSUME CS:CODE,DS:DATA,SS:STA1 ADD DX,2 START:MOV AX,DATA JMP REP1 MOV DS,AX EXIT: MOV SUM,CX MOV BX,S MOV SUM+2,AX PUSH BX POP DX ;现场的恢复 CALL SQUR ;调“开平方”子程序 POP CX MOV BX,SUM POP AX ┇ ;可进行显示等处理 POP BP MOV AX,4C00H RET 2 ;子程序返回 SQUR ENDP INT 21H CODE ENDS
第二节
子程序的参数传递
由于某些变量的赋值不同,子程序就可以对不同的数据进行 相同的处理。所以,在调用子程序以前主程序应将这些参 数(入口参数)传递给子程序,而子程序在返回主程序时 也应将结果(出口参数)回送给主程序,这就是子程序的 参数传递。 子程序参数传递的方法一般有三种: 1.寄存器传递法:适用于参数少时。 2.变量传递法:适用于同一源文件(程序模块)中。 3.堆栈传递法:只适用于传递入口参数。 上述三种方法各有特点,选用时可根据具体情况而定,只是 要注意主程序和子程序之间一定要配合好,以便取到正确 的参数。下面将举例说明三种参数传递的方法。
在该程序中,入口参数由堆栈传递,出口参数由变量SUM和SUM+2传递。 没有用寄存器来传递参数,所以,子程序中应对所有使用的寄存器(BP、 AX、CX、DX)进行保护与恢复。 由于BP寄存器是堆栈段的基址寄存器,用堆栈传递参数方法中,子程序 就是采用BP寄存器从堆栈段的中间地址中取参数,所以,用该方法传递参 数时,子程序的格式必须注意: 开始就将BP进行保护,然后马上将栈顶指针(SP)的值送入BP,对于属性 为NEAR的子程序,即可采用[BP+4]取得最后压入的参数,采用[BP+6]取得 次后压入的参数,„„依此类推;对于属性为FAR的子程序,即可采用 [BP+6]取得最后压入的参数,采用[BP+8]取得次后压入的参数,„„依此 类推。程序结束时,要采用“RET exp”的格式,使堆栈指针恢复至压参 数以前的值,因为参数已经被子程序使用完了,这段存储单元可供其它程 序段使用。 用堆栈传递参数方法只能用于传递入口参数,在使用时还要注意正确 地取出参数。但是由于该方法的参数不占用寄存器,也无需另开辟存储单 元,而是将其存放在公用的堆栈段,使用后堆栈恢复原状,仍可供其它程 序段使用,为此,该方法在实用程序中常用。
三、用堆栈传递参数
用堆栈传递参数就是在调用程序中用 CALL指令调用子程序以前把子程序所需 要的参数压栈,运行子程序时可用BP寄 存器从堆栈取出参数。用这种方法传递 参数时,子程序返回用RET exp,以便修 改(SP)使其指向参数入栈以前的值,因 为此时参数已不再有用。其中exp=2*参 数个数。 注意:这种传递参数的方法只适用于传 递入口参数。 下面用堆栈传递参数方法来编程实现例 5-1的功能。堆栈最满时的状态如图
第五章

子程序

子程序又称为过程,它相当于高级语言中的函数。当某些 程序段的功能和结构形式都相同,只是某些变量的赋值不 同的时候,这样的程序段可写成子程序形式,在需要时去 调用它。这样的程序结构,不仅避免了程序段的重复书写 和内存空间的浪费,而且程序结构简洁清晰,是模块化程 序设计的基础。 本章主要介绍了子程序的定义和现场保护,子程序的调用 和返回,以及子程序参数传递的方法,并结合具体实例, 讨论了子程序设计的基本技术和技巧。 本章重点:子程序结构及其设计方法 本章难点:程序设计技巧(多编程)
源程序如下: DATA SEGMENT S DW 101H SUM DW 2 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,S CALL SQUR ;调开平方子程序 MOV SUM,CX MOV SUM+2,AX MOV AX,4C00H INT 21H
一、用寄存器传递参数
用寄存器传递参数就是将要传递的参数约定在寄存器中。主程序将 入口参数存入约定的寄存器,而子程序则从约定的寄存器取出这 些参数进行操作;子程序处理的结果也存入约定的寄存器,而主 程序则从约定的寄存器取出这些出口参数进行进一步的处理。 例5-1:编程将变量S开平方,平方根和余数分别存入SUM和SUM+2中。 开平方的算法:N的平方等于N个自然奇数之和。 即 12=1 22=1+3 32=1+3+5 ┇ N2=1+3+5+„„+(2N–1) ;N个奇数之和 从S中依次减去奇数1、3、5、„,至被开方数小于下一个奇数为 止,累计减去奇数的个数就是S的整数平方根。减完剩下的值就 是余数。
START
在该程序中,主程序将被开平方值存入AX寄存器,子程序 则从AX寄存器取出该值来开平方。子程序将平方根存入CX寄存 器,余数存入AX寄存器,主程序则从CX寄存器取出平方根存入 SUM中,从AX寄存器取出余数存入SUM+2中。 由于,AX和CX寄存器都是用来传递参数的,所以,子程序 中只对DX进行保护与恢复。试想在该程序中如果对AX和CX寄存 器进行保护与恢复将会出现什么情况? 程序开始时,对AX和CX寄存器进行保护,即将AX寄存器中的 被开平方值和主程序中的CX寄存器中值压入堆栈进行保护;程 序结束前,对AX和CX寄存器进行恢复,即将堆栈中的被开平方 值和原来主程序中的CX寄存器中值弹出至AX和CX寄存器,则子 程序中求出的存在CX寄存器中的平方根和存在AX寄存器中的余 数将会丢失。所以,子程序中不能对用来传递参数的寄存器进 行保护与恢复。 用寄存器传递参数方法简单,执行的速度也很快,但是由 于寄存器很有限,不能用于传递很多的参数。
SQUR PROC PUSH MOV MOV REP1: CMP JB SUB INC ADD JMP EXIT: POP RET SQUR ENDP CODE ENDS END
NEAR DX ;现场的保护 CX,0;平方根 DX,1;自然奇数的首项 AX,DX EXIT AX,DX CX DX,2 REP1 DX ;现场的恢复 ;子程序返回
二、用变量传递参数 用变量传递参数就是将要传递的参数约定在变量中。主程序将入口参 数存入约定的变量,而子程序则从约定的变量中取出这些参数进行操作; 子程序处理的结果也存入约定的变量,而主程序则从约定的变量中取出这 些出口参数进行进一步的处理。 例5-1源程序:DATA SEGMENT S DW ? SUM DW ?,? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV S,256 CALL SQUR ;调“开平方”子程序 MOV BX,SUM ┇ ;可进行显示等处理 MOV AX,4C00H INT 21H
上述压栈和出栈的顺序可见堆栈的特点是“先进后出”。 子程序的正确调用及返回由正确选择子程序开始的属性和堆栈 平衡来保证。所谓堆栈平衡,就是在一个程序中有多少条压栈 指令,则应有相同多条出栈指令,这样才能使RET弹出正确的返 回地址。 例:若在上面例题的恢复 现场时少了一条“POP AX”的指令,则程序就不 能返回调用程序中的正确 地址。程序执行时堆栈的 状态如右图。由图可见, 恢复现场后的“RET”指令 会将(SP)→(IP)=(AX),则 使子程序不能正确地返回 调用程序。
SQUR
PROC NEAR POP DX ;现场的恢复 PUSH AX POP CX PUSH CX POP AX PUSH DX ;现场的保护 RET ;子程序返回 MOV AX,S SQUR ENDP MOV CX,0 ;初始化平方根的值 CODE ENDS END START MOV DX,1 ;自然奇数的首项送DX REP1: CMP AX,DX JB EXIT SUB AX,DX 程序中,入口参数由变量S传递,出口参 INC CX 数由变量SUM和SUM+2传递。没有用寄存器来 传递参数,所以,子程序中应对所有使用的 ADD DX,2 寄存器(AX、CX、DX)进行保护与恢复。 JMP REP1 简单、方便,且变量可占有很大的空间, EXIT: MOV SUM,CX 可以用于传递很多的参数,但只能使用于同 MOV SUM+2,AX 一模块中的参数传递。
合集下载

第5章习题解答

第5章习题解答

第5章汇编语言程序设计习题参考答案1.(1) BUFF DB 240 DUP(?)(2) xx DB “BYTE”,”WORD”2.:0000H,则内存分配如下:V AR1V AR2V AR3V AR4V AR53.(1) 段的类型:段的类型有4种,分别是代码段、数据段、堆栈段和附加段。

(2) 段的定义:定义段使用伪指令SEGMENT/ENDS来定义的。

即:段名SEGMENT [定位类型] [组合类型] […类别‟]……段名ENDS(3) 选项的作用和含义:定位类型:告诉汇编程序如何确定逻辑段的边界在存储器的位置,共有4种。

①BYTE:表示逻辑段从字节的边界开始,即本段的起始地址紧接前一段。

②WORD:表示逻辑段从字的边界开始,即本段的起始地址必须是偶数。

③PARA:表示逻辑段从节的边界开始,即本段的起始地址后4位为0。

④PAGE:表示逻辑段从节的边界开始,即本段的起始地址后8位为0。

组合类型:告诉汇编程序当装入存储器时各个逻辑段如何进行组合,共有6种。

①不组合:如果缺省,则不组合。

② PUBLIC:对于不同逻辑段只要有相同段名就把他们集中成一段装入内存。

③ STACK:同PUBLIC相同,但仅限于堆栈段。

④ COMMON:对于不同逻辑段若有相同的段名,则都从同一地址装入。

⑤ MENORY:表示在几个逻辑段连接时,本段定位在地址最高的地方。

⑥ AT 表达式:表示以表达式的值来定位段地址。

‘类别’:在连接时决定各逻辑段的装入顺序。

4. 假设程序中有4个不同类型的段,则名为initprogram宏指令的宏定义如下:initprogram MACRO csname,dsname,esname,ssnameASSUME CS:csname,DS:dsname,ES:esname,SS:ssnameSTART: MOV AX,dsnameMOV DS,AXMOV AX,esnameMOV ES,AXMOV AX,ssnameMOV SS,AXENDM5.假设需传送的数据块为字节数据块,则名为Datastranaction宏指令的宏定义如下:Datastranaction MACRO buffer1,buffer2,lengthLEA SI,buffer1LEA DI,buffer2MOV CX,lengthCLDREP MOVSBENDM6.有效地指令为:(2)、(5)、(9)无效的指令为:(1) 数据类型不一致(3) 两个操作数不能同时为存储器操作数(4) CS不能作为目的操作数(6) 不能用两个变址寄存器作有效地址分量(7) 一个操作数不能是两个变量名的表达式(8) 基址和变址只能相加不能相减(10) 目的操作数不能是立即数(11) 在有效地址中不能减基址或变址严格地说:(9)也不对,因为没有指出存储器的数据类型,即操作数类型不明确。

第五章 DSP的汇编指令..

第五章 DSP的汇编指令..

第五章 TMS320C55x系列DSP的汇编指令
(2) 用户自定义的双指令的并行
这两条指令的并行是通过用户或C编译器定义的。两条指令 同时执行两个操作,用并行符“||”区分并行执行的两条指令。 例:
MPYM *AR1+, *CDP, AC1 ;D单元的一个MAC来完成
||XOR AR2,T1
;A单元的ALU来完成
第五章 TMS320C55x系列DSP的汇编指令
1、高速数字信号处理中常采用汇编语言编程。 2、汇编语言中的两种指令集 (1) 助记符指令集:有助于记忆的符号来表示指令。 (2) 代数指令集:类似于代数表达式,运算关系清楚明了。 注意:DSP的软件开发工具只支持单一的指令形式,不支持助记
符指令和代数指令的混合形式。 3、术语、符号和缩写见P93的表5-1 4、运算符见表5-2
令执行的条件:
TCx(测试/控制标志为1) !TCx(测试/控制标志为0)
TC1&TC2 TC1&!TC2 TC1|TC2 TC1|!TC2 TC1^TC2 TC1^!TC2
!TC1&TC2 !TC1&!TC2 !TC1|TC2 !TC1|!TC2 !TC1^TC2 !TC1^!TC2
第五章 TMS320C55x系列DSP的汇编指令
4、双16比特算术指令: [(1)语法、(2)操作数、(3)状态位] 在D单元中利用其ALU的双16比特模式,同时执行(并行)两个16
比特算术运算,包括加-减、减-加、两个加和两个减运算。
例:
说明: NO:不能并行执行 3:指令的长度为3字节 1:周期为1 X:在X(执行)流水线阶段处理
D – ALU:在D单元ALU执行。 执行结果:AC0=(*AR3)+CARRY+AC1 状态位: Affected by CARRY,C54CM,M40等

汇编语言程序设计_第5章 分支循环程序设计(参考答案)

汇编语言程序设计_第5章 分支循环程序设计(参考答案)

第5章分支、循环程序设计本章要点: 转移指令的寻址方式及其执行过程,控制转移类指令的使用,分支和循环程序的设计和应用。

程序调试的方法,常见问题的程序设计方法。

一、单项选择题5.1.1条件转移是根据标志寄存器中的标志位来判断的,条件判断的标志位共有( B )位。

A. 4B. 5C. 6D. 95.1.2用一条条件转移指令一次可以实现( A )个分支。

A. 2B. 3C. 4D. N5.1.3 条件转移指令的转移范围是(A)。

A. -128~127B. 0~255C. 0~65535D. -32768~327675.1.4 设A为字变量,B为标号,下列指令中不正确的是(D)。

A. MOV AX,AB. JNZ BC. JMP [SI]D. JMP B[BX]5.1.5 下述指令中影响CF标志位的是(A)。

A. SHL AL,1B. MOV AL,1C. JC LD. JNC L5.1.6 下述指令中不影响CF标志位的是(A)。

A. INC SIB. SUB SI,0C. NEG ALD. TEST AL,15.1.7 在多重循环程序设计中,每次通过外层循环进入内层循环时,其内层循环的初始条件(B)。

A. 不必考虑B. 必须重新设置C. 必须清0D. 必须置15.1.8 当设计一个程序时,最重要的是(B)。

A. 程序的结构化B. 能使程序正常运行并实现功能C. 程序的执行速度快D. 程序占用的存储空间小*5.1.9 如果“JNC L”指令的操作码放在0040H,转移后在0020H处取下一指令的操作码,那么这条指令的位移量是(C)。

A. 1EHB. 20HC. 0DEHD. 0E0H*5.1.10 如果“JGE P”指令的操作码放在0050H,该指令的位移量是34H,执行完这条指令转移取下一条指令的偏移地址是(C)。

A. 82HB. 84HC. 86HD. 88H二、填空题5.2.1 当下面循环程序中的划线处填上一个什么数字时,执行的循环次数最多?MOV CX,____0______MOV AX,0L:INC AXLOOP L5.2.2 当两个数进行比较后,执行__JE L(JZ L)表示两数相等则转移到L。

第5章 指令与指令系统和汇编语言程序设计(2)

第5章 指令与指令系统和汇编语言程序设计(2)

运行过程中,可以直接看到屏幕上显示的内容,运行过后,再用D 20F0命令看内存的20F0区域中保存的运行结果,6个大写的英文字母 已经被修改为小写字母: 0061 0062 0063 0064 0065 0066
汇编语言程序设计
1 将寄存器R2和R3的内容相加,结果存入R0。 2 将寄存器R2和R3的内容相加,如果有进位,寄存器R0的内 容置1,否则置0 3 若R1的内容是负数则置R0为-1,否则置0(提示:用TEST) 4 检测R3的是奇数,R0的内容置为1,否则置为0。(提示: 用移位检测C的方法来测量一位) 5 将内存中1000H起始的10个单元的内容取出加2送入原地址。 6 已知内存中1000H起始的10个单元中的数是ASC码,将其取 出送显示。 7 将键盘录入的数存到内存1000H单元中。 8 将键盘录入的10个数存到内存1000H-1009H。
有寄存器寻址,寄存器间接寻址等7种。
从表5.1中可以看出, (A组) INC DR 单操作数(DR的内容加1) (B组) LDRR DR,[SR] 双操作数 (DR [SR])
(4)从指令的功能区分
有运算、读写内存类指令,输入输出指令,转移 指令,子程序调用指令,置进位标志指令等。
从表5.1中可以看出, (A组) ADD DR ,SR 加运算 (B组) LDRR DR,[SR] 读写内存
41 42 43 44 45 46
A 2080
MVRD R3, 0006 ;指定被读数据的个数
MVRD R2, 20F0 ;指定被读、写数据内存区首地址
(2084) LDRR R0, [R2]
;读内存中的一个字符到R0寄存器
CALA 2100 ;调用子程序(入口地址为2100),完成显示、

第5章 汇编语言程序

第5章 汇编语言程序

Y
条件满足?
N
处理段
例5-5 设内部RAM30H,31H单元存放两个无符号数, 将大数存在31H,小数存于30H。 ORG 1000H START:CLR C MOV A,30H SUBB A,31H JC NEXT ;次序符合,返回 MOV A,30H ;交换 XCH A,31H MOV 30H,A NEXT: NOP SJMP $ END
$
5-3 分支程序
由条件转移指令构成程序判断框,形成程序分支结构。 5-3-1 单重分支程序 一个判断决策框,程序有两条出路。 两种分支结构: 例1 求R2中补码绝对值,正数不变, 影响条件 负数变补。
MOV A,R2 JNB ACC.7,NEXT;为正数? CPL A ;负数变补 INC A MOV R2,A NEXT:SJMP NEXT ;结束
五、对源程序进行交叉汇编得到机器代码; 反汇编 —— 分析现成产品的程序,要将二进制 的机器代码语言程序翻译成汇编语言源程序。
六、程序调试。
通过微计算机的串行口(或并行口)把机器代 码传送到用户样机(或在线仿真器)进行程序 的调试和运行。
5.1.3评价程序质量的标准
(1)程序的执行时间。 (2)程序所占用的内存字节数。 (3)程序的逻辑性、可读性。 (4)程序的兼容性、可扩展性。 (5)程序的可靠性。
方法二:采用除10H取余数将BCD拆开 ORG 1000H MOV A,20H; 2B 1T MOV B,#10H ; 3B 2T DIV AB ; 1B 4T ORL B,#30H ; 3B 2T MOV 22H,B ; 3B 2T ORL A,#30H; 2B 1T MOV 21H,A ; 2B 1T SJMP $ END;7条指令、16个内存字节、13个机器周期。

第5章 子程序

第5章 子程序

子程序名
ENDP
在子程序入口处把相关寄存器的值入栈保护,程序返回前再 恢复它们的值,这个操作称为“保护现场”和“恢复现场”。
5.1.3
子程序文档
设计一个子程序之前,首先应该明确:

子程序的名字;
子程序的功能; 入口参数:为了运行这个子程序,主程序为它准备了哪几个 “已知条件”?这些参数存放在什么地方? 出口参数:这个子程序的运行结果有哪些?存放在什么地方? 影响寄存器:执行这个子程序会改变哪几个寄存器的值? 其它需要说明的事项。 上述内容连同子程序源代码等合称为“子程序文档”。 常常把上述内容以“程序注释”的方式书写在一个子程序的首部。
RET指令
无参数段内返回 格式:RET



操作:IP← SS: [SP],SP ← SP+2 有参数段内返回 格式:RET D16 ;其中D16代表16位数据 操作:IP ← SS:[SP],SP← SP+2 SP ← SP+D16 无参数段间返回 格式:RET 操作: IP ← SS:[SP], SP ← SP+2 CS ← SS:[SP], SP ← SP+2 有参数段间返回 格式:RET D16 ;其中D16代表16位数据 操作: IP ← SS:[SP], SP← SP+2 CS ← SS:[SP], SP← SP+2 SP ← SP+D16
段间调用
•
段间直接调用
格式:CALL FAR PTR 子程序名 操作: SP← SP-2, SS:[SP]← CS SP← SP-2, SS:[SP]← IP (以上是保存32位返回地址,偏移地址保存在较小地址处) IP ← 子程序入口的偏移地址, CS← 子程序入口的段基址 • 段间间接调用 格式:CALL MEM32 操作:SP← SP-2, SS:[SP] ← CS SP← SP-2, SS:[SP] ← IP IP← [MEM32],CS←[MEM32+2]

第五章_汇编语言程序设计基础

3
§5-1 汇编语言的基本概念
汇编 语言 源程 序 汇编 程序 A ss em bl er 机器 语言 目标 程序
汇编语言指令与机器指令之间有一一对应的关系,所以汇 编语言与具体的机器密切相关,是一种面向机器的语言。 不同机器(CPU)的汇编语言不同。 为方便编程,实际的汇编程序常还提供一些除机器指令以 外的命令,被称为伪指令。伪指令(Pseudo Instruction) 仅在汇编过程中指导汇编程序如何生成目的代码,自己本 身并没有对应的机器代码。 汇编语言的指令(语句)包含两类:硬指令或真指令(指 令语句)和伪指令(指示性语句) 。
12
§5-2 汇编语言的基本语言成分
6. 综合运算符(改变属性运算符):由已存在的存储器操作数 (变量/标号)生成一个段地址和位移量相同、类型不同的新 的存储器操作数(变量/标号)。 (1) 改变变量/标号的类型: 格式: 新类型 PTR 变量/标号 功能:把PTR左边的属性赋给右边的变量/标号 [例] 设变量XVAR是字节属性,现把它的两个字节内容送 到AX中起去。 MOV AX , WORD PTR XVAR (2) 定义当前存储单元的类型: 格式: THIS 类型 功能:可用于建立新类型的存储器变量,但不分配新的存 储空间,它的段地址和位移量是汇编时的当前值。 [例] WBUFFER EQU THIS WORD BUFFER DB 100 DUP(?)
17
§5-3 汇编语言源程序的结构
(3) 段的类别属性:通常使用的类别名是‘CODE’、 ‘DATA’、‘STACK’,分别指明是代码段、数据段、 堆栈段;但也允许用户自定义类别名。类别名必须用单引 号括起来。 连接程序在组织段时,将所有同类别的段集中在一起, 进行相邻分配。 2. 段寄存器说明伪指令(ASSUME): 格式: ASSUME 段寄存器:段名 [,段寄存器:段名] 功能:告诉汇编程序,段名所指的段由那一个段寄存器寻 址,即建立段与段寄存器的关系。 说明:段寄存器的实际值(CS除外)还要由数据传送令在 执行程序时赋值。

汇编语言程序设计

●标号通常由字母数字串组成,但第一个字母必须为字母。
标号有三种属性:
1. 段属性(SEGMENT): ●表示标号所在段的段基址。
2. 偏移属性(OFFSET): ●表示标号的偏移地址,即标号地址在逻辑段中距段的起始点的字节数。
3. 距离属性(或类型属性 TYPE): ●表示标号作为段内或段间的转移属性。
变量名、标号和一些专用符号等。
●注释字段 这是一个任选字段,它必须以分号开始,和指令语句的注释功能一样。
精选课件
5.2.2 常用伪指令
1. 符号定义伪指令(赋值语句)
(1)等值伪指令 格式:符号名 EQU 表达式 功能:将表达式的值赋给符号名。
[例5-11]
ALFA COUNT
EQU EQU
100 ALFA
精选课件
; CONT =60 ; CONT =7 ; CONT =1 ; AL = 84H
逻辑运算符
●包括按位操作的与(AND)、或(OR)、异或(XOR)、和 非(NOT)四种运算符。它们只适用于对常数进行逻辑运算。
注意: ● AND、OR、XOR和NOT也是指令助记符。
[例5-2] AND DX, PORT AND OFEH
精选课件
分析操作符(数值返回运算符)
(1)取地址的偏移量
(2)取段基址
格式: OFFSET 变量名或标号
功能:取变量名或标号所在段的 段内偏移量。
格式: SEG 变量名或标号
功能:取变量名或标号所在段 的段地址。
(3) 求变量名或标号的类型值
格式:TYPE 变量名或标号 功能: 返回一个数字值。若TYPE运算符加在变量名前,返回的数值是该变量 的类型属性;若TYPE运算符加在标号前,返回的数值则是该变量距离 属性;返回的数值与性的关系表4-1。

第5章(6)微机原理与接口技术(第三版)(王忠民)

E SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV DX, 9 LEA BX, ARRAY LOOP0: MOV AL, [BX] MOV SI, BX INC SI MOV CX, DX LOOP1: CMP AL, [SI] JAE NEXT XCHG AL, [SI] NEXT: INC SI LOOP LOOP1
MAIN PROC FAR ASSUME CX:CODES, DS:DATAS, SS:STACS START: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATAS MOV DS, AX
第5章 汇编语言程序设计
MOV MOV LOOPT:INC ADD CMP JBE MOV MOV RET MAIN ENDP CODES ENDS END START
第5章 汇编语言程序设计
循环控制方法举例
⑴ 用计数控制循环
[例] 在xx单元开始的连续单元中存放有 10个无符号字节数,从中找出最大者送yy单元。
由题意可直接写出数据段如下:
DATA SEGMENT xx DB
49,38,65,12,97,13,55,27,28,85 yy DB ?
DATA ENDS
第5章 汇编语言程序设计
开始
BX←xx的有效地址, AL←[BX],CX←9
BX←BX+1
AL≥ [BX]?
Y
N AL,[BX]中的数交换
CX←CX-1
N CX=0? Y yy←AL
结束
从一批数中求最大者流程图
第5章 汇编语言程序设计
DATA SEGMENT xx DB 49,38,65,12,97,13,55,27,28,85 yy DB ?

汇编语言第5章作业答案

习题51.试说明以下指令中各操作数的寻址方式,如果是存储器寻址,请给出其EA计算公式,并说明所使用的段寄存器。

(1)MOV AL,08H 源操作数:立即数寻址目的操作数:寄存器寻址(2)MOV [0120H],BL 源操作数:寄存器寻址目的操作数:直接寻址,EA=0120H,使用DS段寄存器(3)ADD [BX],AL 源操作数:寄存器寻址目的操作数:寄存器间接寻址,EA=(BX),使用DS段寄存器(4)PUSH [SI]0200H 源操作数:变址寻址,EA=(SI)+0200H,使用DS段寄存器目的操作数:隐含寻址(指令中未直接体现)(5)SUB AX,[BP] 源操作数:寄存器间接寻址,EA=(BP),使用SS段寄存器目的操作数:寄存器寻址(6)AND V AR1+4,DL 源操作数:寄存器寻址目的操作数:直接寻址,EA=V AR1+4,使用DS段寄存器(7)PUSHF 源操作数、目的操作数均为隐含寻址(8)MOV ES : [BX]0100H, AL 源操作数:寄存器寻址目的操作数:基址寻址,EA=(BX)+0100H,用ES段寄存器(9)ADC BYTE PTR [BP][SI]0210H,45H源操作数:立即数寻址目的操作数:基址变址寻址,EA=(BP)+(SI)+0210H,使用SS段寄存器(10)OR ARRY[BX][DI],CL源操作数:寄存器寻址目的操作数:基址变址寻址,EA=(BX)+(DI)+ARRY,使用DS段寄存器2.试分析下列汇编指令是否存在语法错误,如果有语法错误存在,请说明是怎样的错误。

(1)PUSH 8243H错误,单操作数指令不能使用立即数(2)POP AL错误,进栈、出栈指令的操作数应为16位(3)MOV AL,6543H错误,源、目的操作数类型不匹配(4)ADD [0100H],64H错误,目的操作数应使用PTR运算符指出类型,否则具有二义性正确的写法:ADD BYTE PTR [0100H],64H,(或使用WORD PTR)(5)ADC V AR1,V AR2错误,8086指令系统的双操作数指令中,必须有一个是寄存器,不能两个操作数同为内存单元(6)MOV DS,ES错误,段寄存器间不能使用MOV指令直接传递数据,必须通过通用寄存器作为中转(7)MOV DS,0620H错误,使用MOV指令向段寄存器传递数据时,不能使用立即数(8)LEA BX,AX错误,L EA指令的源操作数必须为内存单元(9)DEC AL,AH错误,DEC指令为单操作数指令(10)SHR BL,3错误,当移位次数大于1时,在移位指令中特定使用CL寄存器给出移位次数正确的写法:MOV CL, 3SHR BL, CL3.试说明分别执行下列各组指令后,CF、OF、AF、ZF、SF、PF这六个状态标志分别是怎样的取值。

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