汇编语言小程序例子
精选10个汇编语言程序案例集

精选10个汇编语言程序案例集摘要:一、汇编语言简介二、案例1:简单算术运算三、案例2:字符串处理四、案例3:逻辑与关系运算五、案例4:循环与条件语句六、案例5:函数调用与参数传递七、案例6:数组与指针操作八、案例7:内存管理九、案例8:输入输出操作十、案例9:操作系统调用十一、案例10:网络编程十二、总结与拓展正文:一、汇编语言简介汇编语言是一种低级编程语言,它与计算机硬件的操作紧密相关。
汇编语言通过对计算机指令进行汇编,实现对计算机资源的控制。
下面将介绍10个汇编语言程序案例。
二、案例1:简单算术运算案例1是一个实现加减乘除算术运算的汇编程序。
通过编写相应的汇编指令,实现对两个整数的加减乘除操作。
三、案例2:字符串处理案例2是一个处理字符串的汇编程序。
通过汇编指令实现字符串的输入、输出、查找、替换等功能。
四、案例3:逻辑与关系运算案例3是一个处理逻辑与关系运算的汇编程序。
通过汇编指令实现逻辑与、逻辑或、逻辑非以及关系运算。
五、案例4:循环与条件语句案例4是一个处理循环与条件语句的汇编程序。
通过汇编指令实现for、while、if-else等循环与条件控制结构。
六、案例5:函数调用与参数传递案例5是一个处理函数调用与参数传递的汇编程序。
通过汇编指令实现函数调用,以及将参数传递给函数。
七、案例6:数组与指针操作案例6是一个处理数组与指针操作的汇编程序。
通过汇编指令实现数组的创建、访问、排序等操作,以及指针的运算与控制。
八、案例7:内存管理案例7是一个处理内存管理的汇编程序。
通过汇编指令实现内存的分配、释放、拷贝等操作。
九、案例8:输入输出操作案例8是一个处理输入输出操作的汇编程序。
通过汇编指令实现键盘输入、显示输出等功能。
十、案例9:操作系统调用案例9是一个处理操作系统调用的汇编程序。
通过汇编指令实现操作系统提供的功能,如文件操作、进程管理等。
十一、案例10:网络编程案例10是一个处理网络编程的汇编程序。
Linux下简单C语言小程序的反汇编分析

Linux下简单C语⾔⼩程序的反汇编分析韩洋原创作品转载请注明出处《Linux内核分析》MOOC课程写在开始,本⽂为因为参加MOOC相关课程⽽写的作业,如有疏漏,还请指出。
选了⼀门Linux内核分析课程,因为阅读内核代码中或多或少要涉及到At&T汇编代码的阅读,所以这⾥写下⼀个对⼀个简单C命令⾏程序的反汇编分析过程,⼀⽅⾯完成作业,另⼀⽅⾯当作练⼿。
下⾯开始:1、编写我们的C语⾔⼩程序这⾥我们使⽤简单的例⼦,代码如下:1 #include <stdio.h>23int exG(int x)4 {5return x + 5;6 }78int exF(int x)9 {10return exG(x);11 }1213int main(void)14 {15return exF(10) + 2;16 }使⽤vim等编辑器写⼊上述代码,保存到main.c,然后使⽤下⾯命令⽣成汇编源⽂件:x86系统:$gcc -S -o main.s main.cx64系统:$gcc -m32 -S -o main.s main.c因为我们这⾥以32位平台为例⼦,所以在x64机器上要加上-m32来使GCC⽣成32位的汇编源⽂件。
2、处理源⽂件执⾏完上述命令后,当前⽬录下就会有⼀个main.s的⽂件,使⽤vim打开,不需要的链接信息[以"."开头的⾏],得到如下汇编代码:1 exG:2 pushl %ebp3 movl %esp, %ebp4 movl 8(%ebp), %eax5 addl $5, %eax6 popl %ebp7 ret8 exF:9 pushl %ebp10 movl %esp, %ebp11 pushl 8(%ebp)12 call exG13 addl $4, %esp14 leave15 ret16 main:17 pushl %ebp18 movl %esp, %ebp19 pushl $1020 call exF21 addl $4, %esp22 addl $2, %eax23 leave24 ret可以看到这个⽂件⾥是GCC帮我们⽣成的汇编代码,这⾥需要说明下AT&T格式和intel格式,这两种格式GCC是都可以⽣成的,如果要⽣成intel格式的汇编代码,只需要加上 -masm=intel选项即可,但是Linux下默认是使⽤AT&T格式来书写汇编代码,Linux Kernel代码中也是AT&T格式,我们要慢慢习惯使⽤AT&T格式书写汇编代码。
汇编编程实例

