BUFFER DB 10 DUP();BUFFER存放8个不确定数
augend DB 2 DUP() ;被加数
addend DB 2 DUP() ;加数
msg1 DB 0DH,0AH,'请输入被加数: $'
msg2 DB 0DH,0AH,'请输入加数: $'
msg3 DB 0DH,0AH,'结果: $';msg3存放结果
;0DH和0AH分别是回车和换行的ASCII码,
;'$'是DOS功能调用INT 21H中9号功能要求的要显示字符串的结束标志
CODE
START: MOV AX,@DATA
MOV DS,AX
MOV ES,AX
CLD ;方向标志位清零 ;CLD与STD是用来 *** 作方向标志位DF(Direction Flag)。
;CLD使DF复位,即DF=0,STD使DF置位,即DF=1用于串 *** 作指令中
NOP ;空 *** 作 ;NOP指令只使程序计数器PC加1,所以占用一个机器周期
;其目的为保证写、读之间有个稳定时间
MOV AH,00H
MOV AL,03H
INT 10H ;清屏
START1: MOV AH,09H ;9号调用DX指向被加数的首地址,输出提示信息
LEA DX,msg1 ;将源 *** 作数给出的有效地址传送到指定的的寄存器中
INT 21H
LEA DI,augend ;DI->augend的首地址
MOV CX,4 ;按键次数
CALL GetBCDKey ;得到双字节十进制数(被加数)
JNB START2 ;没有输入任何数字,结束 CF=0
MOV AH,09H ;9号调用DX指向加数的首地址
LEA DX,msg2 ;将源 *** 作数给出的有效地址传送到指定的的寄存器中
INT 21H
LEA DI,addend ;di指向加数
MOV CX,4 ;按键次数
CALL GetBCDKey ;得到双字节十进制数(加数)
JNB START2 ;没有输入任何数字,结束
MOV AL,augend ;被加数的低8位送al
ADD AL,addend ;al与加数的低位相加的结果送al
DAA ;BCD算术运算调整,转换为压缩型BCD
XCHG AL,AH ;高位与低位互换
MOV AL,augend + 1
ADC AL,addend + 1 ;高位
DAA
XCHG AL,AH
MOV BL,0
ADC BL,0 ;进位 bl存放的是进位 bl和ax相加是最后的结果
STD ;方向标志置1
LEA DI,BUFFER+4 ;存放显示结果
CALL B1toB2 ;低位
MOV AL,AH
CALL B1toB2 ;高位
MOV AL,BL
OR AL,30H ;转换成数字
STOSB ;存数
LEA SI,BUFFER
MOV CX,5
CALL BlackDisplay ;将高位0消隐
MOV AH,09H
LEA DX,msg3 ;9号调用DX指向结果的首地址
INT 21H
MOV AH,09H
LEA DX,BUFFER ;9号调用DX指向BUFFER的首地址
INT 21H
JMP START1 ;跳转到START1
START2: MOV AH,4CH ;结束程序
INT 21H
; JMP $
;将一个字节压缩BCD码转换成二个字节数字
B1toB2 PROC NEAR ;段内
PUSH AX ;ax存放的是相加后的结果
AND AL,0FH ;高四位置0
OR AL,30H ;加30H
STOSB ;存数 个位 百位
POP AX
AND AL,0F0H ;低四位置0
ROR AL,4 ;循环右移4位
OR AL,30H ;加30H
STOSB ;存数 十位 千位
RET
B1toB2 ENDP
BlackDisplay PROC NEAR
CLD ;方向标志清零
MOV DI,SI ;si送给di si指向buff的第一个缓冲区 增量变化
BlackDisplay1: LODSB ;将高位0消隐,取串
CMP AL,'0'
JNZ Exit ;若al不等于0跳转EXIT
LOOP BlackDisplay1 ;否则cx不为0一直循环 cx次
INC CX ;cx加1
Exit: DEC SI ;si前移
REP MOVSB ;重复传送字节
MOV AL,'$' ;把$符送al
STOSB ;存数
RET
BlackDisplay ENDP
GetBCDKey PROC NEAR
LEA SI,BUFFER
MOV AL,4 ;把4写入到buff
MOV [SI],AL ;是内存单元
MOV DX,SI
MOV AH,0AH ;dx指向缓冲区
MOV AL,02H ;0:任意字符 1:16进制数 2:10进制数,10进制数输入
INT 21H
GetBCDKey1: LODSB ;ds:si->al
AND AL,0FH ;高4位清零
CMP CX,1 ;
JE GetBCDKey2
DEC CX ;进数位-1
MOV AH,AL
LODSB
AND AL,0FH
SHL AL,4 ;逻辑左移4位
OR AL,AH ;
GetBCDKey2: CLD
STOSB ;存串指令
STD
LOOP GetBCDKey1 ;cx=2 原先为4 上面减了一次一 loop再减一所以等于2
MOV CL,[BUFFER]
SUB CL,[BUFFER+1]
SHR CL,1 ;逻辑右移1位
MOV AL,0
CLD
REP STOSB ;重复存数
STC ;进位标志位置1
RET
GetBCDKey3: CLC ;进位标志位清零cf=0
RET ;返回
GetBCDKey ENDP
TAB DB 1,2,3,4,5,6,7,8
ENTRY EQU 4 ;定义常量,entry为4
MOV BX,FOOSET TAB ;tab的首偏移地址放到bx中,此时,bx指向tab中的第一个,即“1”
ADD BX,ENTRY ;bx加4,此时指向tab中的第五个,即‘5’
MOV AX,[BX] ;ax为一个字,所以把tab中的第五个和第六个放到ax中,即把 6(即06h)放到ah中,5(即05h)放到al中(高位在下,低位在上)
微型机原理与程序设计微型机原理与程序设计程序举例顺序结构例例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;代码段结束
您可以使用以下代码实现这个需求:
#include <stdioh>
int main()
{
// 定义数组长度
int len;
// 从键盘输入数组长度
printf("请输入成绩的个数:");
scanf("%d", &len);
// 定义数组
int a[len];
// 循环读取成绩
for (int i = 0; i < len; i++) {
printf("请输入第 %d 个成绩:", i + 1);
scanf("%d", &a[i]);
}
// 计算成绩的最大值、最小值和平均值
int max = a[0];
int min = a[0];
int sum = 0;
for (int i = 0; i < len; i++) {
max = a[i] > max a[i] : max;
min = a[i] < min a[i] : min;
sum += a[i];
}
int avg = sum / len;
// 输出成绩个数和成绩的最大值、最小值、平均值
printf("成绩个数:%d\n", len);
printf("成绩的最大值:%d\n", max);
printf("成绩的最小值:%d\n", min);
printf("成绩的平均值:%d\n", avg);
return 0;
}
问题一:微型计算机系统的关机顺序是() 您好:你所咨询的问题答案为
答案 A
希望我的回答可以让您满意
问题二:电脑开关机的正确顺序是什么 对于一台已经配置好的电脑,它的打开和关闭是非常简单的。只要你用过电视、影碟机等家用电器,电脑的这些 *** 作对你来说易如反掌。
虽然 *** 作动作很简单,但如果 *** 作的方法不当,还是有可能对您的电脑造成不必要的损坏,因此,我们对电脑的开、关机作一个详细的介绍。
首先要记住的是开机顺序,一般来讲开机时要先开外设(即主机箱以外的其他部分)后开主机,关机时要先关主机后关外设。
我们所说的开机有以下几种情况:
1、第一次开机。这种情况的开机方法为先打开显示器的电源开关,然后再打开主机箱的电源开关(其上有POWER标志) 一是同时按住键盘上的Ctrl键、Alt键和Del键着三个。
2、重新启动电脑。这是指电脑在运行过程中由于某种原因发生死机或在运行完某些程序后需要重新启动电脑。这时有三种方法:
按键,电脑即会自动重新启动;
二是在前一个方法不行的情况下,直接在主机箱上按下RESET按钮让电脑重新启动;
三是如果前两种方法都不行时不得已采用的方法,就如同第一次开机时一样,直接按下主机箱上的POWER按键让电脑重新开机。
请记住这三种开机顺序,千万不要机器一不运行,就按POWER键,这样对电脑的损害很大。
关机时就更简单了,只要按下主机箱上的POWER键即可。但须记住的是:一定要先退出所有的运行程序后才能关机。如果是在WINDOWS *** 作系统下,其关机一定要按以下顺序关机:先关闭所有的运行程序,然后用鼠标左键点击屏幕左下角的开始按钮,在其d出的菜单中选择关闭系统后点击鼠标左键,在随后d出的对话框中选择关闭计算机选项,最后用鼠标点击其上标有是的按钮。稍后,屏幕上会出现现在您可以安全地关闭计算机了字样,这时您可以直接按下主机箱上的POWER按钮以安全地关闭计算机了。
问题三:开电脑和关电脑的正确顺序分别是什么 在电脑开机时要先开显示器再开主机,在电脑关机时要先关主机再关显示器,这一开、关机顺序对老显示器来说尤为重要,但对于近几年生产的显示器来说就不是很重要了,甚至有的显示器在开机时的顺序正好相反,但多数情况下用上述顺序进行还是有利无害的。
先开显示器,是因为,当你一按下机箱的电源开关时,屏幕上会立刻显示一些硬件及系统的相关信息,还有自检信息。如果你先开主机电源,后开显示器,那么前面的有些信息就有可能跳过,你也就看不到了。所以为了能看到全部的开机信息,要先开显示器后开主机电源。
其中那些信息平时我们都不怎么太在意,所以开机到底是先开哪个,也就没什么了。只有系统或硬件出问题,需要找到一些相关原因的话,那么开机的自检信息就很重要。 所以平时开机不必要太在意先开哪个 。
在过去的电脑来说原则是先开外部设备(显示器,打印机等),最后开主机 。
因为当时的硬件技术和 *** 作系统还不完善,那时的显示器是在主机上供电的,如果先开主机后开显示器,开显示器的瞬间电路的高压会有可能烧毁电源或者主板 。
但现在的软硬件技术都已经相当完善了,先开什么都无所谓,甚至你可以随时把显示器关了来省电,而且如你用的是液晶显示器,那你就更该在不用的时候把显示器的电源关了,以延长使用寿命
结论:我们不必再去记“先外后主”还是“先主后外”,先开哪只要你顺手就行!!
问题四:计算机正确关机的顺序 方法:
开机正确步骤
1、先把总电源打开。
就是接通主机与显示器的总电源。
一般是一个插排,打开插排的开关。
2、先开显示器。
这一步经常有人弄错,开电脑首先应该先开显示器。
这样做对显示器好。
3、再开主机。
打开显示器后,就可以按主机的开始按钮了。
这个顺序不能反,不然会有损机器的使用寿命。
关机的正确步骤
1、关闭所有程序。
首先要关闭打开的所有程序。最好一个也不要留。这样才不会忘记保存文件。关机速度也会加快。
2、关闭计算机。
关闭所有程序后再按“开始/关闭计算机/关闭”,关闭计算机。
3、关闭显示器。
计算机显示关机完成,显示器黑屏后,就可以关闭显示器了。
请不要先关闭显示器,这样无法看出计算机是否已经完全关闭。
4、关闭电源。
把总电源,即插排上的电源也关闭。
这样电脑就关闭完成了。记住把总电源也关掉,这也是为了环保。
问题五:计算机加电顺序与关机顺序各是什么 1b
2主机
3相反
问题六:电脑关机的步骤是什么 WinXp关机步骤可不能像关彩电一样哦,否则计算机极易造成硬件损坏。
为确保计算机安全,正常的关机的步骤如下:
1、单击“开始”
2、单击“关闭计算机”
3、单击“关闭”
稍候片刻,计算机便会自动切断电源,
显示器进入节能状态(黄灯)
如果你是离开很长时间,如:下午放学等,请增加一步 *** 作,关闭显示器电源。
如果是放长假的,如五一、国庆、寒暑假等,最好还切断电源,免去长期待机损耗。
问题七:台式电脑开关机的正规顺序是什么步骤? 开机的正确步骤:
1,开启显示器;
2,点击电源键,等待开机即可。
关机的正确步骤:
1,点击“开始”,点击“关机”;
2,等待自动关机后,关闭显示器即可。
问题八:微机开机顺序是 无所谓了,先开显示器或先开主机都可以。以前好像说需要先开显示器,或许是那时的显示器太落后需要先开,现在先开哪个都可以
问题九:计算机关机键是什么 开机键即关机键
或者点击开始 关机 欧诺个鼠标 *** 作
问题十:电脑开关机顺序是什么如何正确执行 方法:
开机正确步骤
1、先把总电源打开。
就是接通主机与显示器的总电源。
一般是一个插排,打开插排的开关。
2、先开显示器。
这一步经常有人弄错,开电脑首先应该先开显示器。
这样做对显示器好。
3、再开主机。
打开显示器后,就可以按主机的开始按钮了。
这个顺序不能反,不然会有损机器的使用寿命。
关机的正确步骤
1、关闭所有程序。
首先要关闭打开的所有程序。最好一个也不要留。这样才不会忘记保存文件。关机速度也会加快。
2、关闭计算机。
关闭所有程序后再按“开始/关闭计算机/关闭”,关闭计算机。
3、关闭显示器。
计算机显示关机完成,显示器黑屏后,就可以关闭显示器了。
请不要先关闭显示器,这样无法看出计算机是否已经完全关闭。
4、关闭电源。
把总电源,即插排上的电源也关闭。
这样电脑就关闭完成了。记住把总电源也关掉,这也是为了环保。
下面是一份 x86-64 汇编代码段,可以实现将 RDX 和 RAX 中的 128 位数据逻辑左移一位(即将高位移到低位,低位填 0)的功能。代码中使用了 64 位寄存器 RDI 来存储左移 *** 作的结果。
; 将 RDX 和 RAX 中的 128 位数据逻辑左移一位,结果存放在 RDI 中
; 参数:无
; 返回值:无
section text
global _start
_start:
; 将 RAX 的最高位保存到 CF 标志位中
shr rax, 63
; 将 RDX 的最高位保存到 RAX 的最低位,并将 RAX 的最高位保存到 CF 标志位中
rcl rdx, 1
; 将 RAX 的最低位保存到 RDX 的最高位
rcr rax, 1
; 将 RDI 中的数据清零
xor rdi, rdi
; 将 RDX 和 RAX 中的数据合并,存储到 RDI 中
or rdi, rdx
or rdi, rax
; 程序结束
mov eax, 1
xor ebx, ebx
int 0x80
代码中使用了 shr(算术右移)和 rcl(循环左移)指令将 RAX 和 RDX 中的数据逻辑左移一位,并将结果存储到 RDI 中。其中,shr rax, 63 的作用是将 RAX 中的最高位保存到 CF 标志位中;rcl rdx, 1 的作用是将 RDX 中的最高位保存到 RAX 的最低位,并将 RAX 的最高位保存到 CF 标志位中;rcr rax, 1 的作用是将 RAX 的最低位保存到 RDX 的最高位。最后,使用 or 指令将 RDX 和 RAX 中的数据合并,并存储到 RDI 中。
需要注意的是,在本示例中,假设 RAX 和 RDX 中的数据都是无符号整数。如果数据是带符号的,需要考虑符号扩展的问题。此外,代码中也没有进行错误处理,如果输入的数据不符合要求,程序可能会出现异常行为。
以上就是关于合肥学院微机实验4(子程序调用实验代码及解析)全部的内容,包括:合肥学院微机实验4(子程序调用实验代码及解析)、微机原理的程序分析、微机原理子程序入口条件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)