⑴ 匯編語言——子程序設計分析
入口參數:主程序提供給子程序用來加工的數據,子程序的輸入數據
出口參數:子程序返回給主程序的處理結果的數據,子程序的輸出數據
現場:主程序在跳轉子程序前使用到的資源,包括:寄存器、存儲器里的數據
保護:避免子程序在執行時修改寄存器內存,造成返回主程序後現場變動,從而導致程序運行錯誤,故需要對現場保護
注意點:
⑵ 匯編 子程序設計
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