汇编编程实例.txt你妈生你的时候是不是把人给扔了把胎盘养大?别把虾米不当海鲜。
别把虾米不当海鲜。
案例1判断闰年程序data segment ;定义数据段infon db 0dh,0ah,'Please input a year: $'Y db 0dh,0ah,'This is a leap year! $'N db 0dh,0ah,'This is not a leap year! $'w dw 0buf db 8db ?db 8 dup(?)data endsstack segment stackdb 200 dup(0)stack endscode segmentassume ds:data,ss:stack,cs:codestart:mov ax,datamov ds,axlea dx,infon ;在屏幕上显示提示信息mov ah,9int 21hlea dx,buf ;从键盘输入年份字符串mov ah,10int 21hmov cl, [buf+1]lea di,buf+2call datacatecall ifyearsjc a1lea dx,nmov ah,9int 21hjmp exita1: lea dx,ymov ah,9int 21hexit: mov ah,4chint 21hdatacate proc near;push cx; dec cxlea si,buf+2tt1: inc siloop tt1;lea si,cx[di]pop cxmov dh,30hmov bl,10mov ax,1l1: push axsub byte ptr [si],dhmul byte ptr [si]add w,axpop axmul bldec siloop l1retdatacate endpifyears proc nearpush bxpush cxpush dxmov ax,wmov cx,axmov dx,0mov bx,4div bxcmp dx,0jnz lab1mov ax,cxmov bx,100div bxcmp dx,0jnz lab2mov ax,cxmov bx,400div bxcmp dx,0jz lab2lab1: clcjmp lab3lab2: stclab3: pop dxpop cxpop bxretifyears endpcode endsend start案例2产生随机数并运算的程序DATA SEGMENTCC DB '+'ww db '-'GG DB '='II DB 0DH,0AH,'$'AA DB 5 DUP(?)www dw 0ghh db '0',0dh,0ah,'$'bnm dw 0DATA ENDSSTACK SEGMENTDB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV CX,20CALL RAND ;产生一随机数CALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV AX,BXPUSH AXCMP www,0 ;WWW=0?JE A1 ;执行'+'CMP www,1 ;www=1?JE A2 ;执行'-'A1: MOV DL,CC ;显示'+'MOV AH,2INT 21HCALL RAND ;产生另一随机数add bx,0fhCALL MCAT ;将随机数转换为16进制表示的ASCII码字符 MOV DL,GG ;显示'='MOV AH,2INT 21HPOP AXADD AX,BXcmp ax,0jne yjw1lea dx,ghhmov ah,9int 21hjmp qq1yjw1: JMP B1A2: MOV DL,WW ;显示'-'MOV AH,2INT 21Hmov cx,65535mai1: loop mai1CALL RAND1CALL MCATMOV DL,GGMOV AH,2INT 21HPOP AXSbb AX,BXcmp ax,0jne yjw2lea dx,ghhmov ah,9int 21hjmp qq1yjw2: JMP B1B1: MOV BX,AXCALL MCATlea DX,IIMOV AH,9INT 21HQQ1: MOV AH,4CHINT 21HMCAT PROC ;将随机数转换为16进制表示的ASCII码字符子程序 PUSH AXpush bxPUSH CXPUSH DXCMP BX,9JA S1PUSH AXPUSH BXPUSH CXPUSH DXmov ax,bxmov bl,5div blcmp ah,3jae vb1mov www,1jmp vn1vb1:mov www,0vn1:pop dxpop cxpop bxpop axADD BL,30HMOV AA,BLMOV AA+1,'$'LEA DX,AAMOV AH,9INT 21HJMP s3s1:MOV CL,4MOV AL,0PUSH BXSHL BX,CLCMP BH,9JBE V1SUB BH,9ADD BH,40HJMP MM1V1:ADD BH,30HMM1:MOV AA,BHPOP BXAND BL,0FHPUSH AXPUSH BXPUSH CXPUSH DXmov ax,bxmov bl,5div blcmp ah,3jae vb2mov www,1jmp vn2vb2:mov www,0vn2:pop dxpop cxpop bxpop axCMP BL,9JBE TT1SUB BL,9ADD BL,40HJMP RR1TT1: ADD BL,30HRR1: MOV AA+1,BLMOV AA+2,'$'LEA DX,AAMOV AH,9INT 21Hs3:POP DXPOP CXPOP BXPOP AXRETMCAT ENDPRAND PROCPUSH CXPUSH DXPUSH AXSTIMOV AH,0 ;读时钟计数器值 INT 1AHMOV AX,DX ;清高6位AND AH,3MOV DL,101 ;除101,产生0~100余数 DIV DLMOV BL,AH ;余数存BX,作随机数POP AXPOP DXPOP CXRETRAND ENDPRAND1 PROCPUSH CXPUSH DXPUSH AXSTIMOV AH,0INT 1AHMOV ax,cxAND AH,3MOV DL,101DIV DLMOV BL,AHPOP AXPOP DXPOP CXRETRAND1 ENDPCODE ENDSEND START案例3计算平台长度程序data segmentobf db '***** welcome you !*****',0dh,0ahdb ' input data:','$'a0 db ?a1 db ?b0 db ?b1 db ?a db ?b db ?data endsstack segment stackdb 200 dup(0)stack endscode segmentassume cs:code, ds:data,ss:stack main:mov ax, datamov ds, axmov ah, 9lea dx, [obf]int 21hinc dxmov dl, 13mov ah, 2int 21hmov dl,10int 21hmov ah,1int 21hcmp al, 13jz lab1mov [a0], almov [a], almov [a1], 1x1: mov ah, 1int 21hcmp al, 13jz lab1mov [b], almov bl, [b]cmp bl, [a]jnz x2add [a1], 1jmp x1x2: mov [b0], blmov [b1], 1x3: mov ah, 1int 21hmov [a], alcmp bl,[a]jnz x4add [b1],1jmp x3x4: mov cl, [b1]cmp cl, [a1]jb y1mov cl, [b0]mov [a0], clmov cl, [b1]mov [a1],cly1: cmp al, 13jz lab1mov [b0], al mov [b1], 1mov [b], almov bl, [b]jmp x3lab1: mov ah, 2mov dl,13int 21hmov dl,10int 21hcmp [a1],10 jb z1mov ah,0mov al, [a1] mov bl, 10div bladd ax, 3030h mov bx, axmov ah, 2mov dl, blint 21hmov dl, bhint 21hjmp z2z1: add [a1], 30h mov dl, [a1]int 21hsub [a1],30hz2: mov ah,2mov dl, 13int 21hmov dl, 10int 21hmov cx, 0mov cl, [a1]mov ah, 2m: mov dl,[a0]int 21hloop mmov ah, 4chint 21hcode endsend main案例4加减乘除四则运算B_P EQU BYTE PTRW_P EQU WORD PTRD_P EQU DWORD PTR CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H;主程序开始NEWSTAR:JMP STAREVENNUM1 DW 0,0NUM2 DW 0,0NUM3 DW 0,0JGV4 DW 0,0YSF LABEL WORDYSF1 DB 0YSF2 DB 0JUV DB 0UV DB 0;使DS:SI指向第一有效字符OVERS LABEL NEARCLDPUSH AXOVERS1:LODSBCMP AL,' 'JZ OVERS1CMP AL,9JZ OVERS1DEC SICMP AL,13POP AXRET;输出一个制表符TAB LABEL NEARMOV AL,9JMP SHORT DISP ;输出一个回车换行符CRLF LABEL NEARMOV AL,13CALL DISP;显示一个字符DISP LABEL NEAR PUSH AXPUSH DXMOV AH,2 MOV DL,AL INT 21HPOP DXPOP AXRET;检查是否为运算符ISYSF LABEL NEAR CLDLODSBCALL ISJJ JZ ISYSF1 CALL ISII JZ ISYSF1 DEC SI ISYSF1:RET;检查是否是加减运算ISJJ LABEL NEAR CMP AL,'+' JZ ISYSF1 CMP AL,'-' RET;检查是否为乘除运算ISII LABEL NEAR CMP AL,'*' JZ ISYSF1 CMP AL,'/' JZ ISYSF1 CMP AL,'\' RET;数据输出;CX=10 十进制;CX=16 十六进制DOUT LABEL NEAR PUSH AXPUSH BXPUSH DXPUSH BPDOUT1:INC BPPUSH AXMOV AX,DXXOR DX,DXDIV CXMOV BX,AXPOP AXDIV CXPUSH DXMOV DX,BXOR BX,AXJNZ DOUT1DOUT2:POP AXADD AL,'0'CMP AL,'9'JBE DOUT3ADD AL,'A'-'9'-1 DOUT3:CALL DISPDEC BPJNZ DOUT2POP BPPOP DXPOP BXPOP AXRET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEARPUSH BXPUSH BPPUSH DIXOR AX,AXXOR DX,DXDATE1:MOV DI,AXLODSBCMP AL,'0'JB DATE7CMP AL,'9'DATE2:AND AX,0FHSHL DI,1RCL DX,1MOV BX,DIMOV BP,DXSHL DI,1RCL DX,1SHL DI,1RCL DX,1JCXZ DATE3SHL DI,1RCL DX,1Jmp short DATE4DATE3:ADD DI,BXADC DX,BPDATE4:ADD AX,DIADC DX,0JMP DATE1DATE5:ADD AL,9JMP DATE2DATE6:JCXZ DATE7CMP AL,'A'JB DATE7CMP AL,'F'JBE DATE5CMP AL,'a'JB DATE7CMP AL,'f'JBE DATE5DATE7:MOV AX,DIDEC SIOR DI,DXPOP DIPOP BPPOP BXRET;数据1与数据2根据YSF1进行加减运算MOV AX,NUM2MOV DX,NUM2+2CMP YSF1,'+'JZ JSJJ1SUB NUM1,AXSBB NUM1+2,DXJMP SHORT JSJJ2JSJJ1:ADD NUM1,AXADC NUM1+2,DXJSJJ2:RET;数据1与数据2根据YSF1进行乘除运算JSII1 LABEL NEARMOV BX,OFFSET NUM1JMP SHORT JSII2_1;数据2与数据3根据YSF2进行乘除运算JSII2 LABEL NEARMOV BX,OFFSET NUM2JSII2_1:DB 66HMOV AX,[BX]DB 66HMOV CX,[BX+4]CMP YSF2,'*'JNZ JSII2_2DB 66HIMUL CXJMP SHORT JSII2_3JSII2_2:DB 66HCWDDB 66HIDIV CXCMP YSF2,'/'JZ JSII2_3DB 66HXCHG DX,AXJSII2_3:DB 66HMOV [BX],AXRET;显示结果MOV AX,JGV4 MOV DX,JGV4+2 MOV CX,10CMP UV,10JZ XUJG0MOV CX,16 XUJG0:TEST DX,8000H JZ XUJG1CMP UV,10JZ XUJG2CALL DOUT XUJG2:NOT AXNOT DXADD AX,1ADC DX,0PUSH AXCMP UV,10JZ XUJG3MOV AL,' 'CALL DISPMOV AL,'('CALL DISP XUJG3:MOV AL,'-'CALL DISPPOP AXCMP UV,10JZ XUJG1CALL DOUTMOV AL,')'CALL DISPRETXUJG1:CALL DOUTRET;计算结果放入DX:AX中JSJG LABEL NEARCALL JSJJMOV AX,NUM1 MOV DX,NUM1+2 RET;从DS:SI处取一个数据LOADATE LABEL NEARLODSBCMP AL,'('JZ LOADATE1DEC SIPUSH CXXOR CX,CXCMP UV,10JZ LOADATE0INC CX ;取16进制数LOADATE0:CALL DATE ;取数据放入DX:AX中POP CXRETLOADATE1:PUSH NUM1 ;保存数据1数据2及运算符 PUSH NUM1+2PUSH NUM2PUSH NUM2+2PUSH YSFINC JUVMOV JGV4,0 ;结果值清零MOV JGV4+2,0;进行四则运算SZYS LABEL NEARCALL ISYSF ;首字符是运算符?JZ SZYS2CALL LOADATE ;不是,取数并保存MOV NUM1,AXMOV NUM1+2,DXSZYS1:XOR AX,AX ;数据2清零MOV NUM2,AXMOV NUM2+2,AXCALL ISYSF ;下个是运算符?JZ SZYS3JNZ SZYS6SZYS2:PUSH AXMOV AX,JGV4 ;将结果作为数据1MOV NUM1,AXMOV AX,JGV4+2MOV NUM1+2,AXPOP AXSZYS3:MOV YSF1,ALMOV YSF2,ALCALL ISJJ ;是加减运算转JZ SZYS4CALL LOADATE ;取数据2MOV NUM2,AXMOV NUM2+2,DXCALL JSII1 ;数据1与数据2根据YSF1进行乘除运算 JMP SZYS1 ; 结果保存在数据1中SZYS4:CALL LOADATE ;取数据2并保存MOV NUM2,AXMOV NUM2+2,DXSZYS4_1:CALL ISYSFJNZ SZYS6CALL ISJJ ;运算符2是加减运算?JNZ SZYS5 ;不是转PUSH AXCALL JSJJ ;数据1与数据2根据YSF1进行加减运算 POP AX ; 结果保存在数据1中MOV YSF1,AL ;保存新的运算符JMP SZYS4SZYS5:MOV YSF2,AL ;保存运算符2CALL LOADATE ;取数据3MOV NUM3,AXMOV NUM3+2,DXCALL JSII2 ;数据2与数据3根据YSF2进行乘除运算 JMP SZYS4_1 ; 结果保存在数据2中SZYS6:MOV CL,ALCMP AL,13JNZ SZYS9SZYS7:CALL JSJGCMP JUV,0JZ SZYS8DEC JUVPOP YSFPOP NUM2+2POP NUM2POP NUM1RETSZYS8:CMP CL,')'JZ SZYS10MOV JGV4,AX MOV JGV4+2,DX JNZ SZYS12 SZYS9:CMP AL,')'JNZ SZYS11INC SIJMP SZYS7 SZYS10:MOV NUM1,AX MOV NUM1+2,DX JMP SZYS1 SZYS11:STCRETSZYS12:CLCRET;数制处理UVIL LABEL NEARPUSH SIUVIL1:LODSBCMP AL,' 'JZ UVIL2CMP AL,9JZ UVIL2CMP AL,13JZ UVIL4JNZ UVIL1 UVIL2:MOV BX,SICALL OVERSJZ UVIL3LODSWCALL OVERSPOP SIJNZ SZYS11JNZ SZYS11PUSH SIMOV UV,10UVIL3:MOV AL,13MOV [BX-1],AL UVIL4:POP SICLCRET;预置结果YVJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2] MOV DS,AXMOV AX,DS:[0CH] MOV CS:JGV4,AX MOV AX,DS:[0EH] MOV CS:JGV4+2,AX PUSH CSPOP DSPUSH CSPOP ESRET;保存结果BCJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2] MOV DS,AXMOV AX,CS:JGV4 MOV DS:[0CH],AX MOV AX,CS:JGV4+2 MOV DS:[0EH],AX PUSH CSPOP DSPUSH CSPOP ESRETSTAR:MOV SI,81HCLDJNZ STAR1STAR0:MOV DX,OFFSET MESS1JMP STAR4STAR1:CALL YVJGCALL UVILJB STAR0MOV SAVESP,SPCALL SZYSMOV SP,SAVESPMOV DX,OFFSET MESS2JB STAR4CALL CRLFCALL XUJGCALL BCJGMOV DX,OFFSET MESS3STAR4:MOV AH,9INT 21HINT 20HSAVESP DW 0MESS1 DB 13,10,' Syntax:',13,10DB ' JS <Expression> [10]',13,10,'$'MESS2 DB 'Error in expression !$'MESS3 DB 13,10,'$'CODE ENDSEND NEWSTAR案例5数字方阵程序data segmentbuf1 db '1 2 38 9 47 6 5'buf2 db '1 2 3 412 13 14 511 16 15 610 9 8 7'buf3 db '1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9' dbuf db 14 dup(?)i1 db 0dh,0ah,'this is a fangzhen programme'db 0dh,0ah,'input q to exit'db 0dh,0ah,'Please input a number(3--5):','$'i2 db 0dh,0ah,'input error,please reinput!','$'n db ?b db 1data endsstack segmentdb 100 dup(?)stack endscode segmentassume ds:data,cs:code,ss:stack main:mov ax,datamov ds,axcall clearlop: lea dx,i1mov ah,9int 21hmov ah,1int 21hcmp al,'q'jz quitlea si,buf1mov n,7mov cl,3call clearcmp al,'3'jz slea si,buf2mov n,10mov cl,4cmp al,'4'jz slea si,buf3mov cl,5mov n,13cmp al,'5'jz slea dx,i2mov ah,9int 21hcall clearjmp lops:mov bl,nlea di,dbufl: mov al,[si]mov [di],alinc siinc didec bljne lmov [di],byte ptr '$' mov ah,2mov dh,bmov dl,0int 10hlea dx,dbufmov ah,9int 21hinc bloop sjmp lopquit: mov ah,4chint 21h;***清屏***clear proc nearpush axpush bxpush cxpush dxmov ah,6mov al,0mov ch,0mov cl,0mov dh,24mov dl,79mov bh,7int 10hpop dxpop cxpop bxpop axretclear endpcode endsend main案例6数据加密程序p macro buflea dx,bufmov ah,9int 21hendmdata segmentpp db 0dh,0ah,' welcome you to run this programme!$' qq db 0dh,0ah,' when you input number,press enter.$' qw db 0dh,0ah,'6eh,52h,94h,52h,$'qa db 0dh,0ah,' $'info1 db 0dh,0ah,0dh,' input number:$'info2 db 0dh,0ah,' output number:$'bufa db 20db ?db 20 dup(0)bufb db 20 dup(0)buf1 db 20db ?db 20 dup(0)buf2 db 20 dup(0)buf3 db 20db ?db 20 dup(0)buf4 db 20 dup(0)data endsstack segmentdb 100 dup(0)stack endscode segmentassume ds:data,cs:codes: mov ax,datamov ds,axmov ah,0mov al,3int 10hmov ah,0bhmov bh,0mov bl,3int 10hp ppp qqlea si,qwmov di,5mov dx,0405hmov ah,15int 10hlp: mov ah,2inc dlint 10hmov bl,[si]mov cx,1mov ah,9int 10hinc sijnz lpp qap qap qap info1lea dx,bufamov ah,10int 21hlea si,bufa+1mov ch,0mov cl,[si]lea di,bufbn: mov bx,offset bufamov al,0xlat bufamov [di],alinc diloop nmov byte ptr [di],'$' p info2p bufbp info1lea dx,buf1mov ah,10int 21hlea si,buf1+1mov ch,0mov cl,[si]lea di,buf2n1: mov bx,offset buf1 mov al,2xlat buf1mov [di],alinc diloop n1mov byte ptr [di],'$' p info2p buf2p info1lea dx,buf3mov ah,10int 21hlea si,buf3+1mov ch,0mov cl,[si]lea di,buf4n2: mov bx,offset buf3mov al,3xlat buf3mov [di],alinc diloop n2mov byte ptr [di],'$'p info2p buf4mov ah,4chint 21hcode endsend s案例7代码转换程序(1)public info1,info2,bufa,bufb,buf,main,info0,info3extrn change1:far,change2:far,change3:far,change4:fardata segmentinfo0 db 0ah,0dh,'this is the change of letter to leter:$'info1 db 0ah,0dh,'please input string:$'info2 db 0ah,0dh,'output string:$'bufa db 81db ?db 80 dup (?)bufb db 80 dup (?)info3 db 0ah,0dh,'this is the change of digital to digital:',0ah,0dh,'$'buf db 0dh,0ah,'the number is:0100101010001111b',0ah,0dh,'the result is:$' data endsstack segment stackdb 200 dup (?)stack endscode segmentmain proc farassume ds:data,cs:code,ss:stackmov ax,datamov ds,axdisp macro mlea dx,mmov ah,9int 21hendmcall change1call change2disp info3disp bufcall change3call change4retmain endpcode endsend(2)extrn info1:byte,info2:byte,bufa:byte,bufb:byte,info0:byte public change1code segmentassume cs:codelowtohigh proc nearcmp al,'a'jb stopcmp al,'z'ja stopsub al,20hstop :retlowtohigh endpchange1 proc farlea dx,info0mov ah,9int 21hlea dx,info1mov ah,9int 21hlea dx,bufamov ah,10int 21hlea si,bufa+1lea di,bufbmov ch,0mov cl,[si]add si,1next:mov al,[si]call lowtohighmov [di],alinc siinc diloop nextmov byte ptr [di],'$'lea dx,info2mov ah,9int 21hlea dx,bufbmov ah,9int 21hretchange1 endpcode endsend(3)extrn info1:byte,info2:byte,bufa:byte,bufb:byte public change2code segmentassume cs:codehightolow proc nearcmp al,'A'jb stopcmp al,'Z'ja stopadd al,20hstop:rethightolow endpchange2 proc farlea dx,info1mov ah,9int 21hlea dx,bufamov ah,10int 21hlea si,bufa+1lea di,bufbmov ch,0mov cl,[si]inc sinext:mov al,[si]call hightolowmov [di],alinc siinc diloop nextmov byte ptr [di] ,'$' lea dx,info2mov ah,9int 21hlea dx,bufbmov ah,9int 21hretchange2 endpcode endsend(4)extrn buf:byte,info3:byte public change3code segmentchange3 proc farassume cs:codesub ax,axmov ch,4mov cl,4mov bx,4a8fhrotate: rol bx,clmov al,bland al,0fhadd al,30hcmp al,3ahjl printitadd al,7hprintit: mov dl,almov ah,2int 21hdec chmov dl,'H'mov ah,2int 21hretchange3 endpcode endsend(5)public change4data segmentbuf db 0ah,0dh,'please input the four hexnumber:$' data endscode segmentassume cs:code,ds:datachange4 proc farmov ax,datamov ds,axlea dx,bufmov ah,9int 21hmov bx,0mov ch,4input: mov cl,4sal bx,clmov ah,1int 21hcmp al,39hja afand al,0fhjmp binaryaf: and al,0fhadd al,9binary: or bl,aldec chcmp ch,0jne inputmov dl,'H'mov ah,2int 21hmov dl,0ahmov ah,2int 21hmov ah,02int 21hmov cx,16disp: mov dl,0rol bx,1rcl dl,1or dl,30hmov ah,02hint 21hloop dispmov dl,'B'mov ah,2int 21hretchange4 endpcode endsend(6)public change5data segmentbinary dw 7fffh,50hn=($-binary)/2buf db 7 dup(0)info1 db 0ah,0dh,'this is the change from hexnumber to decimal:$' info2 db 0ah,0dh,'the number is:7fffh,50h$',0ah,0dhinfo3 db 0ah,0dh,'the result is:$'data endsstack segment stackdb 200 dup(0)stack endscode segmentassume cs:code,ds:data,ss:stackf2to10 proc nearpush bxpush dxpush sipush cxdisp macro mlea dx,mmov ah,9int 21hendmlea si,bufor ax,axjns plusneg axmov [si],byte ptr '-' inc siplus: mov bx,10mov cx,0lop1: mov dx,0div bxpush dxinc cxor ax,axjne lop1lop2: pop axcmp al,10jb l1add al,7l1: add al,30hmov [si],alinc sidec cxjne lop2mov [si],byte ptr 'D' inc simov [si],byte ptr '$' disp info3disp bufpop cxpop sipop dxpop bxretf2to10 endpchange5 proc farstart: mov ax,datamov ds,axdisp info1disp info2mov cx,nlea di,binarylopa: mov ax,[di]call f2to10add di,2loop loparetchange5 endpcode endsend案例8键盘录入数据的转换与显示(1)PUBLIC ASC_TO_BIN , BIN_TO_ASCIIDATA SEGMENT COMMONINPUT_MESSAGE DB 0AH , 'PLEASE INPUT A NUMBER(LESS THAN 5 FIGURES):$'IN_ASC_BUF DB 6 ;十进制数的输入缓冲区,共可接收6个字符DB ? ;保留,用于10号调用时DOS填入实际输入字符个数DB 6 DUP(?) ;一个符号位,四位数字ASCII 码,加上一个回车符,;共计6字符BIN_BUF1 DW ? ;将第一个数转换为二进制后,放于此处OUTPUT_MESSAGE DB 0AH , 'THE SUM IS:' , '$'OUT_ASC_SUM DB 6 DUP(?) , '$' ;将二个数的和转换为ASCII码后,放于此处,;以供9号调用显示DATA ENDSCSEG SEGMENTASSUME CS:CSEG , DS:DATAASC_TO_BIN PROC FAR;ASCII码转换为二进制数;入口:十进制数的ASCII码在IN_ASC_BUF内;出口:转换后的二进制数在AX内;算法:先将其转换成十进制数字,再用累加和乘10加X的方法变成二进制数,如将;358转换为二进制数,可先将累加和赋0,再计算(((0*10+3)*10+5)*10+8),结果为二;进制数,再由符号位决定是否需要求补。
汇编语言程序设计(5)

