汇编语言——子程序的参数.

合集下载

《IBM PC 80X86汇编语言程序设计》PPT电子课件教案-第六章 子程序设计

《IBM PC 80X86汇编语言程序设计》PPT电子课件教案-第六章 子程序设计

《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
1、子程序的概念和特点
子程序:把在程序中多次出现,具有独立功能 的程序段写成程序模块,该模块可被多次调用, 称之为子程序。
特点:①可重复使用(调用) ②具有通用性(可通过入口参数实现) ③可浮动性(存放位置灵活) ④可递归性和可重入性
第6章
第六章 子程序设计
一、子程序的定义 二、子程序的结构形式
三、子程序的设计和调用 四、子程序的参数传递方法 五、子程序的嵌套和递归调用 六、子程序的设计举例 七、多模块程序设计 八、汇编语言和高级语言的混合编程
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
一、子程序的定义
1、子程序的概念和特点 2、子程序的定义 3、子程序的调用和返回
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
2、子程序的定义
子程序的定义是由过程定义伪指令PROC和ENDP 来完成的。其格式如下:
过程名 PROC [NEAR/FAR]

过程名 ENDP
其中PROC表示过程定义开始,ENDP表示过程定 义结束。过程名是过程入口地址的符号表示。
一般过程名同标号一样,具有三种属性,即段 属性、偏移地址属性以及类型属性。
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
3、子程序的调用和返回
❖ 调用
①段内直接调用
格式:CALL 子程序名
功能:将子程序返回地址(断点)入栈
SP←SP-2
(SP)←IP,
并转到子程序入口地址去执行子程序。
❖ 返回指令

汇编语言程序设计(第四版)第4章【课后答案】

汇编语言程序设计(第四版)第4章【课后答案】

汇编语言程序设计(第四版)第4章【课后答案】汇编语言程序设计第四版【课后习题答案】--囮裑為檤第4章基本汇编语言程序设计〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。

〔解答〕思路:首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。

传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成:.model small.stack 256.dataqvar dq 1234567887654321h.code.startupmov cx,7mov si,1again: mov al, byte ptr qvar[si]mov byte ptr qvar[si-1],alinc siloop againtest al,80hjz ezzmov bl,0ffhjmp doneezz: mov bl,0done: mov byte ptr qvar[7],bl.exit 0end〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。

〔解答〕思路:可设计外循环体为8个字节左移一次,方法是:最低位字节算术左移一次,次低位字节至最高位字节依次带CF 位循环左移一次(内循环共8次),外循环体控制执行7次即可。

.model small.stack 256.dataqvar dq 1234567887654321h.code.startupmov dx, 7 ;外循环次数mov ax, byte ptr qvar[0] ;最低位字节送axlpp: shl ax, 1 ;最低位字节左移一次,其d7移入CF位mov si, 1mov cx, 7 ;内循环次数again: rcl byte ptr qvar[si], 1 ;高位字节依次左移P50inc siloop againdec dxjnz lpp.exit 0.end〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。

汇编语言——子程序

汇编语言——子程序

6.2.2.2 RET指令 指令 【指令格式】RET 【功能】这是子程序返回指令,必须写在子程序的指令 序列之中。根据所在的子程序的类型不同,RET指令的功能 也分为两种情况: (1)如果RET所在子程序是NEAR类型,则从堆栈中出 栈一个字(当然,SP会加2),送给IP。 (2)如果RET所在子程序是FAR类型,则先从堆栈中出 栈一个字送到IP,再出栈一个字送到CS,栈顶指SP的值加4。
cr
PROC NEAR MOV AH,2 MOV DL,13 INT 21H MOV DL,10 INT 21H RET
cr ENDP main:MOV AX,dseg MOV DS,AX LEA DX,buf MOV AH,10 INT 21H CALL cr MOV AH,1 INT 21H MOV BL,AL ;输入一个字符 ;用BL保存读入的字符 ;输入一个符号串
【解】程序段(a)中,先把AX赋值为102H,再把BX赋 值为304H,然后用ADD指令把两数相加,和为406H,结果 放在ADD指令的目的操作数AX中。 程序段(b)的前两行与(a)完全相同,AX取值102H,BX 取值304H,但在相加之前调用了子程序cr。从例6.3中cr的 具体实现方法可以知道,调用过程中寄存器AH的值被改为 2,因为INT 21H输出功能,使AL的值也被修改,变成0AH, 并且这个值一直保持到调用结束,于是“CALL cr”指令调 用子程序后,AX的值不再是调用前的102H,而变成了 20AH,当ADD指令进行两个寄存器相加时,结果是50EH, 并放到目的操作数AX中。
6.3 应用子程序进行编程
6.3.1 子程序实例
【例6.3】分析下列程序,描述它的功能。 dseg SEGMENT buf DB 80,81 DUP(0) dseg ENDS sseg SEGMENT STACK DW 64 DUP(0) sseg ENDS cseg SEGMENT ASSUME CS:cseg,DS:dseg,SS:sseg

汇编语言习题与答案

汇编语言习题与答案

汇编语言习题与答案一、填空题:把答案填在题中横线上。

1. 8位无符号整数的表示范围为0~255,写成16进制形式为00H~__________;8位有符号整数的表示范围为-128~+127,写成16进制形式为__________~__________。

