vb编写一个能对一维数组进行升序排列的子程序过程!

vb编写一个能对一维数组进行升序排列的子程序过程!,第1张

'冒泡排序,最简单的排序算法,下面这个子过程是对Integer类型的数组升序排序,如果需要其他类型的数据,可以将其中的Integer替换掉

Sub MaoPaoSort(a() As Integer)

Dim i As Integer

Dim j As Integer

Dim temp As Integer

For i = LBound(a()) To UBound(a()) - 1

For j = LBound(a()) To UBound(a()) - 1

If a(j) > a(j + 1) Then

temp = a(j)

a(j) = a(j + 1)

a(j + 1) = temp

End If

Next

Next

End Sub

SUB1 PROC NEAR

MOV BX,0

MOV CX,0

MOV AH,0

L1:

MOV DX,0

MOV SI,10

DIV SI

PUSH DX

INC CX

CMP AX,0

JNZ L1

L2:

POP DX

MOV AL,4

MUL CL

PUSH CX

MOV CL,AL

SHL DX,CL

ADD BX,DX

POP CX

LOOP L2

MOV CL,4

ROR BX,CL

RET

SUB1 ENDP

;在主程序中调用方法:

;如: MOV AL,7BH ;123

; CALL SUB1

;结果在BX中返回:0123

function是函数,sub是子程序,都可以传递参数,但函数有返回值,子程序没有\x0d\function 可以用自身名字返回一个值,sub 需定义别的变量,用传址方式传回值。 \x0d\ Sub 过程与Function 过程的区别: \x0d\ 1. Sub 过程定义时无需定义返回值类型,而Function 过程一般需要用“As 数据类型” 定义函数返回值类型。 \x0d\ 2. Sub 过程中没有对过程名赋值的语句,而Function 过程中一定有对函数名赋值的语句。 \x0d\ 3. 调用过程:调用 Sub 过程与 Function 过程不同。调用 Sub 过程的是一个独立的语句,而调用函数过程只是表达式的一部分。Sub 过程还有一点与函数不一样,它不会用名字返回一个值。但是,与 Function过程一样,Sub 过程也可以修改传递给它们的任何变量的值。 \x0d\ 4. 调用 Sub 过程有两种方法: \x0d\ 以下两个语句都调用了名为 MyProc 的 Sub 过程。 \x0d\ Call MyProc (FirstArgument, SecondArgument) \x0d\ MyProc FirstArgument, SecondArgument \x0d\ 注意当使用 Call 语法时,参数必须在括号内。若省略 Call 关键字,则也必须省略参数两边的括号。\x0d\\x0d\区别就是:子过程没有返回值,函数过程有返回值。\x0d\子过程用于编写一些代码的集合,函数过程用于建立函数。我兴个例吧。\x0d\例如,我要做多处要做如下事件,我只要编写一个子过程,在其它事件下,我只要把子过程的名称写下就行了。\x0d\Private Sub ABC(A As Integer, B As Integer, C As Integer)\x0d\ A = 1\x0d\ B = 1\x0d\ C = 1\x0d\End Sub\x0d\ \x0d\Private Sub Command1_Click()\x0d\ABC '按扭一就调用了该子过程了,而不用再写子过程的代码。\x0d\End Sub\x0d\ \x0d\Private Sub Command2_Click()\x0d\ABC '按扭二就调用了该子过程了,而不用再写子过程的代码。\x0d\End Sub\x0d\ \x0d\Private Sub Command3_Click()\x0d\ABC '按扭三就调用了该子过程了,而不用再写子过程的代码。\x0d\End Sub\x0d\ \x0d\函数例子:\x0d\如我要多处运用C=A+B这个算法,我可以编写这个函数:\x0d\Private Function C (A As Integer, B As Integer) As Integer\x0d\C = A + B\x0d\End Function\x0d\ \x0d\Private Sub Command1_Click()\x0d\Text1Text = C(5, 3) '这里就运用了函数C来计算5+3了。\x0d\End Sub\x0d\ \x0d\Private Sub Command2_Click()\x0d\Text1Text = C(4, 2) '这里就运用了函数C来计算4+2了。\x0d\End Sub

MAIND SEGMENT

NUM DB 30 DUP()

MAX DB

MIN DB

MESG1 DB 'MAX:$'

MESG2 DB 'MIN:$'

MAIND ENDS

MAINC SEGMENT

