当前位置:文档之家› 汇编小程序

汇编小程序

---------程序sy3-1:实现从键盘输入一位数字,判断其奇偶性。

并在屏幕上输出一个标志,若为奇数,则输出1;否则输出0。

---------如果输入的不是数字,则显示字符串“ERROR”。

DATAS SEGMENTSTRING DB "ERROR$" ;定义字符串FLAG DB ? ;设置奇偶标志DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV FLAG,'1' ;给标志位FLAG赋初值MOV AH,01HINT 21H ;接收键盘输入一位数CMP AL,30HJB ERRCMP AL,39HJA ERRTEST AL,01H ;测试,根据最后一位判断奇偶性JNZ OUTPUT ;不为0则为奇数MOV FLAG,'0'OUTPUT:MOV DL,FLAGMOV AH,02HINT 21H ;输出标志位JMP EXITERR: ;显示字符串MOV DX,OFFSET STRINGMOV AH,9INT 21HEXIT:MOV AH,4CHINT 21HCODES ENDSEND START;---------程序sy3-2:根据用户输入的星期几数字代号(0代表星期天),在屏幕上显示相应的英文缩写名。

DATAS SEGMENTs0 db "Sun$"S1 DB "Mon$"S2 DB "Tue$"S3 DB "Wed$"S4 DB "Thu$"S5 DB "Fri$"S6 DB "Sat$"ADDR_TABLE DW S0,S1,S2,S3,S4,S5,S6 ;定义地址表DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AH,1INT 21H ;接受键盘输入CMP AL,30HJB EXITCMP AL,36H ;不是数字0~6,则退出程序JA EXITSUB AL,30H ;转变为数字MOV BL,2MUL BL ;数字乘以2的结果是在地址表中的相应位置的偏移值MOV BX,AX ;将输入的数字转换为地址表中的偏移地址MOV DX,ADDR_TABLE[BX] ;取地址表中的相应内容(即DX为字符串的偏移地址)MOV AH,9INT 21H ;显示字符串EXIT:MOV AH,4CHINT 21HCODES ENDSEND START;-------------SY4-1.ASM: 该程序计算1~100的和并用十进制的形式在屏幕上显示出来。

code segmentassume cs:codestart:mov cx,100mov ax,0mov bx,1s:add ax,bx ;循环累加求和inc bxloop smov bx,ax ;将显示bx的值;----------下面程序段的功能是以十进制形式显示BX的内容MOV SI,10000 ;因为BX〈65536,循环处理5次MOV CX,5ROTATE:MOV AX,BXMOV DX,0 ;被除数送(DX,AX)DIV SI ;除数MOV BX,DX ;余数要作为下一步的被除数MOV DL,ALADD DL,30HMOV AH,2 ;显示商(即对应位上的数字)INT 21HMOV AX,SIMOV DX,0MOV DI,10DIV DI ;把除数除以10后的商作为下一步的除数MOV SI,AX ;改变除数LOOP ROTATEmov ah,4chint 21h ;返回DOScode endsend startDATA SEGMENTSTRING1 DB 'Move the cursor Backward.'STRING2 DB 'Move the cursor backward.'MESS1 DB 'Mactch.',13,10,'$'MESS2 DB 'No match!',13,10,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,-1 ;SI要记录不匹配的位置MOV CX,25S: INC SIMOV AL,STRING1[SI]CMP AL,STRING2[SI] ;循环比较LOOPZ SJZ MATCH ;相等则匹配LEA DX,MESS2JMP DISPMATCH:LEA DX,MESS1DISP:MOV AH,9INT 21H ;显示字符串MOV AH,4CHINT 21HCODE ENDSEND STARTDATA SEGMENTSTRING1 DB 'Move the cursor Backward.'STRING2 DB 'Move the cursor Backward.'MESS1 DB 'Mactch.',13,10,'$'MESS2 DB 'No match!',13,10,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AX ;源串段地址MOV ES,AX ;目的串段地址MOV SI,OFFSET STRING1 ;源串偏移地址MOV DI,OFFSET STRING2 ;目的串偏移地址MOV CX,25 ;串长度CLD ;方向标志位REPZ CMPSB ;相等则重复比较,遇到不相等的则退出JZ MATCH ;如果退出串比较后,zf=1表示整个字符串都比较完了都相等则匹配LEA DX,MESS2JMP DISPMATCH:LEA DX,MESS1DISP:MOV AH,9INT 21H ;显示字符串MOV AH,4CHINT 21HCODE ENDSEND START;-------------该程序实现找到10个学生成绩数组中最大值并在屏幕上显示;-------------统计小于60的个数,即不及格的人数并显示。

;-------------计算数组平均值(取整数部分,即平均成绩)并显示DATAS SEGMENTGRADE DB 76,68,54,80,45,92,63,58,94,85 STR1 DB "The highest score:$"STR2 DB "the number of failing:$"STR3 DB "average:$"DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV SI,0MOV DX,OFFSET STR1CALL OUTSTRCALL MAXS ;调用比较找最大值MOV BX,0MOV BL,AL ;将最大值送BXCALL BINIDEC ;调用二进制转十进制输出BXCALL CRLF ;调用显示回车换行MOV DX,OFFSET STR2CALL OUTSTRCALL BJG ;调用统计不及格人数MOV BH,0CALL BINIDEC ;以十进制显示不及格人数CALL CRLFMOV DX,OFFSET STR3CALL OUTSTRCALL AVG ;调用求平均值MOV BX,0MOV BL,AL ;将平均值送BXCALL BINIDEC ;以十进制显示平均值MOV AH,4CHINT 21H;-----------子程序OUTSTR:显示字符串。