2. 8086/8088分段管理存储空间,但每段容量最大不超过__________。

3. 逻辑地址为F000:100的存储单元,其物理地址是__________。

4. 用来指示堆栈栈顶的偏移地址的是__________寄存器。

5. 若要测试AL寄存器D4、D2、D0位是否都为0,则可使用__________指令语句(含操作数),以产生转移条件。

这条指令执行后将利用标志位__________实现转移。

6. 若定义:bdata db 2 dup(1,2,2dup(3),4),则dbata变量前5个单元从低地址到高地址的数据依次是__________。

7. 假设varw是一个16位变量,则指令“mov varw,ax”的目的操作数的寻址方式是__________。

(二、选择题:在每小题给出的四个选项中,只有一项是符合题目要求的,请把所选项前的字母填在题后的括号内。

1.对汇编语言源程序进行翻译,形成OBJ文件的是A.汇编程序B.连接程序C.编辑程序D.调试程序[]2.下列各个8位二进制数的补码中,真值最大的是A. B.[]语句中,表达常数不正确的形式是B. A346H`C.’A’D. 5600 []4.如果SS=600H,则说明堆栈段物理地址起始于[]50 dup()预留了存储空间的字节数是[]6.下列指令中有操作数在代码段中的是ax,34h ax,bxword ptr [34h] ax,[34h] []@7.假设AL=5,要使得AL=0FAH,应执行的指令是A. not al al,0fhal,0f0h al,0fh []8.设置逻辑段应该采用的一对伪指令是ends end startendp endm []9.条件转移指令JNE条件是=0 =1=0 =1 []10.逻辑移位指令SHL可用于!A.有符号数乘以2B.有符号数除以2C.无符号数乘以2D.无符号数除以2 []11.执行“in al, dx”指令后,进入AL寄存器的数据来自A.寄存器B.存储器C.立即数D.外设端口[]12.将十进制数75以压缩BCD码送入AX,正确的指令是ax,0075 B. mov ax,0705ax,0075h D. mov ax,0705h []13.如下指令可将AX寄存器内容改变的是A. cmp ax,bxB. test ax,bx?C. and ax,bxD. xchg ax,bx []14.设AH=10H,执行“neg ah”指令后,正确的结果是A. AH=10H、CF=1B. AH=F0H、CF=0C. AH=10H、CF=0D. AH=F0H、CF=1 []15.如下程序段:again: mov es:[di],alinc diloop again可用指令__________完成相同的功能。

汇编语言参数传递

汇编语言参数传递

汇编语言参数传递在计算机科学领域中,汇编语言是一种低级语言,被用于指令的编写和处理器的控制。

汇编语言的特点之一是参数传递的使用,它允许将数据或信息传递给子程序或函数。

本文将探讨汇编语言中参数传递的不同方式和相关技术。

1. 立即数传递立即数传递是指直接将数值嵌入指令中作为参数传递的方式。

在汇编语言中,可以使用"mov"(move)指令来将立即数传递给寄存器或存储器。

例如,下面的代码将数值10传递给寄存器ax:```mov ax, 10```2. 寄存器传递寄存器传递是指将数据存储在寄存器中,并通过寄存器传递给子程序或函数。

汇编语言中的寄存器具有特定的名称和功能,如ax、bx、cx和dx等。

下面的示例代码演示了如何使用寄存器传递参数:```mov ax, 10mov bx, 20add ax, bx ; 将bx寄存器中的值加到ax中```3. 存储器传递存储器传递是指将数据存储在内存中,并通过内存地址传递给子程序或函数。

在汇编语言中,可以使用存储器地址作为参数传递给指令。

下面的代码演示了如何使用存储器传递参数:```mov bx, [var] ; 将存储在var地址处的值传递给bx寄存器```4. 栈传递栈传递是指使用栈(堆栈)数据结构来传递参数。

在汇编语言中,栈是一种用于存储和管理函数调用的数据结构。

通过将参数压入栈中,然后在子程序内部弹出,可以实现参数传递的目的。

下面的示例代码演示了如何使用栈传递参数:```push 10 ; 将数值10推入栈中push 20 ; 将数值20推入栈中call myFunction ; 调用名为myFunction的子程序```总结:在汇编语言中,参数传递可以通过立即数传递、寄存器传递、存储器传递和栈传递等多种方式来实现。

不同的传递方式适用于不同的场景和需求。

对于复杂的程序,通常会结合使用多种传递方式来实现参数传递的目的。

正确理解和使用参数传递方式对于开发高效、可靠的汇编语言程序非常重要。

汇编语言之子程序

汇编语言之子程序

汇编语言之子程序汇编语言是一种底层编程语言,是计算机指令的集合表示形式。

在汇编语言中,子程序是一段独立的、可重复使用的代码片段,可以在程序中被多次调用。

子程序可以帮助我们实现代码的模块化,提高代码的可读性和可维护性。

本文将介绍如何在汇编语言中使用子程序以及其工作原理。

一、子程序的定义和使用在汇编语言中,子程序由一系列指令组成,这些指令可以完成特定的功能。

子程序可以通过call指令被调用,执行完子程序后会返回到调用子程序的指令处,继续执行程序的下一条指令。

在使用子程序前,我们需要先定义子程序。

定义子程序的语法如下:```subroutine_name:; 子程序代码ret```其中,subroutine_name是子程序的名称,可以根据实际需求自定义。

ret指令用于返回到调用子程序的指令处,继续执行程序的下一条指令。

调用子程序的语法如下:```call subroutine_name```其中,subroutine_name是要调用的子程序的名称。

二、传递参数和返回值子程序可以接收参数,并且可以有返回值。

在调用子程序时,可以通过寄存器或栈来传递参数。

在子程序内部,可以通过相应的寄存器或栈地址来获取参数的值。

例如,我们定义一个计算两个数之和的子程序add:```add:mov ax, [bp+4] ; 获取第一个参数的值add ax, [bp+6] ; 获取第二个参数的值ret```在主程序中调用add子程序:```mov ax, 5 ; 第一个参数mov bx, 10 ; 第二个参数call add ; 调用add子程序; 此时ax寄存器中的值为15,即5+10的结果```在子程序add中,我们通过寻址方式获取传递的参数,并将计算结果存入ax寄存器中,供主程序使用。

三、保存和恢复寄存器在汇编语言中,调用子程序时需要保存和恢复寄存器的值,以保证程序的正确执行。

在调用子程序前,我们可以使用push指令将需要保存的寄存器值压栈,然后在子程序的开头使用相应的pop指令将值弹出并恢复。

汇编语言课后习题答案

汇编语言课后习题答案

2.1已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。

(1)mov ax,1200h(2)mov ax,bx(3)mov ax,[1200h](4)mov ax,[bx](5)mov ax,[bx+1100h](6)mov ax,[bx+si](7)mov ax,[bx][si+1100h]〔解答〕(1)AX=1200H(2)AX=0100H(3)AX=4C2AH ;偏移地址=bx=0100h(4)AX=3412H ;偏移地址=bx=0100h(5)AX=4C2AH ;偏移地址=bx+1100h=1200h(6)AX=7856H ;偏移地址=bx+si=0100h+0002h=0102h(7)AX=65B7H ;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h〔习题2.2〕指出下列指令的错误(1)mov cx,dl(2)mov ip,ax(3)mov es,1234h(4)mov es,ds(5)mov al,300(6)mov [sp],ax(7)mov ax,bx+di(8)mov 20h,ah〔解答〕(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[ SI ](7)源操作数应为[BX+DI](8)立即数不能作目的操作数〔习题2.5〕已知SS = 2200H、SP = 00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?mov ax,8057hpush axmov ax,0f79hpush axpop bxpop [bx]〔解答〕mov ax,8057hpush axmov ax,0f79hpush axpop bx ;bx=0f79hpop [bx] ;DS:[0f79h]=8057h〔习题2.6〕给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:mov al,89hadd al,aladd al,9dhcmp al,0bchsub al,aldec alinc al〔解答〕mov al,89h ; AL=89h CF ZF SF OF PFadd al,al ; AL=12h 1 0 0 1 1; 1000 1001+1000 100110001 0010add al,9dh ; AL=0afh 0 0 1 0 1; 0001 0010+ 1001 11011010 1111cmp al,0bch ; AL=0afh 1 0 1 0 1; 1010 1111-1011 1100* 0100 0011sub al,al ; AL=00h 0 1 0 0 1dec al ; AL=0ffh 0 0 1 0 1 ; 0000 0000- 0000 0001*1111 1111inc al ; AL=00h 0 1 0 0 1 ;1111 1111+0000 0001*1111 1111必考:〔习题2.10〕指出下列指令的错误:(1)xchg [si],30h (2)pop cs(3)sub [si],[di](4)push ah(5)adc ax,ds(6)add [si],80h(7)in al,3fch(8)out dx,ah〔解答〕(1)xchg的操作数不能是立即数(2)不应对CS直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5)adc的操作数不能是段寄存器(6)没有确定是字节还是字操作(7)in不支持超过FFH的直接寻址(8)out只能以AL/AX为源操作数〔习题2.11〕给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。

浅谈汇编语言中子程序的设计

浅谈汇编语言中子程序的设计
教材新探
r 。+ ”+ +
“+ + ” + + ‘+ + “+ “+ 。
。+ ’+ + ’
‘ ’ +
“+ ’+ ’
“+

浅谈汇编 中子 语言
■+ . . . .+ ” + . + 一 + . . + 一 + . . + - + 一 + + 一 + ” + 一 + ・ ・ 一 + + 一 + ・ ・

是 否按 “ 进 先 出” 后 的原 则 组 织 的 。 () 2堆栈保 护。子程 序是利用调用 C I AL 指令 和返 回 R T 指令来 实现正确 的调用 和返 回 的。因 E
为C Au 命令执 行 时压 入堆栈 的断 点地 址就 是供 子程序返 回主程序 时的地址 , 编程 时一定 要注 意子
程 序 的类 型 属 性 , 是 段 内 调 用 还 是 段 间 调 用 。段 即 内调 用 和 返 回为 N A 属 性 , 问 调 用 和 返 回 为 E R 段 F R 属性 。8 8 / 0 8的 汇编 程 序用 子 程序 定 义 A 0 68 8 P ( 的 类 型 属 性 来 确 定 C L和 R T 指令 的 属 R) C AL E 性 。如 果 所 定 义 的 子 程 序 是 F AR 属 性 , 么 对 它 那 的调用和返 回一定都是 F R A 属性 ; 如果所定义的子 程 序 是 NE R A 属性 , 么 对 它 的 调 用 和 返 回 也 一 定 那 是 NE R A 属 性 。这 样 用 户 只 是 在 定 义 子 程 序 时 考 虑它的属性 , C I 而 AL 和 R T指 令 的 属 性 就 可 以 E 由 汇 编 程 序 来 确 定 了 。另 外 , 入 子 程 序 后 再 使 用 进 堆 栈 时 也 必 须 保 证 压 人 和 弹 出 字 节 数 一 致 , 果 在 如 这 里 堆 栈 存 取 出错 , 然 会 导 致 返 回地 址 的 错 误 。 必 2 参 数传 递 . 主程序在调用子程序 时 , 经常要 向子程 序传递 些参数或控 制信息 , 子程序执行后 , 也常需要把运 行的结果返 回调用程序 。这种信息传递称 为参数传 递, 其常用 的方 法有 寄存 器传 递 、 内存 固定单 元传 递 、 栈传递 。 堆 ( ) 存 器 传 递 。 由 主 程 序 将 要 传 递 的参 数 装 1寄 入事先 约定 的寄存 器 中, 转入子 程序后 再取 出进行 处 理 , 种 方 法 受 C U 内 部 寄 存 器 数 量 限 制 , 此 这 P 因 只适 于传 递 少 量 参 数 的 场 合 , 一 些 常 见 的 软 件 延 如 时子程序 , 均是利用某寄存器传递循环计数 器初值 。 ( ) 过 内存 固 定 单 元 的 传 递 。此 方 法 适 于 大 2通 量传递参数时使用 , 它是在 内存 中开辟特 定 的一片 区域用于传递参数 。主程序和子程序都按事先约定 在指定 的存储单元 中进行数据 交换 , 这种 方法要 占

汇编子程序的一般结构组成。

汇编子程序的一般结构组成。

汇编子程序的一般结构组成。

汇编子程序是一段独立的程序代码,可以被其他程序调用。

它的一般结构由以下几个部分组成:
1. 子程序头部:包括子程序的名称、输入参数和输出参数的说
明等。

2. 参数传递:子程序的输入参数和输出参数通过栈或寄存器传递。

3. 保存寄存器:在进入子程序之前,需要保存一些寄存器的值,以免在执行子程序时被覆盖。

4. 执行程序:这是子程序的核心部分,实现子程序的功能。

5. 恢复寄存器:在退出子程序之前,需要还原保存的寄存器的值。

6. 返回值:如果子程序有返回值,需要将其保存在寄存器或栈中,并通过ret指令返回给调用程序。

以上是汇编子程序的一般结构组成,不同的子程序可能会有差异。

编写子程序需要熟悉汇编语言的基础知识和调试技巧,能够理解程序的逻辑思路、掌握数据结构和算法,才能编写出高效、稳定的子程序。

- 1 -。

汇编语言期末试卷及答案

汇编语言期末试卷及答案

汇编语言期末试卷及答案一、单项选择题1、CPU发出的访问存储器的地址是(A)。

A.物理地址B.偏移地址C.逻辑地址D.段地址2、下列指令中操作数在代码段中的是(A)。

A.MOV AL,42HB.ADD AL,BLC.SUB [BX],DID.INC [DI]3、与MOV BX,OFFSET VAR指令完全等效的指令是(D)。

A.MOV BX,VARB.LDS BX,VARC.LES BX,VARD.LEA BX,VAR4、表示过程定义结束的伪指令是(A)。

A.ENDPB.ENDSC.ENDD.ENDM5、BUF1 DB 3 DUP(0,2 DUP(1,2),3)COUNT EQU $ - BUF1符号COUNT等价的值是(B )。

A.6B.18C.16D.86、下列寄存器中,作为16位寄存器的是(D)。

A. ALB. BLC. CHD.DX7、在程序运行过程中,确定下一条指令的物理地址的计算表达式是(C)。

A.DS*16+SIB. ES*16+DIC. CS*16+IPD. SS*16+SP8、物理地址(10FF0H )=10H,(10FF1H )=20H,(10FF2H )=30H,从地址10FF1H中取一个字的内容是(B)。

A.1020HB.3020HC.2030HD.2010H9、将AX 清零,下列指令错误的是(C)。

A.SUB AX,AXB.XOR AX,AXC.OR AX,00HD.AND AX,00H10、完成同指令XCHG AX,BX相同功能的指令或指令序列是(D)。

A. MOV AX,BXB. MOV BX,AXC. PUSH AXD. MOV CX,AXPOP BX MOV AX,BXMOV BX,CX11、JMP BX 的目标地址的偏移量为(A)。

A. BX 的内容B. BX 所指向的内存单元的内容C. IP + BX 的内容D. IP + [BX]12、可用作寄存器间接寻址或基址、变址寻址的地址寄存器,正确的是(D)。

(汇编语言)练习题

(汇编语言)练习题

(汇编语言)练习题【一】填空题〔每题0.5分,共10分〕1、26.25D= B= O= H2、-56D的原码为 B,反码为 B,补码为 B。

3、0C51H的反码为 B,补码为 B。

4、十进制数87的压缩BCD码为 B,非压缩BCD码为 B。

6、设〔BX〕=1000H,〔DI〕=0010H,〔DS〕=2100H,在指令MOV AX,[BX+DI]中,源操作7、设BUF为数据段0234H单元的符号名,其中存放的内容为3456H。

写出以下指令单独执行后的结果。

〔1〕MOVAX,BUF〔AX〕=〔2〕LEAAX,BUF〔AX〕=8、子程序的参数传递方法包括、、。

9、实模式下存储器的20位物理地址由加形成。

【二】选择题〔每题1分,共10分〕1、以下通用数据传送指令的几种传送中,错误的传送方式是()。

A、从累加器到存储器B、马上数到存储器C、从寄存器到存储器D、从存储器到存储器2、使进位位置1的指令是()。

A、CLCB、CMCC、STCD、NOP3、设AL,BL中基本上有符号数,当AL<=BL时转至NEXT处,在CMPAL,BL指令后,应选用正确的条件转移指令是()。

A、JBEB、JNGC、JNAD、JNLE4、指令LOOPZ的循环执行条件是()。

A、CX<>0同时ZF=0B、CX<>0或ZF=0C、CX<>0同时ZF=1D、CX<>0或ZF=15、以下合法的变量名称是〔〕。

A、9BUFB、ADDC、BUF9D、ASSUME6、一条指令中目的操作数不同意使用的寻址方式是()。

A、寄存器寻址B、马上数寻址C、变址寻址D、寄存器间接寻址7、DOS的功能调用号必须送〔〕寄存器。

A、DLB、DHC、ALD、AH8、在实模式下,存储器治理采纳分段模式,每段大小可达〔〕。

A、64MB、1MC、64KD、16字节9、用来存放下一条将要执行的指令地址的寄存器是()。

A、SPB、IPC、BPD、CS10、要使串操作从低地址向高地址进行,应把标志位设置为()。

汇编语言第5章王爽版(子程序调用指令)

汇编语言第5章王爽版(子程序调用指令)
二、主程序与过程的参数传递方式
例5-1:分别用三种参数传递方法编写求1+2的和的程序。要求将结果送到内存单元,并显示。
DATA SEGMENT SUM DB 0 DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AL, 1 MOV BL, 2 CALL subprog mov ah,4cH int 21h CODE ENDS END START
5.2 子程序的定义、调用和返回(续)
子程序返回指令(RET)
RET [n] 功能:弹出CALL指令压入堆栈的返回地址 段内返回——偏移地址IP出栈 IP←SS:[SP], SP+2 段间返回——偏移地址IP和段地址CS出栈 IP←SS:[SP],SP←SP+2 CS←SS:[SP],SP←SP+2
子程序的概念
子程序的现场保护与参数传递**
子程序的嵌套与递归调用
子程序的定义、调用和返回 **
子程序设计 *
宏汇编程序设计
教学基本内容
第5章 结构化程序设计
子程序:在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 过程(子程序):是指功能相对独立的一段程序。 主程序和子程序间的关系:调用子程序的程序称为主调程序或主程序,被调用的程序称为子程序。
Spr PROC PUSH BP MOV BP, SP MOV AX, [BP+6] MOV BX, [BP+4] ADD AL, BL OR AL, 30H MOV DL,AL MOV AH,2 INT 21H MOV SUM, AL POP BP RET Spr ENDP

汇编练习题——精选推荐

汇编练习题——精选推荐

汇编练习题⼀、填空或选择题1. ⼆进制数1010111B转换成⼗六进制数是()。

A.A7HB.AEHC.87HD.57H2.设字长为8位,则有符号数-2的补码表⽰是()A.10000010B B.11111101B C.11111110B D.00000010B3.设字长为8位,则有符号数+2的补码表⽰是()A.10000010B B.11111101B C.11111110B D.00000010B4.书写汇编语⾔程序时规定,对字母开头的⼗六进制数,其前⾯必须加()A.0B.DC.BD.H5. IBM PC微机中,有符号数是⽤( )表⽰的A.原码B.补码C.反码D.BCD码6.⼗进制数-48的原码是,反码是,补码是。

7.典型的微机硬件系统是由系统总线将_____中央处理器_______、___储存器______和___输⼊输出⼦系统___连接起来的。

8.计算机中唯⼀代表存储空间中每个字节单元的地址的是(B)A.段地址B.物理地址C.逻辑地址D.偏移地址9. 在Intel8086微处理器中,⽤来保存各逻辑段的段地址的寄存器称为(C)。

A.变址寄存器B.标志寄存器C.段寄存器D.指令指针寄存器10.在Intel8086微处理器中,⽤来保存数据段的段地址的寄存器是( A )A.DS B. ES C. SS D. CS 【 ES附加段,CS代码段,SS堆栈段】11.在Intel8086微处理器中,⽤来保存代码段的段地址的寄存器是( D )A.DS B. ES C. SS D. CS12.在Intel8086微处理器中,⽤来保存堆栈段的段地址的寄存器是( C )A.DS B. ES C. SS D. CS13. 微处理器Intel8086中存放下⼀条将要执⾏的指令偏移地址的寄存器(A)A.SPB.AXC.DID.IP :存放代码段的偏移地址始终指向下⼀条的⾸地址14. 微处理器Intel8086中存放堆栈栈顶的偏移地址的寄存器是(A)A.SPB.AXC.DID.IP15. 下列答案中(A )反映了指令操作结果有溢出A.OF=1B.SF=1C.ZF=1D.CF=1进位标志CF零标志ZF符号标志SF溢出标志 OF 奇偶标志 PF 辅助进位标志AF16. 下列答案中(C )反映了指令操作结果等于0A.OF=1B.SF=1C.ZF=1D.CF=117. 下列答案中(B)反映了指令操作结果为负数A.OF=1B.SF=1C.ZF=1D.CF=118. 下列答案中(D)反映了指令操作结果有进位A.OF=1B.SF=1C.ZF=1D.CF=119.取指令时,默认的段寄存器是__________;堆栈操作时,默认的段寄存器是__________。

汇编语言例题

汇编语言例题

典型例题(与考试题型,考试范围相近)1.应用程序具有3个基本段,可执行指令应该保存于( A )。

A) 代码段B) 数据段C) 堆栈段D) 附加段2. 8位补码F3H要扩展成16位补码应该是( D ),这样其真值才不变。

A) F0F3H B) 00F3H C) 10F3H D) FFF3H3. “mov [ebx+8],eax”指令的目的操作数采用( C )寻址方式。

A) 存储器间接B) 寄存器C) 寄存器相对D) 立即数4. 执行“sar ebx,1”指令后,ebx最高D31位一定等于( D )A) 0 B) 1 C) D0位D) D30位5. 在代码段内的-128~127个字节前后范围的跳转,可以用( C )类型名表示。

A) WORD B) DWORD C) SHORT D) FAR6. 在Windows控制台环境,在当前光标显示信息应该使用( B )函数(功能)。

A) ReadConsole B) WriteConsoleC) MessageBox D) GetStdHandle7.汇编语言源程序经汇编后不能直接生成( C )A) OBJ文件B) LST文件C) EXE文件D) CRF文件8.在ADD指令中,两个操作数的物理位置不可以安排在( A )中。

A) 两个主存储单元B) 一个主存储单元和一个数据寄存器C) 两个数据寄存器D) 一个堆栈单元和一个数据寄存器9.假定ax=6987h,执行指令cmp ax,0eb30h后,则标志位CF和OF的状态( C )。

A)0,0 B) 0,1 C) 1,0 D) 1,110.假定esp=00120100h,eax=1f6c2107h,执行指令push ax后,存放数据07h的物理地址是( C )。

A) 00120104h B) 00120101h C) 001200fch D) 001200ffh11.下列对标志寄存器中标志位产生影响的指令是( B )A) jmp done B) shl eax, 2C) call subp D) not eax12. 假设CL=98H, 执行“MOVSX DX, CL”后,DX=( D )A) F098H B) 0098H C) 1098H D) FF98H13. “mov 80h[esi], eax”指令的目的操作数采用( C )寻址方式。

第6章 子程序结构(2)

第6章   子程序结构(2)

sumc add al,[bx] ;求和:AL←AL+DS:[Bx] inc bx loop sumc pop cX ;恢复寄存器 pop bx pop bp ret cheeksume endp coseg ends end start
上述程序执行过程中利用堆栈传递参数的情况如 图所示。进入子程序后,设置基址指针BP等于 当前堆栈指针 SP ,这样利用 BP 相对寻址 ( 缺省 采用堆栈段 SS) 可以存取堆栈段中的数据。主 程序压人了2个参数,使用了堆栈区的4个字节; 为了保持堆栈的平衡,主程序在调用CALL指令 后用一条 "add sp , 4” 指令平衡堆栈。平衡堆 栈也可以利用子程序实现,则返回指令采用 "ret 4”,使sp加4。
1.通过寄存器传递参数 简单方便,但REG数量有限,要求传递参数多时 不宜采用。需预先约定传递参数的通用REG, 调用程序将要传递的参数送到约定REG中。
例2a:设array是10个元素的数组,每个元素是8 位数据。试用子程序计算数组元素的校验和, 并将结果存人变量result中。所谓“校验和” 是指不记进位的累加,常用于检查信息的正确 性。
data count array result data coseg
segment equ 10 ;数组元素个数 db 12h,25h,ofoh,oa3h,3,68h,71h,ocah,oflh,90h ;数组 db ? ;校验和 ends segment assume ds:data,cs:coseg main proc far start: mov ax,data mov ds,ax mov bx,offset array ;bx←数组的偏移地址 mov cx,count ;CX←数组的元素个数 call checksuma ;调用求和过程 mov result,al ;处理出口参数 main endp ;计算字节校验和的通用过程 ;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数 ;出口参数:AL=校验和 ;说明:除AX/BX/CX外,不影响其他寄存器

实验8汇编实验

实验8汇编实验

.实验八编写子程序(4学时)在本次实验中,我们将编写3个子程序,通过它们来认识几个常见的问题和掌握解决这些问题的方法。

同前面的所有实验一样,这个实验室必须独立完成的,在后面的课程中,将要用到这个实验中编写的3个子程序。

1、显示字符串显示字符串是下现实工作中经常要用到的功能,应该编写一个通用的字程序来实现这个功能。

我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。

该子程序描述如下:名称:show_str功能:在指定位置用指定颜色显示一个用0结束的字符串。

参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si 指向字符串的首地址。

返回:无应用举例:在屏幕的8行3列,用绿色显示data段中的字符串。

assume cs: codedata segmentdb ‘Welcome to masm!’, 0data endscode segmentstart: mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0call show_strmov ax, 4c00hint 21hshow_str: :::code endsend start提示:(1)子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转化为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系;(2)注意保存子程序中用到的相关寄存器;(3)这个子程序的内部处理和显存的结构密切相关,但是向外提供了与显存结构无关的接口。

通过调用这个子程序,进行字符串的显示时可以不必了解显存的结果,为编程提供了方便。

在实验中,注意体会这种设计思想。

. data segmentdb "Welcome to masm!"data endsstack segmentdb "Welcome to masm!"stack endscode segmentstart:mov dh, 8mov dl, 3mov cl, 2mov ax, datamov ds, axmov si, 0mov ax,0B800hmov es,axmov ax, stackmov ss, axmov sp,10hcall show_strmov ax, 4c00hint 21hshow_str:push dxpush cxmov al,160dec dhmul dhmov bx,axadd dx,siadd dl,dladd bl,dlmov cl,[si]mov ch,0jcxz okmov es:[bx],clpop cxmov es:[bx+1],clinc sipop dxjmp short show_strok:pop cxpop dxretcode endsend start2、解决除法溢出的问题前面讲过,div指令可以做除法。

汇编语言习题 (3)

汇编语言习题 (3)

第4章自测练习一、选择题(四选一)1.设计子程序应该采用的一对伪指令是___________。

A segment/endsB start/end startC proc/endpD macro/endm2.主程序将它的参数带给子程序,这个参数被称为。

A 入口参数B 出口参数C 寄存器参数D 存储器参数3.对应主程序CALL指令调用子程序,子程序结束通常采用_________ 指令返回主程序。

A jmpB iretC hltD ret4.下面程序段条件转移语句发生跳转的条件是AL=________ 。

cmp al,0fbhjnl nextA 80hB 8fhC 0f0hD 0ffh5.如下程序段中的“dec cx”指令执行了_________ 次。

mov cx,4jcxz nextagain:dec cxjnz againnext:...A 0B 1C 4D 5二、填空题1.程序的基本结构有、、和子程序四种。

2.子程序可以通过____________、___________、__________等传递参数.3.循环结构的程序通常由、和三部分组成。

4.如果主程序调用与它处在同一个代码段的子程序,这是调用。

5.下面程序段完成将存储单元abcd1中一个压缩型BCD码拆成两个非压缩型BCD码,高位BCD码存放在abcd3单元,低位BCD码存放在abcd2单元,再分别转换为对应的ASC Ⅱ码。

请将程序补充完整:mov al,abcdlmov cl,4Or al,30hmov abcd3,almov al,abcdlorl al,30hmov abcd2,al6.在下述程序段的每一空框内填人一个语句,以实现如下功能:字节变量string中存放着一个字符串,以0DH为结束标志,求串长度并送字变量count中。

lea si,stringxor cx,cxgoon:cmp al,[si]inc cx__________jmp goonnext:mov cont,cx7.阅读如下子程序,说明它的功能:sumary procxor ax,axxor dx,dx ;执行后,DX= 。

第二章--第四节--汇编语言程序设计方法(二)

第二章--第四节--汇编语言程序设计方法(二)
VCC GND 31 19 C2 3 0p F Y1 6 . 00 0M HZ 18 E A/VP X1 AT 8 9C5 1 P0. 0 P0. 1 P0. 2 P0. 3 P0. 4 P0. 5 P0. 6 P0. 7 P2. 0 P2. 1 P2. 2 P2. 3 P2. 4 P2. 5 P2. 6 P2. 7 RD WR PSE N AL E /P T XD RXD 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 17 16 29 30 11 10 VCC R9 4 . 7K GND SW
A+30HA A(22H) 结束
R0
0010 0000
END
BCD码十进制转换成二进制
例:假如在内部RAM40H单元中存储有一个压缩BCD编码 的两位十进制数,设计一段程序把这个数转换成二进制数 并存入41H单元中。 解题思路: (40H) 16 商为二进制的高四位
余数
余为二进制的低四位
将高四位乘以0AH,再加上低四位即可。
数据排序程序 例:将片内RAM中20H-27H中的数据按照从小到大的顺序重新排列。 解题思路:见下图
RAM地址 原始数据
20H 66H
21H 11H
22H 10H
23H 34H
24H 67H
25H 01H
26H 89H
27H A0H
1
2 3 4 5 6 7
01H
01H 01H 01H 01H 01H 01H
11H
10H 10H 10H 10H 10H 10H
10H
11H 11H 11H 11H 11H 11H
34H
34H 34H 34H 34H 34H 34H
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;不能整除100则是闰年,转
;除以400
DIV BX
CMP DX,0 JZ lab2
;除以400
lab2:INC BYTE PTR [day] ;是闰年,把天数加1,设置出 口参数 lab1 : POP DX POP CX POP BX
POP AX
RET Jud1: ENDP
5.用堆栈传递 参数传递不仅要在传递者之间约定数据的类型,还要
【解】子程序清单如下:
;功能:判断一个年份是否为闰年 ;入口:AX = 公元年份
;出口:CF,1表示是闰年,0表示非闰年
;破坏寄存器:AX jud PROC NEAR PUSH BX PUSH CX PUSH DX MOV CX,AX MOV DX,0 ;临时保存年份值
MOV BX,4
DIV BX CMP DX,0 JNZ lab1 MOV AX,CX MOV BX,100 DIV BX CMP DX,0 JNZ lab2 MOV AX,CX MOV BX,400 DIV BX CMP DX,0 JZ lab2
对于DX中存放的年份值,需要先放到AX中,才能调用 子程序jud,然后以调用返回后的CF值决定是否把t数组中表 示2月份天数的[t+1]加1。程序段如下: MOV AX,DX CALL jud ADC BYTE PTR [t+1],0 ;原值+0+CF
4.用数据段中已定义的变量存放参数 用数据段中定义的变量作为参数传递的载体也是一种 常用方法。这种方法要求子程序与调用者之间约定好以哪 个变量或哪几个变量进行参数传递。具体做法是:对于用 作入口参数的变量,调用者在调用子程序的CALL指令之前, 先把变量赋以一定的值,然后以CALL指令转到子程序执行, 子程序则取出该变量中的数据进行处理;对用作出口参数
lab: POP BP
RET _max ENDP
;恢复寄存器BP的原值
6.3.3 带参数的子程序
【例6.5】编写一个子程序,对一个无符号的字型数组的
各元素求和。在调用子程序之前,已把数组的段地址放在
DS中,起始偏移地址放在寄存器SI中,数组元素个数(>0)放 在CX中。要求子程序把计算结果以双字的形式存放,高位
放在DX中,低位放在AX中。
【解】 sum PROC NEAR
1.通用寄存器传值
2.通用寄存器传地址
3.标志寄存器传递逻辑型数据 【例6.6】编写一个子程序,以放在 AX中的公元年份为 入口参数,判断该年是否为闰年。 另有一个应用程序,它已定义了一个字节型数组 t,依 次存放着12个月的每月天数,其中2月份的天数是 28。应用 程序已经在 DX中存放了年份值,利用前面编写的子程序, 编写程序段调整数组t中2月份的天数。
RET
sum ENDP
子程序说明应该包含如下4个部分:
(1)子程序的功能。用来指明该子程序完成什么样的 操作。 (2)入口参数。说明调用子程序前应该把什么样的数 据放在什么地方。
(3)出口参数。说明调用后从什么地方取得处理结果。
(4)破坏的寄存器。指出子程序中哪些寄存器没有被
保护。
6.3.4 参数传递的方法
约定参数存放地。如果约定用通用寄存器放参数,有可
能会出现寄存器不够使用的情况。而约定用变量存放参 数又要求在子程序和调用程序之外再写出变量定义,灵
活性较差。用堆栈传递参数就可以克服这些缺点。对于
调用者来说,传递给子程序的数据可以按字型(如果不 是字型,先要转换成字型)用PUSH指令压入堆栈中;对
于子程序来说,如何准确地取到栈中数据就是关键性问
_max PROC NEAR
PUSH BP MOV BP,SP MOV AX,WORD PTR [BP+6] ;取第1个参数到AX CMP AX,WORD PTR [BP+4] ;与第2个参数比较 JGE lab MOV AX,WORD PTR [BP+4] ;取第2个参数到AX ;暂时保存寄存器BP的值
MOV DX,0 MOV BX,4
DIV BX CMP DX,0 JNZ lab1 MOV AX,[year] MOV BX,100 DIV BX CMP DX,0 ;除以4 ;不能整除4则不是闰年,转 ;取回年份值 ;除以100
JNZ lab2 MOV AX,[year] MOV BX,400 DIV BX
的变量,也有赋值与取值两个阶段,子程序进行数据处理
后,把处理结果放到约定好的变量中,然后以RET指令返 回调用者,调用者可以从变量中取出处理结果使用。
【例6.7】用变量传递参数,编写例6.6要求的子程序。 【解】 ;功能:根据一个年份是否为闰年,设置该年2月份的天数 ;入口:DS段中的字型变量year = 公元年份 ;出口:DS段中的字节型变量day = 该年2月份天数 ;破坏寄存器:无 jud1 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX MOV BYTE PTR [day],28 MOV AX,[year]
题。下面的例6.8用一个实际例子说明在子程序中取得参 数值的具体方法。
【例 6.8 】用堆栈传递入口参数,编写子程序,把接收
的两个带符号整数中大的一个作为结果,出口参数放在AX 中。 【解】 ;功能:求两个带符号整数中大的一个 ;入口参数:调用前把两个带符号整数入栈 ;出口参数X
AX,AX DX,AX
;保护用到的寄存器BX
;求和前先把存放结果的DX,AX清0
MOV s1: ADD ADC INC INC LOOP POP
BX,AX AX,[BX+SI] ;把一个元素加到AX中 DX,0 BX BX s1 BX ;恢复寄存器BX的值 ;BX加2,指向数组的下一元素 ;若有进位,DX加1
;除以4,为预防溢出,用双字除以字
;不能整除4则不是闰年,转 ;取回年份值 ;除以100 ;不能整除100则是闰年,转
;除以400
lab1:CLC JMP lab3 lab2:STC lab3:POP DX POP CX POP BX RET jud ENDP
;把CF清0表示非闰年,设置出口参数 ;把CF置1表示是闰年,设置出口参数
相关文档
最新文档