⑴ 汇编语言——子程序设计分析
入口参数:主程序提供给子程序用来加工的数据,子程序的输入数据
出口参数:子程序返回给主程序的处理结果的数据,子程序的输出数据
现场:主程序在跳转子程序前使用到的资源,包括:寄存器、存储器里的数据
保护:避免子程序在执行时修改寄存器内存,造成返回主程序后现场变动,从而导致程序运行错误,故需要对现场保护
注意点:
⑵ 汇编 子程序设计
http://hi..com/shuangsushuangfei/blog
里面有两个程序,你综合一下就行了
⑶ 汇编语言循环程序设计和子程序设计原理
一个标准的循环程序应由以下四部分组成:循环准备、循环体、循环修改、循环版控制。
循环准备是为权循环做准备的,有循环次数和起始地址;循环体是循环程序解题所需的核心程序,题目要完成的功能在此进行;循环修改用来更新某些数据或修正循环控制的参数;循环控制是循环是否结束的控制。
如果在一个程序中的多个地方、或多个程序中的多个地方要用同一段程序,那么可以将这段程序单独设计,存放在某一存储区域,每当需要执行这段程序时,就调用指令转到这段程序去,执行完毕,再返回原来的程序。这段独立出来的程序叫做子程序或过程,调用它的程序称为主程序。采用子程序。使得设计结构清楚,程序的维护方便。当主程序需要执行这个子程序功能时,通过调用该子程序,执行子程序,子程序完成后返回主程序调用处,继续主程序后面的指令的执行。与子程序有关的指令有子程序的调用CALL、子程序返回RET两条指令。
⑷ 汇编语言 子程序设计
数放在ax里面
MOV AX,DATAS
MOV DS,AX
mov ax,0f2h
mov cl,4
push ax
shl ax,cl
cmp ah,9
ja n1
add ah,30h
mov dl,ah
mov ah,02h
int 21h
jmp n2
n1:
add ah,37h
mov dl,ah
mov ah,02h
int 21h
n2:
pop ax
and al,0fh
cmp al,9
ja n3
add al,30h
mov dl,al
mov ah,02h
int 21h
jmp n4
n3:
add al,37h
mov dl,al
mov ah,02h
int 21h
n4:
mov ah,4ch
int 21h
上面是16进制输出
⑸ 汇编 子程序设计
实验七 子程序设计(1)
(一)实验目的
1、掌握子程序的设计方法和调用方式
2、深刻认识堆栈在子程序设计中所起的作用
3、掌握子程序调试的技巧。
(二)实验设备
同实验二
(三)实验内容和要求
实验内容:
内存中有一字节型无符号数缓冲区Data,长度为100。将Data缓冲区显示到屏幕上,分别用二进制,十进制和十六进制。要求:
1.编写子程序将一个字节数用二进制进行显示,参数用内存数传递;
2.编写子程序将一个字节数用十进制进行显示,参数用寄存器数传递;
3.编写子程序将一个字节数用十六进制进行显示,参数用堆栈传递;
(四)预习要求
同实验二
(五)实验步骤
同实验二
(六)实验结果分析
1、理解3种参数传递方式各有什么特点
2、绘制一般子程序的结构。
(七)编程提示
(a) 二进制显示可采用移位并判断该位的方式进行。
(b) 十进制数采用除以10取商的方式。
(c) 十六进制数可利用二进制转换位十六进制的方法进行。
(d) 注意去掉最高位的“0”。
目前只做了1和2
DSEG segment
data db 101,1,2,3,4,5,6,7,8,9,90 p(5)
msg db ',','$'
msg1 db 'please choose operation','$'
msg2 db '0:bit-data; 1:dec-data; 2:hex-data','$'
addrtbl dw bdata,ddata,hdata
dseg ends
cseg segment
assume cs:cseg,ds:dseg
start:
mov ax,dseg
mov ds,ax
lea dx,msg1
mov ah,9
int 21h
mov dl,0ah
mov ah,2
int 21h
lea dx,msg2
mov ah,9
int 21h
mov ah,1
int 21h
sub al,30h
mov ah,0
shl ax,1
mov bx,ax
jmp addrtbl[bx]
mov si,0
ddata:
mov dl,' '
mov ah,2
int 21h
mov cx,100
nextt: mov bl,data[si]
mov bh,0
inc si
call progdec
loop nextt
jmp done
hdata:
bdata:
call progbit
done: mov ah,4ch
int 21h
progdec proc
push ax
push dx
push bx
mov dl,100
mov ax,bx
div dl
cmp al,0
jne hundred
mov ax,bx
mov dl,10
div dl
cmp al,0
jne ten
mov dl,bl
add dl,30h
mov ah,2
int 21h
jmp exit
ten:
mov dl,al
add dl,30h
mov bx,ax
mov ah,2
int 21h
mov dl,bh
add dl,30h
mov ah,2
int 21h
jmp exit
hundred:
mov dl,al
mov bx,ax
add dl,30h
mov ah,2
int 21h
mov ah,bh
mov al,ah
mov ah,0
mov dl,10
div dl
mov dl,al
add dl,30h
mov bx,ax
mov ah,2
int 21h
mov dl,bh
add dl,30h
mov ah,2
int 21h
jmp exit
exit:
mov dl,' '
mov ah,2
int 21h
pop bx
pop dx
pop ax
ret
progdec endp
progbit proc
push ax
push bx
push cx
push dx
push si
mov si,0
ok:
mov bh,data[si]
mov cx,8
ok1: mov dl,30h
shl bh,1
jnc skip
inc dl
skip: mov ah,2
int 21h
loop ok1
next: lea dx,msg
mov ah,9
int 21h
inc si
cmp si,100
jb ok
pop si
pop dx
pop cx
pop bx
pop ax
ret
progbit endp
cseg ends
end start
⑹ 汇编语言程序设计实验-----子程序设计
data segment
string db 'abc$'
text db 'hiaabckabiiabcyyfabcds$'
output db 'count=$'
count db 3
db ?
db 3 p(?)
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov bx,offset count
mov cl,0
mov si,offset string
mov di,offset text
mov al,[si]
l0: mov ah,[di]
cmp ah,'$'
jz l4
cmp ah,al
jz l1
inc di
jmp l0
l1: inc si
inc di
mov al,[si]
mov ah,[di]
cmp al,'$'
jz l3
cmp ah,'$'
jz l4
cmp ah,al
jnz l5
jmp l1
l3: inc cl
l5: mov si,offset string
mov al,[si]
jmp l0
l4: mov ah,09h
mov dx,offset output
int 21h
mov dl,0dh ;回车
mov ah,02h
int 21h
mov dl,0ah ;换行
mov ah,02h
int 21h
add cl,30h
mov [bx],cl
inc bx
mov ah,'$'
mov [bx],ah
mov ah,09h
mov dx,offset count
int 21h
mov ah,4ch
int 21h
code ends
end start
微机作业还是自己动手比较好
⑺ 在汇编程序设计中,请说明是主程序什么是子程序并图形描述主程序与子程序之
子程序实际上是主程序的一部分,由于其功能相对明确,写成子程序,显得结构清晰,它可以一次或多次被主程序调用,多次调用的话,还节省了程序空间。
⑻ 汇编语言程序设计中,子程序设计时的现场保护和恢复是如何实现的举例说明。
从别人回答中摘的:
常见的CPU的CALL指令(“调用”指令)的功能,就是以下两点:
(1)将下一条指令的所在地址(即当时程序计数器PC的内容)入栈,
(2)并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)。
而子程序结尾处通常都要编写一条RET指令(“返回”指令),RET指令的功能就是一条:
从栈中取出一条数据送入PC。
从上面叙述可以看出,正常情况下,RET指令从栈中取出的一条数据,也就是当初被CALL指令所入栈的下一条指令的所在地址。
因此,RET指令后,CPU的下一条指令就回去执行当初的CALL指令的下一条了。
CALL L1
调用子程序即过程调用,为了保护现场,会压栈保存断点,段内调用,说明L1的属性为NEAR,只需保存IP(pc值),SP=SP-2,但是如果是段间调用则需要保存CS和IP
那么SP=SP-4.不管怎么样,在执行完RET后,要恢复现场,即弹出断点,SP=SP+2
(段间调用SP=SP+4)
也就是说过程调用前后,SP总体看不会变,但是其堆栈发生了一系列变化。
SP数值没变!
⑼ 汇编语言子程序是如何定义的
这样定义的:
子程序名 PROC NEAR|FAR
.
.
RET
子程序名 ENDP
子程序名相当于标号,表示本过程的符号地址。过程有NEAR和FAR两种类型,FAR型的过程可供段间调用,NEAR型过程仅供段内调用。
在一个过程中,至少要有一条返回指令RET,它可以书写在过程中的任何位置,但是过程执行的的最后一条指令一定是RET。
注意事项
一、子程序调用指令
格式:CALL [NEAR PTR] 子程序名
CALL指令的两个作用,1.将断点地址(CALL指令的下一条指令地址)压栈保存,2.转去子程序执行。
[NEAR PTR]可以省略。
二、返回指令
格式:RET [N]
指令作用:实现子程序执行完后返回主程序的指令。从堆栈栈顶弹出一个字数据(段内调用)送入IP作为返回地址。N是立即数,执行完RET之后,再将SP增加N,也叫“平栈”。
⑽ 汇编用子程序设计计算N! N值无限制
;输入0-40,求立方,并显示
;
code segment
assume cs:code,ds:code
org 100h
start:
push cs
pop ds
Again:lea dx,Tips1
mov ah,9
int 21h ;显示提示
xor bp,bp ;BP清0
mov cx,2
@In:mov ah,0
int 16h ;无回显输入
cmp al,1bh ;Esc退出程序
jz quit
cmp al,0dh
jz Show ;回车结束输入
cmp al,'0'
jb @In
cmp al,'9';数据校验
ja @In
mov ah,0eh
int 10h ;显示有效输入
and al,0fh
mov ah,0
xchg ax,bp
mov bl,10 ;BP×10
mul bl
add bp,ax ;BP+AX
loop @In
Show:
cmp bp,40
jbe Q4
lea dx,CuoWu
mov ah,9
int 21h
jmp quit
Q4:
xor dx,dx
mov ax,bp
mul bp
mul bp
mov dx,ax
mov CUBE,ax
push ax
mov al,'='
mov ah,0eh
int 10h
pop ax
call binidec
jmp start
quit:
mov ah,0
int 16h
mov ah,4ch
int 21h
Tips1 db 0dh,0ah,'Input(0-40),Esc to Quit: $'
CuoWu db 'Input Error!$'
CUBE dw 0
binidec:
mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
ret
dec_div:
mov ax,dx
mov dx,0
div cx
mov bx,dx
add al,30h
mov ah,0eh
int 10h
ret
code ends
end start