例:
第 4 章 汇编语言程序设计简介
ORG 1000H
BUF1: DB 38H, 7FH, 80H
BUF2: DB 45H, 66H
ORG伪指令指定了标号BUF1的地址为1000H, 而DB伪 指令是将其后的二进制数表38H, 7FH, 80H依次存放在1000H, 1001H, 1002H 3 个连续单元之中, BUF2也是一个标号, 其地 址与前一条伪指令连续, 即1003H, 1004H地址单元中依次存 放 45H, 66H。
如果在程序中要多次使用到某一地址,由EQU指令将其赋值 给一个字符名称,一旦需要对其进行变动,只要改变EQU命 令后面的数字即可,而不需要对程序中涉及到该地址的所有 指令逐句进行修改。
13
第 4 章 汇编语言程序设计简介
注意, 由EQU等值的字符名称必须先赋值后使用,且 在同一个源程序中,同一个标号只能赋值一次。 例:
H)=10H。
18
第 4 章 汇编语言程序设计简介
六、BIT——位地址符号指令
指令功能为:将位地址赋值给指定的符号名称,通常用于位符 号地址的定义。
指令如下:
字符名称 BIT 位地址
例如,X1 BIT P1.0
汇编结果为将位地址P1.0赋给变量X1,即在程序中便可 使用X1代替位地址P1.0。
19
(c)多分支
30
第 4 章 汇编语言程序设计简介
2. 一般分支程序结构实例
【例5】 x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解:
1 y 1
0
x0 x0 x0
31
第 4 章 汇编语言程序设计简介
程序如下:
START:
CJNE R0,#00H,SUL1
10 C语言与汇编语言的混合编程

