几道简单的汇编程序
;搜索数组,看是否存在CONSTDATA SEGMENTARRAYB DB 2,3,1,8,7FH,-5COUNT EQU $-ARRAYB ;数组长度CONST EQU 7FH ;判断数组中是否存在此元素ADDRES DD 0 ;若存在,存放元素的地址SCANTIME DW 0 ;若存在,存放搜索次数DATA ENDSSTACK SEGMENTDW 100H DUP(?)STACK ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODEMAIN:MOV AX,DATAMOV DS,AXMOV ES,AX ;目的串的段基址总是存放在ESLEA DI,ARRAYB;目的串的偏移首地址存在DI/EDIMOV CX,COUNT;设置循环次数MOV AL,CONST;数组元素与AL的内容比较CLD ;设置DF标志位OR CX,CX ;设置ZF=0REPNE SCASB ;若果不相等,则继续搜索JZ SCANED ;ZF==1表示找到相等的元素JMP @F ;没找到相等的元素SCANED:DEC DI MOV WORD PTR ADDRES,DI MOV WORD PTR ADDRES+2,ES;把元素地址存入ADDRES MOV BX,OFFSET ARRAYB INC DI SUB DI,BX MOV SCANTIME,DI;计算搜索次数 MOV DX,SCANTIME ADD DX,30H MOV AH,2 INT 21H @@: MOV AH,4CH INT 21HCODE ENDS END MAIN
?
?
?
?
;将ES段中名为BLOCK的字存储区清零.DATA SEGMENTBLOCK DW 5 DUP(1)DATA ENDSSTACK SEGMENTDB 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMAIN: MOV AX,DATA MOV DS,AXMOV AX,SEG BLOCKMOV ES,AXMOV DI,0MOV CX,LENGTH BLOCKGOON: MOV BLOCK[DI],0 ADD DI,TYPE BLOCK LOOP GOON MOV AX,4C00H INT 21HCODE ENDS END MAIN
?
?
?
;求Z=|X-Y|.其中X,Y均为无符号数DATA SEGMENT X DW 5Y DW 9DATA ENDSSTACK SEGMENTDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODEMAIN: MOV AX,DATA MOV DS,AX MOV AX,X SUB AX,Y JC NEXT JMP DONENEXT:NEG AXDONE:MOV DX,AX ADD DX,30H MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDSEND MAIN
?
?
?
;求X与Y之和并送ZDATA SEGMENT;X DW 0E98AH,80AFH,0FD32H,0F68FH;Y DW 9FD0H,70BAH,3D84H,89FEHX DW 3 ;为了显示结果,把变量值改为3和5Y DW 5Z DW 5 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK 'STACK'DB 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATAMAIN: MOV AX,DATA MOV DS,AX SUB DI,DI MOV CX,1 CLCGOON:MOV AX,X[DI] ADC AX,Y[DI] MOV Z[DI],AX ADD DI,2 LOOP GOON RCL AX,1 AND AX,1 MOV Z[DI],AX ;显示结果 MOV DL,BYTE PTR Z ADD DL,30H MOV AH,2 INT 21H MOV AH,4CH INT 21HCODE ENDS END MAIN
?
?
;输入字符串,然后显示输入的字符串DATA SEGMENTBUF DB 50 DB ? DB 50 DUP('$');总长度为52CR EQU 0DHLF EQU 0AHMESG1 DB 'PLEASE INPUT A STRING:',CR,LF,'$'DATA ENDSSTACK SEGMENTDW 100H DUP(?)STACK ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODEMAIN: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESG1 MOV AH,9 INT 21H;提示输入 LEA DX,BUF MOV AH,10 INT 21H ;等待输入 MOV DL,LF MOV AH,2 INT 21H;输出换行 LEA DX,BUF+2 MOV AH,9 INT 21H;输出字符串 MOV AH,4CH INT 21HCODE ENDS END MAIN?
?
?
;删除输入字符串中的'A'字符,然后输出删除后的字符串。;若字符串中不存在'A',则输出'NOT FOUND'DATA SEGMENTBUF DB 50,?,50 DUP('$')MESSAGE DB 'NOT FOUND',0AH,'$'FLAG DB 0DATA ENDS STACK SEGMENTDW 100H DUP(?)STACK ENDSCODE SEGMENTASSUME SS:STACK,DS:DATA,CS:CODEMAIN: MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,10 INT 21H;读入字符串 MOV DL,0AH MOV AH,2 INT 21H;输出换行符 MOV AX,DATA MOV ES,AX;段地址存入ES LEA DI,BUF;偏移首地址 MOV AL,'A';与'A'比较 MOV CX,WORD PTR BUF[1];循环次数 CLD;设置DF标志位0GOON: OR CX,CX;设置ZF=0 CMP [BUF+DI],AL JNZ NEXT;如果不同,进入下一次循环 MOV [BUF+DI],'0' INC FLAG[0]NEXT:INC DI LOOP GOON OR CX,1 CMP FLAG[0],1 JNZ MES LEA DX,MESSAGE MOV AH,9 INT 21H;没找到时输出NOT FOUND JMP DONE MES:MOV CL,[BUF+1] MOV DI,OFFSET BUF+2SIGN:OR CX,CX CLD MOV DL,[BUF+DI] CMP DL,'0';是0的话不输出 JZ NO; MOV AH,2 INT 21HNO: INC DI LOOP SIGN;输出字符串 DONE:MOV AH,4CH INT 21H CODE ENDS END MAIN??
?
?
?
;对395872843948这些0--9的数字进行冒泡排序DATA SEGMENTARRAY DB '395872843948',0DH,0AH,'$'DATA ENDSSTACK SEGMENTDB 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACK,DS:DATAMAIN: MOV AX,DATA MOV ES,AX MOV DS,AX MOV CX,12;要比较的次数 MOV BX,12;每次要比较的个数INIT: MOV DI,0 ;偏移首地址 MOV BX,CX GOON: MOV AL,ARRAY[DI] CMP AL,ARRAY[DI+1] JG NEXT XCHG AL,ARRAY[DI+1] MOV ARRAY[DI],AL;交换NEXT:INC DI DEC BX JNZ GOON;不相等 LOOP INIT;完成一趟排序 MOV DX,OFFSET ARRAY MOV AH,9 INT 21H;输出排好序的序列 MOV AH,4CH INT 21HCODE ENDS END MAIN
?