MAIN PROC FAR

ASSUME CS:MAINC,DS:MAIND

START: PUSH DS

XOR AX,AX

PUSH AX

MOV AX,MAIND

MOV DS,AX

CALL KEYIN

CALL S_MAX

CALL S_MIN

JMP MAIN

RET

MAIN ENDP

;-----------------------------

KEYIN PROC NEAR

MOV BL,0

MOV DI,OFFSET NUM

ONCEA: MOV [DI],BL

INC DI

NEWCHAR: MOV AH,01H

INT 21H

CMP AL,0

JZ ONCEA

CMP AL,0DH

JZ EXIT1

SUB AL,30H

JL EXIT2

CMP AL,10

JL TRANS

SUB AL,07H

CMP AL,0AH

JL EXIT2

CMP AL,10H

JGE EXIT2

TRANS: MOV CL,4

SHL BL,CL

ADD BL,AL

JMP NEWCHAR

EXIT1: MOV [DI],BL

INC DI

MOV BYTE PTR[DI],24H

EXIT2: RET

KEYIN ENDP

;----------------------------------------

S_MAX PROC NEAR

MOV DI,OFFSET NUM

MOV DX,OFFSET MESG1

MOV AH,09

INT 21H

BIGER: MOV BL,[DI]

GO: INC DI

CMP [DI],24H

JZ CHANGE

CMP BL,[DI]

JBE BIGER

JMP GO

CHANGE: MOV DI,OFFSET MAX

CALL DISP

RET

S_MAX ENDP

;-----------------------------------------

S_MIN PROC NEAR

MOV DI,OFFSET NUM

MOV DX,OFFSET MESG2

MOV AH,09

INT 21H

SMALL: MOV BL,[DI]

GO1: INC DI

CMP [DI],24H

JZ CHANGE1

CMP BL,[DI]

JAE BIGER

JMP GO1

CHANGE1: MOV DI,OFFSET MIN

CALL DISP

RET

S_MIN ENDP

;----------------------------------------

DISP PROC NEAR

MOV [DI],BL

MOV AL,BL

SHR AL

CALL EXZIB

AND BL,0FH

MOV AL,BL

CALL EXZIB

RET

DISP ENDP

;------------------------------------------

EXZIB PROC NEAR

CMP AL,09H

JLE NEXT

ADD AL,37H

JMP DOWN

NEXT: ADD AL,30H

DOWN: MOV DL,AL

MOV AH,02H

INT 21H

RET

EXZIB ENDP

;--------------------------------------------

MAINC ENDS

END START

DATA SEGMENT

DATA1 DB 5 DUP()

DATA2 DB 5 DUP()

DATA3 DB 5 DUP()

NUM1 DB

DATA ENDS

ASTACK SEGMENT STACK

DB 40H DUP()

ASTACK ENDS

CODE SEGMENT

ASSUME DS:DATA,SS:ASTACK,CS:CODE

START: MOV CX,05H

MOV BX,04H

INPUT1: MOV AH,01H

INT 21H

MOV DATA1[BX],AL

MOV DATA3[BX],AL

DEC BX

LOOP INPUT1

MOV DL,'-'

MOV AH,02H

INT 21H

MOV CX,05H

MOV BX,04H

INPUT2: MOV AH,01H

INT 21H

MOV DATA2[BX],AL

DEC BX

LOOP INPUT2

CLC

MOV BX,0

MOV NUM1,0

MOV CL,5H

MOVE: MOV AL,DATA1[BX]

MOV AH,AL

SUB AL,DATA2[BX]

CLC

SUB AL,NUM1

AAS

MOV DH,0

MOV NUM1,DH

CMP AH,DATA2[BX]

JAE NN

MOV DH,01H

MOV NUM1,DH

NN: ADD AL,30H

MOV DATA1[BX],AL

INC BX

LOOP MOVE

;------------------------负��数时

MOV DL,'='

MOV AH,02H

INT 21H

MOV AL,0

CMP NUM1,AL

JBE NEXT

;---------

MOV DL,'-'

MOV AH,2

INT 21H

MOV CX,05H

MOV BX ,0

MOV NUM1,0

NOVE: MOV AL,DATA2[BX]

MOV AH,AL

SUB AL,DATA3[BX]

CLC

SUB AL,NUM1

AAS

MOV DH,0

MOV NUM1,DH

CMP AH,DATA3[BX]

JAE XN