OUTSTR PROC NEARMOV AH,9INT 21HRETOUTSTR ENDP;-----------子程序AVG:求数组平均值,出口参数为AL。

AVG PROC NEARMOV AX,0MOV SI,0MOV CX,10S: ADD AL,GRADE[SI]ADC AH,0INC SILOOP SMOV BL,10DIV BLRETAVG ENDP;-----------子程序BJG: 统计不及格人数,出口参数为BL。

BJG PROC NEARMOV CX,10MOV AL,60MOV BX,0COM:CMP AL,GRADE[SI]JlE NEXTINC BXNEXT:INC SILOOP COMRETBJG ENDP;-----------子程序MAXS:通过比较找到最大值,出口参数为AL。

MAXS PROC NEARMOV SI,0MOV CX,9 ;设置比较次数MOV Al,GRADE[SI]LOOP1:INC SICMP GRADE[SI],ALJBE CONTINIU1MOV AL,GRADE[SI] ;保存大值CONTINIU1:LOOP LOOP1RETMAXS ENDP;---------------子程序将bx的内容转换为十进制输出到屏幕BINIDEC PROC NEARMOV SI,10000 ;BX〈65536,循环处理5次MOV CX,5ROTATE:MOV AX,BXMOV DX,0 ;被除数送(DX,AX)DIV SI ;除数MOV BX,DX ;余数要作为下一步的被除数MOV DL,ALADD DL,30HMOV AH,2 ;显示商(即对应位上的数字)INT 21HMOV AX,SIMOV DX,0MOV DI,10DIV DI ;把除数除以10后的商作为下一步的除数MOV SI,AX ;改变除数LOOP ROTATERETBINIDEC ENDP;------------显示回车换行CRLF PROC NEARPUSH AXPUSH DXMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HPOP DXPOP AXRETCRLF ENDPCODES ENDSEND START;-------------程序功能:输入表达式,实现500以内的十进制数的加减运算;-------------定义宏:显示以$结束的字符串outstring macro mesmov dx, offset mesmov ah,9int 21hendm;------------设置提示符DATAS SEGMENTmes1 db 'please input the first operand:$'mes2 db 'please input the second operand:$'mes3 db 'please input the operator:$'mes4 db 'output the Calculated Results:$'mes5 db 'first Data of more than 500, please enter again!$'mes6 db 'second Data of more than 500, please enter again!$'mes7 db 'Operator input error, please enter again!$'DATAS ENDSSTACK SEGMENTDW 50 DUP (0)TOS LABEL WORDSTACK ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSTART:MOV AX,DATASMOV DS,AXMOV AX,STACKMOV SS,AXMOV SP,OFFSET TOSs1:outstring mes1 ;输出提示菜单call decibin ;接收键盘十进制输入,以任意非十进制数码结束输入cmp bx,500ja err1 ;控制操作数不大于500push bxcall crlf ;换行jmp s2err1:call crlfoutstring mes5 ;输出错误提示call crlfjmp s1s2: outstring mes2call decibincmp bx,500ja err2push bxcall crlfjmp s3err2:call crlfoutstring mes6call crlfjmp s2s3:outstring mes3mov ah,1 ;输入操作符int 21hmov bl,alcmp bl, '+'jne c1pop axpop bxadd bx,ax ;做加法call crlfoutstring mes4jmp dispc1:cmp bl,'-'jne errcall crlfoutstring mes4pop axpop bxsub bx,ax ;做减法jns dispmov dl,'-'mov ah,2int 21h ;输出负号neg bx ;求绝对值disp:call binidec ;显示运算结果jmp quiterr:call crlfoutstring mes7 ;操作符错误提示call crlfjmp s3quit:MOV AH,4CHINT 21H;------------------------- decibin proc nearmov bx, 0 newchar:mov ah, 1int 21hsub al, 30hjl exitcmp al, 9jg exitcbwxchg ax, bxmov cx, 10mul cxadd bx, axjmp newcharexit: retdecibin endp;-------------------------- binidec proc nearcmp bx,10000djae div1cmp bx,1000djae div2cmp bx,100djae div3cmp bx,10djae div4jmp div5div1: mov cx, 10000dcall dec_divdiv2: mov cx, 1000dcall dec_divdiv3: mov cx, 100dcall dec_divdiv4: mov cx, 10dcall dec_divdiv5: mov cx, 1dcall dec_divretbinidec endp;--------------------------dec_div proc nearmov ax, bxmov dx, 0div cxmov bx, dxmov dl, aladd dl, 30hmov ah, 2int 21hretdec_div endp;-----------------------crlf proc nearmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretcrlf endp;-----------------CODES ENDSEND START;------------程序功能:采用位触发方式控制扬声器发声。

相关主题