3.混合项目(续)
模块3(文件名pulse3.asm): PUBLIC _DELAY1MS;用PUBLIC声明_DELAY1MS为其它函数调用,以 “_”为前缀的函数名,表示该函数通过寄存器传递参数 DELAY SEGMENT CODE;定义DELAY段为再定位程序段 ,DELAY是用 户任意起的段名 RSEG DELAY ;选择DELAY为当前段 _DELAY1MS: DELA:MOV R6,#12 ;2T LOP1:MOV R5,#250 ;2T DJNZ R5,$ ;4T DJNZ R6,LOP1 ;4T DJNZ R7,DELA ;R7中数值为C ;程序传递过来的参数,参数为2则延时2ms EXIT: RET END
1.混合编程的实现(续)
第二步:在Keil C51环境下,在Project窗口中包含汇编代码 的C文件上单击右键,在弹出的快捷菜单中选择“Options for…”命令,再点击选中右边的“Generate Assembler SRC File”和“Assembler SRC File”复选框,使检查框由灰色(无 效)变成黑色(有效)状态。
12
3.混合编程
模块1(文件名pulse1.c): #include<STC12C5A.h> #define uchar unsigned char sbit P1_1=P1^1; extern void delay4ms(void); //外部函数delay4ms()声明 void main() { while(1) { P1_1=0; delay4ms (); //调用模块2延时4ms P1_1=1; delay4ms (); //调用模块2延时4ms } }
4
1.混合编程的实现(续)
5
C语言程序设计 100个小程序代码