MOV DH,01H

MOV NUM1,DH

XN: ADD AL,30H

MOV DATA1[BX],AL

INC BX

LOOP NOVE

NEXT: MOV CX,05H

MOV BX,04H

OUTPUT: MOV DL,DATA1[BX]

MOV AH,02H

INT 21H

DEC BX

LOOP OUTPUT

MOV AH,01H

INT 21H

CODE ENDS

END START

HLT

微型机原理与程序设计微型机原理与程序设计程序举例顺序结构例例2-3-2 计算计算x(yz)vx的值。的值。设x,y,z,v为十六位有符号数,分别存放在X,Y,Z,V字单元,商和余数分别存入A,B字单元。DSEGSEGMENT;定义数据段XDW4FHYDW245HZDW3456HVDW5678HADWBDWDSEGENDS微型机原理与程序设计微型机原理与程序设计CSEGSEGMENT;定义代码段ASSUMECS:CSEG,DS:DSEG0000B8CA0BSTART:MOVAX, DSEG00038ED8MOVDS, AX0005A10200MOVAX, Y000803060400ADDAX, Z;计算y+zF72E0600IMULV;计算v00108BC8MOVCX, AX00128BDAMOVBX, DX;结果暂存0014A10000MOVAX, X001799CWD;字变双字00182BC1SUBAX, CX;计算加法1BD3SBBDX, BXF73E0000IDIVX;计算除法0020A30000MOVA, AX;保存商002300MOVB, DX;保存余数0027BMOVAX, 00H;程序结束CD21INT21HCSEGENDSENDSTART程序举例顺序结构微型机原理与程序设计微型机原理与程序设计程序举例分支结构单分支结构-在某种确定的条件下只执行两个分支中的一个分支,而另一个分支将不被执行多分支结构-针对不同条件引出多种处理分支微型机原理与程序设计微型机原理与程序设计程序举例分支结构例例2-3-3 若数据段定义的字节变量若数据段定义的字节变量X是正数,则计算它的相反数,并且赋值给是正数,则计算它的相反数,并且赋值给X变量变量;否则不变。;否则不变。SKSGSEGMENTSTACKSTACK;定义堆栈段STKDW32 DUP ()SKSGENDSDASGSEGMENT;定义数据段XDB93HDASGENDSCOSGSEGMENT;定义代码段ASSUMECS:COSG,DS:DASG,SS:SKSG0000B8CE0BBEGIN:MOVAX,DASG00038ED8MOVDS, AX0005B8CA0BMOVAX,SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK微型机原理与程序设计微型机原理与程序设计程序举例分支结构000DA00000MOVAL, X;取数据到AX寄存器001000CMPAL,0;判断数据正负00127E05JLEEXIT0014F6D8NEG;若CV为正,则取反0016A20000MOVX, AL0019BEXIT:MOVAX,00HCD21INT21HCOSGENDSENDBEGIN微型机原理与程序设计微型机原理与程序设计程序举例分支结构例例2-3-4 编写完整程序,比较两个字符串编写完整程序,比较两个字符串STR1与与STR2所含字符是否完全相同,所含字符是否完全相同,若相同则显示若相同则显示“MATCH”,若不相同则显示,若不相同则显示“NO MATCH”。微型机原理与程序设计微型机原理与程序设计程序举例分支结构SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW32 DUP(0)SKSGENDSDASGSEGMENT;设置数据段CREQU13LFEQU10STROUTDBTHE RESULT IS:,$STRMDBMATCH,CR,LF,$ STRNMDBNO MATCH,CR,LF,$STR1DBLEN1DB$-STR1STR2DBCHEERLEN2DB$-STR2DASGENDSCOSGSEGMENT;设置代码段ASSUMESS:SKSG,DS:DASG, ES:DASG, CS:COSG0000B8CE0B:MOVAX, DASG00038ED8MOVDS, AX0005B8CA0BMOVAX, SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK000D8EC0MOVES, AX微型机原理与程序设计微型机原理与程序设计8D160000LEADX, STROUT;取原数据首址0013B409MOVAH, 9;显示字符串0015CD21INT21H00170E2700MOVCL, LEN1;取数据串数据001B0E2D00CMPCL, LEN27519JNZOUTNM0021FCCLD00228D362200LEASI, STR1;取字符串1首址00268D3E2800LEADI, STR2;取字符串2首址32EDXORCH, CHF6REPECMPSB;数据串比较002EJNZOUTNM00308D00LEADX, STRM0034B409MOVAH, 90036CD21INT21H0038EB08JMPEXIT8D161700OUTNM:LEADX, STRNM003EB409MOVAH, 90040CD21INT 21H0042BEXIT:MOVAX, 00H0045CD21INT21HCOSGENDSENDMAIN程序举例分支结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构例例2-3-5 接收从键盘输入的字符,判别该字符是否为字母、数字或非字母也非数字类接收从键盘输入的字符,判别该字符是否为字母、数字或非字母也非数字类字符。若为字母,屏幕输出字符。若为字母,屏幕输出LETTER;若为数字,屏幕输出;若为数字,屏幕输出NUM;若非字母也非数字;若非字母也非数字类字符,则输出类字符,则输出OTHERS。微型机原理与程序设计微型机原理与程序设计程序举例顺序结构SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW32 DUP(0)SKSGENDSDASGSEGMENT;设置数据段CREQU13LFEQU10CHARINDBPLEASE INPUT ACHAROUTDBTHE RESULT IS:LOUTDBLETTER,$NOUTDBNUM,$OOUT DBOTHERS,$CRLFDBCR,LF,$DASGENDSCOSGSEGMENT;设置代码段ASSUMESS:SKSG,DS:DASG:MOVAX, DASGMOVDS, AXMOVAX, SKSGMOVSS, AXMOVSP, SIZE DW STK;设置堆栈指针微型机原理与程序设计微型机原理与程序设计程序举例顺序结构LEADX, CHARIN;取原数据首址MOVAH, 9;显示数据串INT21HMOVAH, 1;键盘输入INT21HLEADX, CRLF;取数据串首址MOVAH, 9INT21H LEADX, CHAROUT;取输出串首址MOVAH, 9INT21HCMP, 0;判断是否为数字JBOTHERSCMP, 9JACON1LEADX, NOUTMOV AH, 9INT21HJMPEXITCON1:CMP, A;判断是否为字母JBOTHERS微型机原理与程序设计微型机原理与程序设计CMPAL, ZJACON2LEADX, LOUTMOVAH, 9INT21HJMPEXITCON2:CMP, AJBOTHERSCMPAL, ZJAOTHERSLEADX, LOUTMOVAH, 9INT21HJMPEXITOTHERS:LEADX, OOUTMOVAH, 9INT21HEXIT:MOVAX,00HINT21HCOSGENDSEND程序举例顺序结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构例例2-3-6 设内存设内存DATA1和和DATA2开始分别存放开始分别存放50个无符号字数据,编制程序将两个个无符号字数据,编制程序将两个存储区对应字数据求和并存放在存储区对应字数据求和并存放在SUM开始的单元。开始的单元。设置源 *** 作数、目的 *** 作数和存放结果指针从源指针指出的字单元取出数据目的指针指出的字单元的数据相加和存入结果的字单元修改各地址指针,使之指向下一个字数据求和,保存结果修改各地址指针,使之指向下一个字数据求和,保存结果:微型机原理与程序设计微型机原理与程序设计程序举例循环结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构(1)先执行后判断结构先执行后判断结构(即直到型结构)此结构的特点是,进入循环后,先执行循环体,再判断循环控制条件。若满足循环结束条件,则退出循环;否则,继续执行循环体。循环体至少执行一次。(2)先判断后执行结构先判断后执行结构(即当型结构)此结构的特点是,进入循环后,先判断循环控制条件,若满足循环结束条件,则退出循环;否则继续执行循环体。依据控制条件可能一次也不执行循环体。微型机原理与程序设计微型机原理与程序设计例例2-3-7 编程求编程求1+2+3+的前的前N项和,直到其和刚刚大于项和,直到其和刚刚大于1000。将。将N值保存在值保存在DX中,累加和保存在中,累加和保存在AX中。中。程序举例循环结构微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW32 DUP()SKSGENDSCOSGSEGMENT;设置代码段ASSUMECS:COSG,SS:SKSG0000B8CA0BMAIN:MOVAX, SKSG00038ED0MOVSS, AX0005BC4000MOVSP, SIZE STK00080XORAX, AXBA0100MOVDX, 1000D2NEXT:ADDAX, DX;计算加法42INCDX00103DE803CMPAX, 1000;判断和是否大于100000138JNANEXT0015DECDX0016BMOVAX, 00H0019CD21INT21HCOSGENDSENDMAIN程序举例循环结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构将上例使用当型结构来编程将上例使用当型结构来编程微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW32 DUP()SKSGENDSCOSGSEGMENT;设置代码段ASSUMECS:COSG,SS:SKSG00000MAIN:XORAX, AX0002BA0100MOVDX, 100053DE803CON:CMPAX, 1000;判断和是否大于100000087705JANEXT2ADDAX, DX;计算加法和42INCDX000DEBF6JMPCONNEXT:DECDX0010BMOVAX, 00H0013CD21INT21HCOSGENDSEND MAIN程序举例循环结构微型机原理与程序设计微型机原理与程序设计程序举例顺序结构常用的循环控制方法循环控制方法有计数控制计数控制、条件控制条件控制、逻辑尺控制逻辑尺控制和开关控制法开关控制法等计数控制计数控制的循环程序设计的特点是循环次数已知,利用某个寄存器或存储单元作为计数器,由计数器的值控制循环结束。计数的方法有两种:增量计数和减量计数。计数器置初值后,每循环一次,计数器的值按步长值进行加/减,直到某一值时,循环结束。例例2-3-9 编程求带符号字节数组编程求带符号字节数组ARR中的最大值中的最大值,此值存放在,此值存放在DL中。中。微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW32 DUP()SKSGENDSDASGSEGMENT;设置数据段ARRDB34H,12H,0AH,2H,00H,6DH,9AHLENDB$-ARRDASGENDSEXSGSEGMENTEXSGENDSCOSGSEGMENT;设置代码段ASSUMECS:COSG,DS:DASG,SS:SKSG0000B8CE0BMAIN:MOVAX, DASG00038ED8MOVDS,AX0005B8CA0BMOVAX,SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK000DB280MOVDL,-128;设置DL寄存器32EDXORCH, CH00110E0700MOVCL,LEN0015FCCLD00168D360000LEASI,ARRACSKIP:LODSB;取数据到AX001B38D0CMP,DL;数据比较001D7602JNANEXT8AD0MOVDL, 0021E7NEXT:SKIP0023BMOVAX,00H0026CD21INT21HCOSGENDSENDMAIN程序举例顺序结构微型机原理与程序设计微型机原理与程序设计程序举例顺序结构条件控制当循环次数未知时,可采用条件控制的方法,编写条件控制循环程序。在程序设计中,应先确定循环控制条件,每循环一次,都要对条件进行检查。若满足循环结束条件,则循环结束,否则继续循环,直到满足条件为止。例例2-3-10 编程统计编程统计AX寄存器中的二进制位寄存器中的二进制位1的个数。的个数。微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW 32 DUP(0)SKSGENDSDASGSEGMENT;设置数据段YDW88ABHDASGENDSCOSGSEGMENT;设置代码段ASSUMESS:SKSG,DS:DASG,CS:COSG0000B50BMAIN:MOVAX,DASG00038ED8MOVDS,AX0005B10BMOVAX,SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK000DB100MOVCL,0;CL寄存器赋初值A10000MOVAX,Y0012A9FFFFL0:TESTAX,0FFFFH;判断数据是否为负数00157408JZEXIT00177902JNSNEXT0019FEC1INCCL001BD1E0NEXT:SALAX,1001DEBF3JMPL0BEXIT:MOVAX,00H0022CD21INT21HCOSGENDSENDMAIN程序举例顺序结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构逻辑尺控制例例2-3-11 设有字节数组设有字节数组X和和Y。X和和Y数组各有数组各有10个元素。试编程计算个元素。试编程计算微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW32 DUP(0)SKSGENDSDASGSEGMENT;设置数据段X_ARRDW1BH,22H,13H,14H,5H,36H,27H,18H,90H,10HY_ARRDW10H,32H,13H,41H,15H,26H,7FH,28H,29H,10H RESULTDW10 DUP()LOGIC_LD W24EHDASGENDSCOSGSEGMENT;设置代码段ASSUMESS:SKSG,DS:DASG,CS:COSG0000B50BMAIN:MOVAX,DASG00038ED8MOVDS,AX0005B10BMOVAX,SKSG00088ED0MOVSS,AXBC4000MOVSP, SIZE STK000DBB0000MOVBX,00010B00MOVCX,10;设置循环次数00138B00MOVDX,LOGIC_L00178B870000NEXT:MOVAX,X_ARRBX001BD1EASHRDX,1;判断标志位的值001D7206JCSUBSTRACT03871400ADDAX,Y_ARRBX;计算加法算式0023EB04JMPRES00252B871400SUBSTRACT: SUBAX,Y_ARRBX;计算减法算式002989872800RES:MOVRESULTBX,AX;结果存放002D302ADDBX,2;设置数据指针0030E2E5NEXT0032BMOVAX,00H0035CD21INT21HCOSGENDSENDMAIN程序举例循环结构微型机原理与程序设计微型机原理与程序设计6)多重循环程序设计多重循环程序指循环体中还有循环程序,又称为循环嵌套。多重循环程序可以简化程序设计,使程序简明、清晰。例例2-3-12 已知在数据段定义有已知在数据段定义有10个字节变量,统计各个变量的二进制形式中个字节变量,统计各个变量的二进制形式中0的个数。的个数。程序举例循环结构微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW32 DUP()SKSGENDSDASGSEGMENT;设置数据段BUFDB23H,10H,00H,28H,1AH,3FH,8BH,92H,0AH,3DHNUM0DB10 DUP(0)DASGENDSCOSGSEGMENT;设置代码段ASSUMECS:COSG,DS:DASG,SS:SKSG0000B50BMAIN:MOVAX,DASG00038ED8MOVDS, AX0005B10BMOVAX, SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK000DBMOVDL, 103E00LEADI, NUM000138D360000LEASI, BUF;取原数据首址0017B90800NEXT:MOVCX, 8;设置循环计数器B600MOVDH, 004MOVAL, SI001ED0E0LOP:SHL, 1;判断标志位是否为000207202JCSKIP0022FEC6INCDH0024E8SKIP:LOP00268835MOVDI, DH002847INCDI002946INCSIFECADECDL75E9JNZNEXT002EBMOVAX, 00H0031CD21INT21HCOSGENDSENDMAIN程序举例循环结构微型机原理与程序设计微型机原理与程序设计7)子程序设计举例子程序设计是模块化程序设计的基本技术。当我们编写解决实际问题的程序时,通常会遇到多处使用相同功能的程序段,使用该程序段的唯一差别是对程序变量赋不同的值,这时可以利用子程序段来完成。这种能被其它程序使用的程序段,我们称为子程序,也称为过程。使用它的程序称为主程序或调用程序。使用子程序有以下几点好处: 简化了程序设计过程,减少了工作量,节省了时间; 源程序缩短,节省了机器汇编源程序的时间和存储目标代码的存储空间; 增加了源程序的可读性,便于调试维护; 有利于程序模块化、结构化和自顶向下的程序设计; 子程序一旦编制成功,在开发研制各种软件时都可以利用,大大缩短了软件的开发周期。程序举例子程序结构微型机原理与程序设计微型机原理与程序设计在进行子程序设计时,需要满足以下几个基本要求:具有一定的通用性如果某些应用程序中的一个子程序仅能实现有限的功能,显然其作用有限。但如果将子程序修改,使其能对类似的程序调用都适用,那么这个子程序的作用就大大加强了。影响子程序通用性的因素包括选择那些入口参数以及这些参数的数据格式与结构设置,如何传送等,若在编程前就考虑到这些问题的存在,那么在编程使用时,才能得心应手。注意保存信息子程序虽然是一个独立的程序段,但它执行运算与 *** 作时也要借助于某些寄存器或存储单元。在调用程序中,这些寄存器或存储单元的内容,等子程序返回后要求它们与被调用子程序前保持不变,以便继续进行调用程序的运算与 *** 作。所以,需要进行信息的保护。选择使用的参数传递方法子程序要利用过程定义伪指令声明,获得子程序名和调用属性。主程序执行CALL指令调用子程序,子程序最后利用RET指令返回主程序。主程序在调用子程序时,通常需要向其提供一些数据,对于子程序来说就是入口参数;同样,子程序之行结束也要返回主程序必要的数据,这就是子程序的出口参数。主程序与子程序间通过传递建立联系,相互配合共同完成处理工作。在这过程中实现参数传递方法通常有四种:通过通用寄存器传递、通过约定存储单元传递、借用堆栈传递和通过约定参数地址指针法。程序举例子程序结构微型机原理与程序设计微型机原理与程序设计编写清晰的子程序说明文件编制子程序的目的在于减少编程中某些相同功能程序段的重复书写,以利于自己和他人编写程序是使用。为了使子程序便于阅读、维护、使用,为了明确主程序、子程序之间的联系,明确子程序功能,而使使用者完全不必关心所用子程序的算法及处理过程,一般应编制子程序说明文件,包含下述几项内容:子程序名(子程序入口地址):子程序名(子程序入口地址):用过程(子程序)定义伪指令定义该过程时的过程名,这是过程(子程序)中第一条语句必须是子程序的入口指令;否则应写子程序入口指令的标号或地址;子程序功能:子程序功能: 用自然语言或数学语言等形式简单清楚地描述子程序完成的任务。入口条件:入口条件:说明子程序要求有几个入口参数,这些参数表示的意义及存放位置。出口条件:出口条件: 说明子程序有几个输出参数(运行结果),这些参数表示的意义、存放的位置。受影响的寄存器:受影响的寄存器: 说明子程序运行后,哪些寄存器的内容被破坏了,以便使用者在调用该子程序之前注意保护现场。程序举例子程序结构微型机原理与程序设计微型机原理与程序设计例例2-3-13 将给定的二进制数按位转换成它的将给定的二进制数按位转换成它的ASCII码串,并将转换结果存放到制定码串,并将转换结果存放到制定的存储单元。的存储单元。程序举例子程序结构微型机原理与程序设计微型机原理与程序设计子程序的参考程序如下:BITASCPROCNEAR;定义子过程8BC8MOVCX,AX;送入口参数至CX0031D2LP:ROLDX,1;取1位二进制00332MOV,DL;转换一位数的ASCII码00352401ANDAL,01H;只取D0位00370430ADDAL,30H00398805MOVDI,AL;存转换结构003B 47INCDI;指向下一待转换的二进制E3LP;循环转换,直至全部转换结束003EC3RETBITASCENDP;子程序定义结束程序举例子程序结构微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK;设置堆栈段STKDW32 DUP()SKSGENDSDASGSEGMENT;设置数据段BIN8DB72BIN16DW2468ASCBUFDW0DASGENDSCOSGSEGMENT;设置代码段ASSUMECS:COSG,DS:DASG,SS:SKSG0000B8BE0BMAIN:MOVAX,DASG00038ED8MOVDS, AX;取数据段地址0005B8BA0BMOVAX, SKSG00088ED0MOVSS, AX;取堆栈段地址BC4000MOVSP, SIZE STK;设置堆栈指针000D360000MOVDH,BIN8;取待转换数据0011B80800MOVAX,8;设置转换位数800148D3E0300LEADI,ASCBUF;取存放码串首址001857PUSHDI;保存信息0019E81300CALLBITASC;调用转换子程序POPDI;恢复信息001D8B160100MOVDX,BIN16;取待转换数据0021B81000MOVAX,10H;设置转换位数160024710ADDDI,10H;取存放码串首址0027E80500CALLBITASC;调用转换子程序BMOVAX,00H;返回DOS002DCD21INT21HCOSGENDS;代码段结束

