8086汇编自娱自乐
来源:互联网 发布:决对争锋网络剧资源 编辑:程序博客网 时间:2024/06/16 22:41
微机原理与接口技术学习留下的一些小模块汇编,模块均有测试成功
;macro template;brief : output a new line on diplay device;note : null;date : 2013/11/26;author: @brtNEW_LINE MACRO MOV DL, 0AHMOV AH, 02HINT 21HENDM;macro template;brief : output a ENTER key on diplay device;note : null;date : 2013/11/26;author: @brtENTER_KEY MACRO MOV DL, 0AHMOV AH, 02HINT 21HENDM;sub-procedure template;brief : dispay the value of AX,AX = ((DX):(AX)) / 10; DX = ((DX):(AX)) % 10;note : only display 16 bit width number,you can modify defined OBUF variable bit width according to your need ;date : 2013/11/26;author: @brtDATA SEGMENTOBUF DB 06H DUP (?) ; DATA ENDSDISP_NUM PROC NEARMOV BX, OFFSET OBUF+6-1MOV BYTE PTR [BX],'$'MOV CX, 0AH;LOOP_NUM:;just like do{....}while(ax != 0)MOVDX, 00H DIV CXADD DL, 30H;number value convert to ASCIIDEC BXMOV [BX], DLOR AX, AXJNZ LOOP_NUM;check AX is 0MOV DX, BX ;BX : start index of numberMOV AH, 09HINT 21H RETDISP_NUM ENDP;brief : get a number what user input;note : only input 6 bit width number,you can modify defined IBUF variable bit width according to your need ;date : 2013/11/26;author: @brtDATA SEGMENTIBUFDB 06H, ;MAX NUMER OF CHARACTERS 00H, ;VALID NUMBER OF CHARACTERS 06H DUP(?) ;INPUT BUFFERDATA ENDSGET_NUM PROC NEARPUSH DXPUSH BXPUSH CXPUSH SIMOV DX, OFFSET INF1;MOV AH, 09HINT 21HMOV DX, OFFSET IBUF;键入一个十进制数(<361)MOV AH, 0AH INT 21HMOV CL, IBUF+1;十进制数的位数送CXMOV CH, 0MOV SI, OFFSET IBUF+2;指向输入的第一个字符(最高位)MOV AX, 0;开始将十进制数转换为二进制数AGAIN: MOVBX, 10; ((010+a4) 10+…) 10+a0MUL BX AND BYTE PTR [SI], 0FH ADD AL, [SI] ADC AH, 0 INC SI LOOP AGAIN POP SI POP CX POP BX POP DXRETGET_NUM ENDP;brief : quick sort ,data type is double BYTE;note : null;parameter : SI is start index of data array and DI is end index of data array;date : 2013/12/03;author : @brtCALL_QUICK_SORT PROC NEAR;protect register that will usePUSH SIPUSH DIPUSH BPPUSH BXPUSH AXPUSH CXPUSH DX MOV SI, AXMOV DI, CXSUB DI, 02HCALL QUICKSORT;recovery used register POP DXPOP CXPOP AXPOP BXPOP BPPOP DIPOP SIRETCALL_QUICK_SORT ENDPQUICKSORT PROC NEAR CMP SI,DIJNL END_QUICKSORT ; CONTINUE WHEN LEFT BOUNDARY < RIGHT BOUNDRYPUSH DI ; develer right boundary parameterPUSH SI ; develer left boundary parameter CALL QUICKPASS POP DI ; POP divid BOUNDARYPOP SI ; POP left BOUNDARYPUSH DI ; PUSH divid BOUNDARYSUB DI, TYPE DATABASE ; COPY LEFT-HALF MAX INDEX TO DICMP SI, DIJL IF_TO JNL ELSE_TO IF_TO: CALL QUICKSORT ; recursively call QuickSort ELSE_TO: POP SI ; POP divid BOUNDARYPOP DI ; POP RIGHT BOUNDARYADD SI, TYPE DATABASE ; COPY RIGHT-HALF MAX INDEX TO SICMP SI, DIJNL END_QUICKSORTCALL QUICKSORT ; recursively call QuickSort END_QUICKSORT : RET ; 43 LineQUICKSORT ENDPQUICKPASS PROC NEAR POP BX POP SIPOP DIPUSH DIPUSH SIMOV DX,WORD PTR[SI] ; STORE FIRAT VALUE AS DIVID BOUNDARY LOOP_OUT : CMP SI,DI ;50JNB END_QUICKPASS ; CONTINUE WHEN LEFT BOUNDARY < RIGHT BOUNDRY LOOP_IN1 : CMP SI,DILAHF ;LOAD FLAGS TO AHAND AH,01HCMP AH,01HJNE IGNORE_LOOP_IN1;57 Line CMP DX,WORD PTR[DI]LAHF ;LOAD FLAGS TO AHAND AH,41HCMP AH,0H JZ IGNORE_LOOP_IN1SUB DI,TYPE DATABASEJMP LOOP_IN1 IGNORE_LOOP_IN1: CMP SI,DI JNL LOOP_IN2 ;WHEN SI IS EQUAL TO DI ,SWAP DATA BETWWEN RAM IS MORE SLOWLY AND INVALID MOV AX, WORD PTR[DI]MOV [SI],AX LOOP_IN2: CMP SI,DILAHF ;LOAD FLAGS TO AHAND AH,01HCMP AH,01HJNE IGNORE_LOOP_IN2 CMP WORD PTR[SI],DXLAHF ;LOAD FLAGS TO AHAND AH,41H CMP AH,0H JZ IGNORE_LOOP_IN2ADD SI,TYPE DATABASEJMP LOOP_IN2 IGNORE_LOOP_IN2: CMP SI,DI ;WHEN SI IS EQUAL TO DI ,SWAP DATA BETWWEN RAM IS MORE SLOWLY AND INVALID JNL IGNORE_SWAP MOV AX,WORD PTR[SI] MOV [DI],AX IGNORE_SWAP:JMP LOOP_OUT END_QUICKPASS: MOV [SI],DX ;FIRST VALUE STORED INTO DIVID ADRRESS PUSH SI PUSH BX RETQUICKPASS ENDPDISP PROC NEARMOV BX, OFFSET DATABASE ; INITIAL LOOP CONTROL VARIABLELOOP_OUTER:CMP BX, NUMJNB END_OUTER_LOOPMOV BP, SPMOV AX, [BX]LOOP_IN:CMP AX, 00HJE LOOP_DISPMOV DX, 0000HMOV CX, 0AH DIV CXADD DL, 30HPUSH DXJMP LOOP_IN LOOP_DISP:CMP SP,BPJNB END_LOOP_DISPPOP DXMOV AH, 02HINT 21HJMP LOOP_DISPEND_LOOP_DISP:MOV DL, 20H ;SPACE ASCII VALUE :20HMOV AH, 02HINT 21HADD BX, TYPE DATABASEJMP LOOP_OUTEREND_OUTER_LOOP:RETDISP ENDP;brief : quick sort ,data type is BYTE;note : null;parameter : SI is start index of data array and DI is end index of data array;date : 2013/12/03;author : @brtQUICK PROC NEAR;protect register that will usePUSH SIPUSH DIPUSH BPPUSH BXPUSH AXPUSH CXPUSH DXCALL QUICKSORT;recovery used register POP DXPOP CXPOP AXPOP BXPOP BPPOP DIPOP SIRETQUICK ENDPQUICKSORT PROC NEAR CMP SI,DIJNL END_QUICKSORT ; CONTINUE WHEN LEFT BOUNDARY < RIGHT BOUNDRYPUSH DI ; develer right boundary parameterPUSH SI ; develer left boundary parameter CALL QUICKPASS POP DI ; POP divid BOUNDARYPOP SI ; POP left BOUNDARYPUSH DI ; PUSH divid BOUNDARYSUB DI, TYPE NUM ; COPY LEFT-HALF MAX INDEX TO DICMP SI, DIJL IF_TO JNL ELSE_TO IF_TO: CALL QUICKSORT ; recursively call QuickSort ELSE_TO: POP SI ; POP divid BOUNDARYPOP DI ; POP RIGHT BOUNDARYADD SI, TYPE NUM ; COPY RIGHT-HALF MAX INDEX TO SICMP SI, DIJNL END_QUICKSORTCALL QUICKSORT ; recursively call QuickSort END_QUICKSORT : RET ; 43 LineQUICKSORT ENDPQUICKPASS PROC NEAR POP BX POP SIPOP DIPUSH DIPUSH SIMOV DL, BYTE PTR[SI] ; STORE FIRAT VALUE AS DIVID BOUNDARY LOOP_OUT : CMP SI,DI ;50JNB END_QUICKPASS ; CONTINUE WHEN LEFT BOUNDARY < RIGHT BOUNDRY LOOP_IN1 : CMP SI,DILAHF ;LOAD FLAGS TO AHAND AH,01HCMP AH,01HJNE IGNORE_LOOP_IN1;57 Line CMP DL,BYTE PTR [DI]LAHF ;LOAD FLAGS TO AHAND AH,41HCMP AH,0H JZ IGNORE_LOOP_IN1SUB DI,TYPE NUMJMP LOOP_IN1 IGNORE_LOOP_IN1: CMP SI,DI JNL LOOP_IN2 ;WHEN SI IS EQUAL TO DI ,SWAP DATA BETWWEN RAM IS MORE SLOWLY AND INVALID MOV AL,BYTE PTR [DI]MOV BYTE PTR [SI],AL LOOP_IN2: CMP SI,DILAHF ;LOAD FLAGS TO AHAND AH,01HCMP AH,01HJNE IGNORE_LOOP_IN2 CMP BYTE PTR [SI],DLLAHF ;LOAD FLAGS TO AHAND AH,41H CMP AH,0H JZ IGNORE_LOOP_IN2ADD SI,TYPE NUMJMP LOOP_IN2 IGNORE_LOOP_IN2: CMP SI,DI ;WHEN SI IS EQUAL TO DI ,SWAP DATA BETWWEN RAM IS MORE SLOWLY AND INVALID JNL IGNORE_SWAP MOV AL,BYTE PTR [SI] MOV BYTE PTR [DI],AL IGNORE_SWAP:JMP LOOP_OUT END_QUICKPASS: MOV BYTE PTR [SI],DL ;FIRST VALUE STORED INTO DIVID ADRRESS PUSH SI PUSH BX RETQUICKPASS ENDP;macro template;brief : load specified interrupt address;note : in this version MACRO , interrupt num must pass by register;date : 2013/12/03;author: @brtINTERRUPT_ADDR MACRO InterruptNum,InterruptProcName PUSH DS PUSH AX PUSH BX PUSH CX MOV AX, 00H MOV DS, AXMOV AX, 04H MUL InterruptNum MOV BX, AX MOV WORD PTR DS:[BX] , OFFSET InterruptProcName MOV WORD PTR DS:[BX+02H], SEG InterruptProcName POP CX POP BX POP AX POP DS ENDM;brief : Translate compresse BCD stored in AL to value stored in AX;note : null;date : 2013/12/03;author: @brtcBCDtoValue PROC NEARPUSH CXMOV CH, AL AND CH, 0FH MOV CL, 04H SHR AL, CL MOV CL, 0AH MUL CL ADD AX, CH POP CX RETcBCDtoValue ENDP
0 0
- 8086汇编自娱自乐
- 自娱自乐
- 自娱自乐
- 自娱自乐~~
- 自娱自乐
- 自娱自乐
- 自娱自乐
- js自娱自乐
- 庆祝BLOG开通,自娱自乐!
- 架起一个网络游戏自娱自乐
- 随便写写,自娱自乐!
- Self-entertainment (自娱自乐)
- 自娱自乐--星座大全
- HDU 1269 STL 自娱自乐
- 自娱自乐观察者模式
- 学习操作系统的自娱自乐
- 用C++ 自娱自乐
- 自娱自乐--爬虫java实践
- 指针的大小到底是由谁决定?是多少?
- linux date 操作
- OCP 1Z0 051 164
- 设计模式(16)-行为型模式-ITERATOR模式
- Linux hostname主机名配置文件/etc/hosts详解 详细出处参考:http://www.jb51.net/LINUXjishu/77329.html
- 8086汇编自娱自乐
- SSL双方系统时间不一致导致的SSL连接失败及其解决方案
- makefile
- 关于.h与h的区别
- jquery改变form属性,提交表单
- 大三上学期,图形编程基础
- python类方法和静态方法
- 设计模式(17)-行为型模式-Moderator模式
- python django 与数据库的交互