for(i=2;i<=k;i++)
if(x%i==0)break;
3
if(i>k) return(1); else return(0); } main() {int a,s=0,max=0; clrscr(); for(a=200;a<=998;a++) if(prime(a)&&prime(a+2)&&(a+2)>max)max=a+2; s=max+max-2; printf("%d",s); }
int prime(int x)
{ int i,k;
k=sqrt(x);
for(i=2;i<=k;i++)
if (x%i==0) break;
if (i>k) return(1);
else return(0); }
main()
{ int i,s=0;
int prime(int x);
for(i=200;i<=999;i++)
761#include<math.h> int prime(int x) {int i,k; k=sqrt(x); for(i=2;i<=k;i++)
1
if(x%i==0) break; if(i>k) return(1); else return(0); } main() {int a,b,c,i,n=0; clrscr(); for(i=800;i>=300;i--) { a=i/100; b=i%100/10; c=i%10; if((b+c)%10==a&&prime(i)) n++; if(n==1) break;
精选10个汇编语言程序案例集

精选10个汇编语言程序案例集
1. 汇编语言编写的计算器程序,这个程序可以接受用户输入的两个数字,然后执行加减乘除等运算,并将结果输出到屏幕上。
2. 文件复制程序,这个程序可以使用汇编语言编写,实现将一个文件的内容复制到另一个文件中的功能。
3. 简单的操作系统内核,使用汇编语言编写一个简单的操作系统内核,可以包括基本的文件管理和进程调度功能。
4. 汇编语言写的游戏,例如经典的贪吃蛇游戏或者俄罗斯方块游戏,这些游戏可以使用汇编语言编写。
5. 串口通信程序,使用汇编语言编写一个可以通过串口进行通信的程序,可以实现数据的发送和接收。
6. 硬件驱动程序,编写一个简单的汇编语言程序,可以控制硬件设备,例如控制LED灯的亮灭。
7. 汇编语言编写的加密解密算法,实现一个简单的加密解密算
法,例如凯撒密码或者简单的异或运算。
8. 简单的图形界面程序,使用汇编语言编写一个简单的图形界面程序,可以实现基本的窗口和按钮等功能。
9. 汇编语言编写的网络通信程序,实现一个简单的网络通信程序,可以进行基本的数据传输和接收。
10. 汇编语言编写的嵌入式系统程序,例如可以编写一个控制LED灯的嵌入式系统程序,可以通过按键控制LED的亮灭。
20个简单汇编语言程序

20个简单汇编语言程序以下是20个简单的汇编语言程序示例:1. 计算两个数的和:MOV AX, 5。
ADD AX, 3。
这段代码将 5 存储在 AX 寄存器中,然后将 3 加到 AX 中,最终 AX 中的值为 8。
2. 比较两个数的大小:MOV AX, 5。
CMP AX, 3。
这段代码将 5 存储在 AX 寄存器中,然后将 AX 中的值与 3 进行比较。
3. 循环打印数字:MOV CX, 10。
MOV AX, 1。
LOOP_START:MOV DL, AL.ADD DL, 48。
MOV AH, 2。
INT 21h.INC AL.LOOP LOOP_START.这段代码使用循环打印数字 1 到 10。
4. 计算阶乘:MOV CX, 5。
MOV AX, 1。
LOOP_START:MUL CX.LOOP LOOP_START.这段代码计算 5 的阶乘,并将结果存储在 AX 寄存器中。
5. 判断奇偶数:MOV AX, 7。
AND AX, 1。
这段代码将 7 存储在 AX 寄存器中,然后将 AX 中的值与 1进行与运算,结果为 1,表示奇数。
6. 字符串反转:MOV SI, OFFSET str.MOV DI, OFFSET str.MOV CX, LENGTHOF str.DEC CX.REVERSE_LOOP:MOV AL, [SI]MOV DL, [DI+CX]MOV [DI+CX], AL.MOV [SI], DL.INC SI.LOOP REVERSE_LOOP.这段代码将字符串 `str` 反转。
7. 计算斐波那契数列:MOV CX, 10。
MOV AX, 0。
MOV BX, 1。
FIB_LOOP:ADD AX, BX.XCHG AX, BX.LOOP FIB_LOOP.这段代码计算斐波那契数列的前 10 个数。
8. 判断一个数是否为质数:MOV AX, 17。
MOV BX, 2。
CHECK_PRIME:XOR DX, DX.DIV BX.CMP DX, 0。
VB小程序代码实例

VB小程序代码实例VB小程序是一种基于Visual Basic语言开发的应用程序,它可以在Windows 操作系统上运行。
本文将为您提供一个VB小程序代码实例,帮助您了解如何编写和运行一个简单的VB小程序。
代码实例如下:```vbImports SystemPublic Class HelloWorldPublic Shared Sub Main()Console.WriteLine("Hello, World!")Console.ReadLine()End SubEnd Class```上述代码是一个经典的“Hello, World!”程序,它会在控制台输出一条问候语,并等待用户按下回车键。
下面是代码解释:- `Imports System`:这个语句告诉编译器我们将使用System命名空间中的类和方法。
- `Public Class HelloWorld`:这是一个公共类的声明,类名为HelloWorld。
- `Public Shared Sub Main()`:这是程序的入口点,它是一个公共静态方法,程序从这里开始执行。
- `Console.WriteLine("Hello, World!")`:这行代码会在控制台输出一条问候语。
- `Console.ReadLine()`:这行代码会等待用户按下回车键,以便程序暂停执行。
您可以将上述代码复制到一个文本编辑器中,并将文件保存为`.vb`扩展名。
然后,使用VB编译器将其编译为可执行文件,并在Windows操作系统上运行。
这个简单的VB小程序只是一个入门示例,您可以根据自己的需求和兴趣编写更复杂的VB小程序。
VB语言具有丰富的特性和功能,可以用于开发各种类型的应用程序,包括图形用户界面(GUI)应用程序、数据库应用程序、Web应用程序等。
希望这个VB小程序代码实例能够帮助您入门VB编程,并为您今后的学习和开发提供一些参考。
汇编语言小程序例子

盛年不重来,一日难再晨。
及时宜自勉,岁月不待人。
1.编写统计AX中1、0个数的源程序。
1的个数存入CH,0的个数存入CL。
CODE SEGMENTASSUME CS:CODESTART: MOV CX, 0MOV DX,17AA1: SUB DX, 1JZ AA3SHL AX, 1JNC AA2INC CHJMP AA1AA2: INC CLJMP AA1AA3: MOV AH,4CHINT 21HCODE ENDSEND START2.编写比较两个字符串STRING1和STRING2所含字符是否完全相同的源程序,若相同则显示“MATCH”,若不相同则显示“NO MATCH”。
程序:DATA SEGMENTR1 DB 'MATCH',0AH,0DHR2 DB 'NO MATCH',0AH,0DH STRING1 DB 'XXXXX'N1 EQU $-STRING1STRING2 DB 'YYYYY'N2 EQU $-STRING2DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV AX,N1CMP AX,N2JNZ AA1ADD AX,1LEA SI,STRING1LEA DI,STRING2AA2: MOV BL,[SI]MOV BH,[DI]INC SIINC DISUB AX,1JZ AA3CMP BL,BH JZ AA2JMP AA1AA3: LEA BX,R1 MOV CX,7 AA4: MOV DL,[BX] INC BXMOV AH,2INT 21HLOOP AA4JMP EAA1: LEA BX,R2 MOV CX,10 AA5: MOV DL,[BX] INC BXMOV AH,2INT 21HLOOP AA5INT 21HCODE ENDSEND START3.从键盘读入一个四位的十六进制数,CRT显示等值的二进制数.由于每个十六进制数位对应4个二进制,所以每读入一个十六进制位后,即可将其对应的4个二进制位依次输出。
(汇编语言)电梯程序完整版

ioport equ 0cc00h-0280hls273a equ ioport+2a8h;74ls273芯片地址ls273b equ ioport+2b0h;ls273c equ ioport+2b8hio8255a equ ioport+288h;8255控制端以及a,c端口地址io8255b equ ioport+289hio8255c equ ioport+28ahio8255 equ ioport+28bhio8253a equ ioport+280h;8253控制端以及0,1计数端口地址io8253b equ ioport+281hio8253c equ ioport+283hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;七段码MENU DB '************************************************',0DH,0AHDB ' * 电梯*',0DH,0AHdb ' * 8255b--pb6~pb0--led6~led0 *',0Dh,0Ahdb ' * *',0Dh,0Ahdb ' * pa0~pa7-----a~g *',0Dh,0Ahdb ' * 8255CS~288H 8253cs~280hls273~2a8,2b0 *',0Dh,0Ahdb ' * 08006127 凌学梦*',0Dh,0Ahdb '************************************************',0Dh,0AhDB '1~8------1 ~ 8FLOOR!',0DH,0AHDB 'P----------STOP!',0DH,0AHDB 'V----------DIRECT ARRIVE!',0DH,0AHDB 'ESC----------EXIT!',0DH,0AHDB 'ENTER----------RUN!',0DH,0AH,'$'data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,offset menumov ah,09int 21hmov dx,io8255;8255初始化,a口输出,c口输入mov al,89hout dx,almov cl,31h;cl代表当前电梯所在楼层,初始值设为1main: mov al,0call disp;显示当前楼层mov bl,0;bl为第一次输入的要去的楼层mov ch,0;ch为在中途中再次输入的要去的楼层call disp8ledmov ah,01;键盘输入blint 21hcmp al,1bh;是esc则退出je exit1cmp al,31h;在1-8之间?如不是重新输入jl maincmp al,38hjg mainmov bl,alcall disp8led;8led显示bl对应的楼层cmp bl,cl;bl与cl比较je main;相等则返回重新输入jg up;大于则向上运行jl down;小于则向下运行up: call stop;调用暂停子程序goup: add cl,1call updelay;调用向上运行延时子程序call disp;调用显示子程序,用于显示当前楼层clcmp cl,bl;cl,bl不等则继续je main;相等则返回jmp goupexit1: jmp exittomain:jmp mainupgetch:mov ah,1;在上升过程中如在有按键则跳转此处int 21hcmp al,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能je uprepaircmp al,70h;p键急停键je urgentcmp al,31h;在1-8之间?如不是继续上行jl gotoupcmp al,38hjg gotoupmov ch,alcall disp8led;显示cl对应楼层ledcall delay2;两秒计时时间到call disp;显示当前楼层call blequcl;判断bl与cl是否相等cmp ch,cl;比较ch与cl的区别je stopupbl;相等着在该层停,等待运行信号输入jl upbldownch;ch小于cl则先上行至bl在下行至chcmp ch,bl;ch大于cl则在判断ch与bl的大小关系je jmpupbl;相等则一直上行至bljl upchupbl;ch大于cl小于bl则先上行到ch在上行到bl jg toupblupch;ch大于bl则先上行到bl在上行到ch gotoup:call delay2jmp goupuprepair:mov al,0;验收时未用mov ah,1int 21hcmp al,73hjne uprepaircall delay2call dispjmp goupurgent: call delay2;急停功能call dispjmp mainupdelay proc near;向上运行延时子程序call delay;用于初始化8253push dxud: mov ah,1;键盘是否有输入int 16hjne upgetch;如有则跳转到输入处理mov dx,io8255c;8255c口输入in al,dxand al,01;是否计时结束jz udpop dxretupdelay endptoupblupch:jmp upblupchdown: call stop;调用暂停子程序godown: sub cl,1call downdelay;调用向下运行延时子程序call disp;调用显示子程序,用于显示当前楼层clcmp cl,bl;cl,bl不等则继续je tomain;相等则返回jmp godownstopupbl:call dispmov ch,0call disp8ledcall stop2call upbljmp mainupbldownch:call disp8ledcall upblmov bl,0call disp8ledcall stop2call downchjmp mainjmpupbl:mov ch,0call disp8ledcall upbljmp mainupchupbl:call disp8ledcall upchmov ch,0call disp8ledcall stop2call upbljmp mainupblupch:call disp8ledcall upblmov bl,0call disp8ledcall stop2call upchjmp maindowndelay proc near;向下运行延时子程序,与向上运行延时子程序大体相同 call delaypush dxddy: mov ah,1int 16hjne downgetchmov dx,io8255cin al,dxand al,01jz ddypop dxretdowndelay endpdowngetch:mov ah,1;在下降过程中如在有按键则跳转此处int 21hcmp al,73h;s键断电待修,验收时改用开关改变8253门控信号实现该功能je downrepaircmp al,70h;p键急停键je urgent2cmp al,31h;在1-8之间?如不是继续下降jl gotodowncmp al,38hjg gotodownmov ch,alcall disp8led;显示cl对应楼层ledcall delay2;两秒计时时间到call disp;显示当前楼层call blequcl;判断bl与cl是否相等cmp ch,cl;比较ch与cl的区别je stopdownbl;相等着在该层停,等待运行信号输入jg downblupch;ch大于cl则先下行至bl在上行至chcmp ch,bl;ch小于cl则在判断ch与bl的大小关系je jmpdownbl;相等则一直下行至bljl downbldownch;ch小于cl小于bl则先下行到bl在下行到chjg downchdownbl;ch大于bl则先下行到ch在下行到bl gotodown:call delay2jmp godowndownrepair:mov al,0mov ah,1int 21hcmp al,73hjne downrepaircall delay2call dispjmp godownstopdownbl:call disp8ledmov ch,0call disp8ledcall stop2call downbljmp maindownblupch:call disp8ledcall downblmov bl,0call disp8ledcall stop2call upchjmp mainurgent2:call delay2;急停功能call dispjmp mainjmpdownbl:mov ch,0call disp8ledcall downbljmp maindownbldownch:call disp8ledcall downblmov bl,0call disp8ledcall stop2call downchjmp maindownchdownbl:call disp8ledcall downchmov ch,0call disp8ledcall stop2call downbljmp mainvip: cmp bl,cl;直达功能jl vipdownjg vipupjmp mainvipup: add cl,1call vipdelaycall dispjmp vipvipdown:sub cl,1call vipdelaycall dispjmp vipvipgetch:mov ah,1;直达过程中对急停以及断电待修的处理 int 21hcmp al,73hje viprepaircmp al,70hje urgent2call delay2jmp vipviprepair:mov al,0mov ah,1int 21hcmp al,73hjne viprepaircall delay2call dispjmp vipvipdelay proc near;直达的延时子程序call delaypush dxvd: mov ah,1int 16hjne vipgetchmov dx,io8255cin al,dxand al,01jz vdpop dxretvipdelay endpstop proc near;暂停子程序,实现按回车继续和判断是否为直达键gostop: mov al,0mov ah,1int 21hcmp al,76h;是否为直达键je vipcmp al,13;是否为运行键jne gostopmov al,0retstop endpupbl proc near;上行到bl的子程序upbl1: add cl,1call dirdelaycall dispcmp cl,bljl upbl1retupbl endpupch proc near;上行到ch的子程序upch1: add cl,1call dirdelaycall dispcmp cl,chjl upch1retupch endpdownbl proc near;下行到bl的子程序downbl1:sub cl,1call dirdelaycall dispcmp cl,bljg downbl1retdownbl endpdownch proc near;下行到ch的子程序downch1:sub cl,1call dirdelaycall dispcmp cl,chjg downch1retdownch endpdelay proc near;初始化8253的子程序,两计数器连级 push dxmov dx,io8253c;8253的计数器0置方式3mov al,36hout dx,almov dx,io8253a;计数器0初始值为10000mov ax,10000out dx,almov al,ahout dx,almov dx,io8253c;8253的计数器1置方式0mov al,70hout dx,almov dx,io8253b;计数器1初始值为200mov ax,200out dx,almov al,ahout dx,alpop dxretdelay endpurgent3:call delay2call dispjmp mainblequcl proc nearcmp bl,cljne backje blequchmov bl,0call dispcall disp8ledcall stop2cmp ch,cljg upchherejl downchhereupchhere:call upchjmp maindownchhere:call downchjmp mainblequch:mov ch,0call disp8ledcall delay2jmp mainback: retblequcl endpdirdelay proc near;直接上下行的延时子程序 call delaypush dxdirback:mov ah,1int 16hjne dirgetchmov dx,io8255cin al,dxand al,01jz dirbackpop dxretdirdelay endpdirgetch:mov ah,1;直接上下行对按键的处理 int 21hcmp al,73hje dirrepaircmp al,70hje urgent3jmp dirbackdirrepair:mov al,0mov ah,1int 21hcmp al,73hjne dirrepaircall dispjmp dirbackstop2 proc near;没有直达键的暂停子程序gostop2:mov al,0mov ah,1int 21hcmp al,13jne gostop2mov al,0retstop2 endpdelay2 proc near;判断延市时是否结束的子程序push dxdelay3: mov dx,io8255cin al,dx ;查询8255的Pc0是否为高电平 and al,01jz delay3pop dxretdelay2 endpdisp proc near;显示当前楼层的子程序mov dl,clmov ah,2int 21h;用于在屏幕上显示mov dl,0dhmov ah,2 ;回车符int 21hmov dl,0ahmov ah,2 ;换行符int 21hsub cl,30h;七段码显示mov al,clpush bxpush dxmov dx,io8255bout dx,almov bx,offset ledxlatmov dx,io8255aout dx,alpop dxpop bxadd cl,30hmov al,0retdisp endpdisp8led proc near;8led显示,显示bl与cl对应的楼层push axcmp bl,0hje n0cmp bl,31hje n1cmp bl,32hje n2cmp bl,33hje n3cmp bl,34hje n4cmp bl,35hje n5cmp bl,36hje n6cmp bl,37hje n7cmp bl,38hje n8n0: mov al,0bjmp chledn1: mov al,1bjmp chledn2: mov al,10bjmp chledn3: mov al,100bjmp chledn4: mov al,1000bjmp chledn5: mov al,10000bjmp chledn6: mov al,100000bjmp chledn7: mov al,1000000bjmp chledn8: mov al,10000000bjmp chledchled: cmp ch,0je m0cmp ch,31hcmp ch,32hje m2cmp ch,33hje m3cmp ch,34hje m4cmp ch,35hje m5cmp ch,36hje m6cmp ch,37hje m7cmp ch,38hje m8m0: add al,0bjmp displedm1: add al,1bjmp displedm2: add al,10bjmp displedm3: add al,100bjmp displedm4: add al,1000bjmp displedm5: add al,10000bjmp displedm6: add al,100000bjmp displedm7: add al,1000000b jmp displedm8: add al,10000000b jmp displed displed:push dxpush axmov al,0ffhmov dx,ls273aout dx,almov dx,ls273bpop axout dx,alpop dxpop axmov al,0disp8led endpexit: mov ah,4ch int 21hcode endsend start。
汇编语言汇编语言实现ifwhilefor以及编写冒泡排序

汇编语言汇编语言实现ifwhilefor以及编写冒泡排序在计算机科学中,汇编语言是一种底层编程语言,它直接与计算机的硬件交互。
在汇编语言中,我们可以利用条件语句(if)、循环语句(while、for)以及排序算法(冒泡排序)来实现各种功能。
本文将介绍汇编语言中如何使用这些关键字来编写相应功能的代码,并且以冒泡排序算法为例进行详细说明。
一、if语句实现if语句在汇编语言中通常使用条件判断指令来实现。
下面是一个示例代码,演示如何使用if语句判断两个数的大小关系:```section .datanum1 db 10num2 db 20result db 0section .textglobal _start_start:mov al, byte[num1]mov bl, byte[num2]cmp al, bl ; 比较num1和num2的值jg greater ; 如果num1 > num2,则跳转到greater标签处jl less ; 如果num1 < num2,则跳转到less标签处jmp equal ; 如果num1 = num2,则跳转到equal标签处greater:mov byte[result], 1jmp doneless:mov byte[result], -1jmp doneequal:mov byte[result], 0jmp donedone:; 其他操作,比如打印结果或进行下一步操作```在上述代码中,我们将两个数分别存在`num1`和`num2`变量中,用`cmp`指令进行比较,根据比较结果使用`jmp`指令跳转到相应的标签位置。
通过这样的比较和跳转操作,我们可以实现基本的if语句功能。
二、while语句实现while语句在汇编语言中可以通过使用条件循环指令来实现。
下面是一个示例代码,演示如何使用while语句计算1到10的和:```section .datasum dw 0counter dw 1section .textglobal _start_start:mov cx, 10 ; 设置循环次数mov ax, 1 ; 设置计数器初始值loop_start:add word[sum], ax ; 将计数器的值加到sum中inc ax ; 计数器自增1loop loop_start ; 循环开始; 其他操作,比如打印结果或进行下一步操作```在上述代码中,我们将循环次数存储在`cx`寄存器中,将计数器的初始值存储在`ax`寄存器中。
生活中编程应用实例及例子

生活中编程应用实例及例子编程已经广泛应用于生活的方方面面。
从日常生活中的手机应用到复杂的工业自动化系统,编程技能在现代社会中具有不可忽视的重要性。
下面列举了几个生活中常见的编程应用实例及其例子。
1. 手机应用程序:手机应用程序是编程在日常生活中最常见的应用之一。
几乎每个人都使用智能手机,并使用各种应用程序来完成各种任务。
这些应用程序包括社交媒体应用(例如微信、微博、QQ)、短信和电话应用、银行应用、购物应用等等。
作为用户,我们通过与这些应用程序进行交互,从而实现日常生活中的各种功能。
举个例子,我们可以考虑购物应用。
当我们使用购物应用程序浏览和购买商品时,后台的编程代码负责处理搜索结果、选择商品、添加到购物车和处理付款等。
购物应用程序也可能包含其他功能,例如推荐系统、订单跟踪和客户服务等。
所有这些功能都是由编程代码实现的。
2. 软件应用程序:除了手机应用程序,我们还使用各种软件应用程序来处理各种任务。
例如,办公室软件如Microsoft Office系列软件(如Word、Excel、PowerPoint)被广泛用于管理文档、制作报告和展示等。
另一个例子是图像处理软件,如Adobe Photoshop。
这些软件使用编程代码来处理图像,例如改变颜色、调整对比度、添加效果等。
图像处理软件也可以通过自动化一些重复的任务来提高工作效率,例如批量调整图片大小或重命名文件等。
3. 网络社交媒体:网络社交媒体(如微博、微信、Facebook、Twitter等)的整个平台都是通过编程实现的。
这些平台使用编程代码来处理用户之间的连接、分享内容、处理用户输入等。
例如,在微博上发帖、评论和点赞都是通过编程代码实现的。
这些平台还利用编程实现了推荐系统,根据用户的兴趣和行为向他们推荐相关内容。
例如,在YouTube上观看视频时,YouTube会根据我们的观看历史和喜好向我们推荐其他视频。
这种个性化推荐背后的算法和代码都是由程序员编写的。
汇编语言程序设计例子

汇编语言程序设计例子汇编语言程序设计典型案例一顺序程序设计例:从键盘输入两个数字(0-9)输出它们积。
(X1 已验证) P41CODE SEGMENTASSUME CS:CODEORG 100HMain:MOV AH,1INT 21HMOV BL,ALMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV AH,1INT 21HSUB AL,30HSUB BL,30HMUL BLMOV BL,10DIV BLADD AX,3030HMOV BX,AXMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV DL,BLMOV AH,2INT 21HMOV AH,2MOV DL,0DHINT 21HMOV DL,0AHINT 21HMOV DL,BHMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND Main二分支程序1 简单分支例:已知AX中放有一个16位无符号数,BL中放有一个8位无符号数,1P50编写将它们相加结果放DX的程序。
2 两路分支例:编写将BX与DX中较大的一个无符号数放入AX中的程序。
( X2 已验证) 1P51DATA SEGMENTBUF1 DW ?,?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA SI,BUF1MOV BX,[SI]INC SIMOV DX,[SI]CMP BX,DXJA Lab1MOV AX,DXJMP Lab2Lab1:MOV AX,BXLab2:MOV AH,4CHINT 21HCODE ENDSEND START3 复杂条件的分支例子:从键盘读入两个一位数,并输出其积。
P52(X1 已验证)CODE SEGMENTASSUME CS:CODEORG 100HMOV AH,1;从键盘读第一个数INT 21HCMP AL,'0'JB Lab1CMP AL,'9'JA Lab1MOV BL,ALMOV AH,2MOV DL,13HINT 21HMOV DL,10HINT 21HMOV AH,1; 从键盘读第二个数INT 21HCMP AL,'0'JB Lab1CMP AL,'9'JA Lab1SUB AL,30H ;把后读入的数的ASCALL码还原为数字SUB BL,30H ;把先读入的数的ASCALL码还原为数字MUL BL ;两数相MOV BL,10 ;DIV BL ;分拆积的十位和个位ADD AX,3030H ;积转换为ASCALL码MOV BX,AXMOV AH,2MOV DL,13H ;回车INT 21HMOV DL,10H ;换行INT 21HMOV DL,BL;输出显示十位MOV AH,2INT 21HMOV DL,BH;输出显示个位INT 21HJMP Lab2Lab1:MOV AH,2MOV DL,'E'INT 21HLab2:MOV AH,4CHINT 21HCODE ENDSEND4 多路分支例3 从键盘上接收按键输入,如果按下的是小写字母则输出‘L’,是大写字母则输出‘U’,如果是数字则输出‘N‘,都不是则输出‘*’。
单片机汇编语言经典一百例

51单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。
实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。
程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。
实际应用中例如:波形发生器。
程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。
实际应用例如:定时报警器。
程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。
组成原理实验指导全过程(清华大学)

《计算机组成原理》实验指导重庆文理学院计算机学院贾旭飞实验一监控程序与汇编语言程序设计一、实验原理:教学机的监控程序是用教学机的汇编语言实现的,运行在教学机的硬件系统之上。
它的主要功能是支持把计算机终端或PC机仿真终端接入教学机系统,使用这样的设备执行输入/输出操作,运行教学机的有关程序,以更方便直观的形式支持教学机上的各项实验功能,提供教学机汇编语言的可用子程序。
监控程序提供类似PC机DOS系统下的Debug程序的功能,支持A、U、G、P、T、R、D和E共8个监控命令。
监控命令的格式为:单字母的命令名后跟回车,或命令名后跟一个地址参数,或寄存器名(编号)参数。
当有些命令运行时需要参数,但命令名后又不跟参数时,监控程序会从内存指定单元取一个默认的地址参数值,通常为该命令前一次运行后所接收地址。
TEC—2机从终端接收地址、指令,数值时,均用最多4位的16进制数输入与显示,并且不能(或说不必)用跟字符h加以标志。
⑴单条汇编命令A格式:A[adr]这里的[adr]表示此处的地址参数adr为任选项(但选择范围必须为0800H—0FFFH)。
无此参数时,系统将取默认值。
该规则下同。
功能:完成单条指令的汇编操作,把产生出来的TEC—2机的执行代码放入对应的内存单元中。
命令名后的地址是头一条汇编语句的执行码的内存单元地址。
每条语句汇编完成之后,系统将相应修改地址值,以便正确处理下条汇编语句。
在应该输入汇编语句时,不给出汇编语句而直接回车,则结束A命令的运行过程。
若汇编中发现语法错误,用ˆ指明出错位置后请求重新给出正确语句。
要说明,这里的单条汇编功能不很完善,例如不支持语句标号,也不能使用伪指令等。
遇到这些问题,要求使用者直接使用机器码,并通过E命令将其送入相应内存单元。
⑵反汇编命令U格式:U[adr]功能:每次从指定的(或默认的)地址反汇编15条命令,并将结果显示在终端屏幕上。
反汇编完成之后,已将该命令的默认地址修改好。
汇编语言_24个汇编实例小程序

24个汇编小程序题目列表:逆序输出字符串“BASED ADDRESSING”从键盘上输入两个数,分别放到x,y单元,求出它们的和是编写一段程序,要求在长度为10h的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符把一个包含20个数据的数组M分成两组:正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来求出首地址为data的100个字数组中的最小偶数,并把它放在ax中输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“no match”从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果有一个首地址为mem的100个字的数组,试编程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零从键盘上输入一串字符(用回车键结束,使用10号功能调用)放在string中,是编制一个程序测试字符串中是否存在数字。
如有,则把cl的第五位置1,否则将该位置置0在首地址为data的字数组中,存放了100h的16位字数据,试编写一个程序,求出平均值放在ax寄存器中,并求出数组中有多少个数小于此平均值,将结果放在bx寄存器中(f分别考虑有符号数、无符号数情况)一直数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。
试编制一个程序,把既在A中又在B中出现的整数存放于数组C中设在A、B和D单元中分别存放着三个数。
若三个数都不是0,则求出三个数的和并存放在S单元,若其中有一个数为0,则把其它两个单元也清零。
请编写此程序从键盘输入一系列字符(以回车键结束),并按字母、数字和其他字符分类计数,最后显示这三类的计数结果已定义两个整数变量A和B,试编写程序完成以下功能(1)若两个树种有一个是奇数,则将奇数存入A中,偶数存入B中(2)若两个数均为奇数,则将两个数加1后存回原变量(3)若两个数均为偶数,则两个变量均不变写一段子程序skiplines,完成输出空行的功能。
创意编程小程序实例

创意编程小程序实例
1.画图小程序:使用Python绘制各种图形,如正方形、三角形、五角星等,并给图形添加不同的颜色和动画效果。
2. 文字处理小程序:使用Python编写一个简单的文本编辑器,可以实现文本输入、保存、撤销、复制、粘贴等功能。
3. 游戏小程序:使用Python编写一个简单的游戏,如井字棋、石头剪刀布、贪吃蛇等。
4. 数据可视化小程序:使用Python处理大量数据,并将数据可视化为图表、图形等形式,例如使用matplotlib库绘制折线图、柱
状图等。
5. 网络爬虫小程序:使用Python编写一个简单的网络爬虫,可以自动获取网站上的数据并进行分析。
6. 机器学习小程序:使用Python编写一个简单的机器学习程序,如分类、聚类、回归等,利用已有的数据训练模型并进行预测。
7. 聊天机器人小程序:使用Python编写一个简单的聊天机器人,可以与用户进行简单的对话和交互,例如回答问题、闲聊等。
8. 自动化运维小程序:使用Python编写一个简单的自动化运维程序,可以自动化管理服务器、更新软件等操作。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CODE SEGMENT
ASSUME CS:CODE START: MOV CX, 0
MOV DX,17
AA1: SUB DX, 1
JZ AA3
SHL AX, 1
JNC AA2
INC CH
JMP AA1
AA2: INC CL
JMP AA1
AA3: MOV AH,4CH
INT 21H CODE ENDS
END START
1.编写比较两个字符串STRING1和STRING2所含字符是否完全相同的源程序,若相同则显
示“MATCH”,若不相同则显示“NO MATCH”。
程序:
DATA SEGMENT
R1 DB 'MATCH',0AH,0DH
R2 DB 'NO MATCH',0AH,0DH
STRING1 DB 'XXXXX'
N1 EQU $-STRING1
STRING2 DB 'YYYYY'
N2 EQU $-STRING2
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AX,N1
CMP AX,N2
JNZ AA1
ADD AX,1
LEA SI,STRING1
LEA DI,STRING2 AA2: MOV BL,[SI]
MOV BH,[DI]
INC SI
INC DI
SUB AX,1
JZ AA3
CMP BL,BH
JZ AA2
JMP AA1
AA3: LEA BX,R1
MOV CX,7
AA4: MOV DL,[BX]
INC BX
MOV AH,2
INT 21H
LOOP AA4
JMP E
AA1: LEA BX,R2
MOV CX,10
AA5: MOV DL,[BX]
INC BX
MOV AH,2
INT 21H
LOOP AA5
E: MOV AH,4CH
INT 21H
CODE ENDS
END START
2.从键盘读入一个四位的十六进制数,CRT显示等值的二进制数.
由于每个十六进制数位对应4个二进制,所以每读入一个十六进制位后,即可将其对应的4个二进制位依次输出。
由于数字‘0’~ ‘9’的ASCⅡ码为30H~39H,字母‘a’~‘f’与
‘A’~‘F’的ASCⅡ码为61H~66H 与41H~46H ,因此,如果输入的字母为数字‘0’~‘9’,则其低4位即为对应的二进制位;如果输入的字符为字母‘a’~‘f’或‘A’~‘F’,则需要减7,然后通过移位将低4位依次输出。
汇编程序如下:
DATA SEGMENT
MSG1 DB 'Hex:', '$'
MSG2 DB 0DH, 0AH, 'Binary:', '$'
COUNT EQU 4
BUF DB 4 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX, DATA
MOV DS, AX
LEA DX, MSG1
MOV AH, 9
INT 21H
MOV CX, COUNT
MOV SI, 0
INPUT: ;通过四次循环从键盘读入四位十六进制数MOV AH, 1
INT 21H
MOV BUF[SI], AL
DEC CX
INC SI
CMP CX, 0
JNZ INPUT
NEXT3: LEA DX, MSG2
MOV AH, 9
INT 21H
MOV CX, COUNT
MOV SI, 0
NEXT2: MOV BL, BUF[SI]
CMP BL , '9'
JBE OK ;读入的字符<=9转向OK:
SUB BL, 7 ;读入字符>= 9 减7
OK: PUSH CX
MOV CL ,4
SHL BL, CL ; 逻辑左移4位,低4位à高4位
MOV CX, 4 ; 4次循环将当前处理字符的4位二进制输出
NEXT1: MOV DL, '0'
SHL BL, 1
JNC SKIP
INC DL
SKIP: MOV AH, 2
INT 21H
LOOP NEXT1
POP CX ;
INC SI
LOOP NEXT2 ; 4次循环将4位十六进制数,每位转换为对应的4位二进制EXIT: MOV AH, 4CH
INT 21H
CODE ENDS
END START
3.设从STRING开始存放一个以$为结束标志的字符串,试编写把字符串中的字符进行分类
的源程序,数字字符送入NUM开始的内存中,大写字母送入BCHAR开始的内存区中,小写字母存入LCHAR开始的内存中,其他字符存入OTHER开始的内存区中。
DATA SEGMENT
STRING DB 'abc123ABC','$'
N EQU $-STRING
NUM DB N DUP(?)
BCHAR DB N DUP(?)
LCHAR DB N DUP(?)
OTHER DB N DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA
MOV DS,AX
LEA BX,STRING
DEC BX
LEA SP,BCHAR
LEA CX,LCHAR
LEA DX,OTHER
LEA SI,NUM
AA1:INC BX
4.MOV AL,[BX] 如,当DX=2A49H时,程序执行完后,MEM中的
4个字节内容为39H、34H、41H、和32H。
答:
DATA SEGMENT
SOURCE DW 2A49H
MEM DB 4 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
;
START:
MOV AX,DATA
MOV DS,AX
;
MOV DX,SOURCE
LEA BX,MEM
;
;set the loop
MOV CX,4
;the loop body
LB: MOV AX,DX
AND AX,000FH
CMP AL,10
JC AD ;
ADD AL,7
;
AD: ADD AL,30H
MOV [BX],AL
INC BX ;
SHR DX,1
SHR DX,1
SHR DX,1
SHR DX,1
LOOP LB
;the loop end, return to dos
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.下面程序段是实现从键盘输入10个1位10进制数后累加。
最后累加和以非压缩BCD码
形式存放在AH(高位)和AL(低位)中。
答:
XOR DX,DX
MOV CX 10
LOP1: MOV AH,01H;键盘字符输入
INT 21H
MOV AH,DH
ADD AL,DL
AAA
MOV DX,AX
LOOP LOP1。