;===============================================================

;  键盘输入数值数组子程序(数组名为array,元素个数存放在num中)

inputnum proc near

      ; 输入的数据以一个空格分隔,以回车符结束输入

      push cs

      pop es

      lea di,array  ;将数组第一个元素的有效地址置入DI

      mov word ptr[num],0

stin:

      mov ax,0

      push ax

again1:

      mov ah,1

      int 21h

      mov byte ptr[char],al

      cmp al,13

      je line0

      cmp al,' '

      je line0

      sub al,30h

      mov ah,0

      mov si,ax

      pop ax

      mov cl,10

      mov ch,0

      mul cx

      add ax,si

      push ax

      jmp again1

line0:

      pop ax

      mov word ptr[di],ax

      inc word ptr[num]

      cmp byte ptr[char],13

      je stinend

      inc di

      inc di

      jmp stin

stinend:

      ret

array dw 100 dup(0)

num   dw 0

char  db 

inputnum endp

;=====================================================

以上就是关于vb 编写一个能对一维数组进行升序排列的子程序过程!全部的内容,包括:vb 编写一个能对一维数组进行升序排列的子程序过程!、编制一个过程名为SUB1的子程序,完成将AL中的8位二进制数转换成BCD数并存入到BX中保存。麻烦高手回答做、Sub子过程与Function函数过程有什么区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10124784.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存