汇编:显示存储器与直接写屏等

显示存储器与直接写屏:

;*******************************************************************************************************************************************

;用直接写屏方式变化色彩显示26个字母   

   ;A904
.MODEL        SMALL
.CODE
START:
MOV       AH,0
MOV       AL,3        ;设置80*25 文本16 色
INT       10H
MOV       BX,0B800H   ;显存中起始段地址
MOV       DS,BX
MOV       SI,0
MOV       DL,41H      ;字符的ASCII码
MOV       BL,80H      ;设置彩色文本显示字符属性
MOV       CX,26       ;字符个数
L1:  MOV       [SI],DL
MOV       [SI+1],BL   ;送显示字符的属性
ADD       SI,2
INC       DL
INC       BL
LOOP      L1
MOV       AH,4CH
INT       21H
END       START
;*******************************************************************************************************************************************

;从键盘缓冲区读出键值并显示字符和扫描码

 ;*******************************************************************************************************************************************

        CODE SEGMENT

            ASSUME CS:CODE
KB_BUFFER_HEAD  =         DS:[1AH]
KB_BUFFER_TAIL  =         DS:[1CH]
BUFFER  =         1EH
END_BUFFER  =         3EH
BUFFER_SEG  =         40H

      START:
MOV       AX,BUFFER_SEG
MOV       DS,AX

     WAITKB:  MOV       BX,KB_BUFFER_HEAD
CMP       BX,KB_BUFFER_TAIL
JE        WAITKB
MOV       BX,KB_BUFFER_HEAD
MOV       DX,[BX]
CMP       DL,13
JE        EXIT
MOV       AH,2
INT       21H
MOV       DL,DH
MOV       AH,2
INT       21H
ADD       BX,2
CMP       BX,END_BUFFER
JB        KEEP
MOV       BX,BUFFER
KEEP:  MOV       KB_BUFFER_HEAD,BX
STI
LOOP      WAITKB
EXIT:
MOV       AH,4CH
INT       21H


        CODE  ENDS
END       START
;*******************************************************************************************************************************************

子程序设计:用堆栈传递参数或参数地址

本题有利于理解堆栈,其中有类似于指针的指针

;*******************************************************************************************************************************************
 
DATA  SEGMENT
                  DW        50 DUP (?)
TOS  LABEL     WORD
ARY  DW        100 DUP (4)
NUM  DW        100
SUM  DW        ?
ATYPE  DW        2
DATA  ENDS

 

        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA,SS:DATA
  MAIN  PROC      FAR
MOV       AX,DATA
MOV       SS,AX
LEA       SP,TOS  ; ss:sp  >> data:tos

          ;ds和0 压入堆栈,以便返回dos
PUSH      DS
XOR       AX,AX
PUSH      AX
MOV       AX,DATA
MOV       DS,AX       ;ds=ss

         ;参数地址压入堆栈
LEA       BX,ARY
PUSH      BX
LEA       BX,NUM
PUSH      BX
LEA       BX,SUM
PUSH      BX
CALL      PROSUM2
RET
 MAIN  ENDP

;————————————————————————————————————————————————————–
  PROSUM2  PROC      NEAR
MOV       BP,SP
MOV       SI,[BP+6]
MOV       DI,[BP+4]
MOV       CX,[DI]
MOV       DI,[BP+2]
XOR       AX,AX
CMP       ATYPE,1
JZ        SUMBYTE

  NEXT:  ADD       AX,[SI]
ADD       SI,2
LOOP      NEXT
MOV       [DI],AX
JMP       EXIT

 SUMBYTE:  ADD       AL,[SI]
ADD       SI,1
LOOP      SUMBYTE
MOV [DI],AL

        EXIT:  RET       6
PROSUM2  ENDP
      
  CODE  ENDS
              END       MAIN

;*******************************************************************************************************************************************

 

;冒泡排序法

;*******************************************************************************************************************************************

DATA  SEGMENT
A  DW        9,4,26,85,38
DATA  ENDS
CODE  SEGMENT
ASSUME    CS:CODE,DS:DATA
START:
MOV       AX,DATA
MOV       DS,AX
MOV       DI,4

        LP1:  MOV       CX,DI
MOV       BX,0
LP2:  MOV       AX,A[BX]
CMP       AX,A[BX+2]
JGE       CONT
XCHG      AX,A[BX+2]
MOV       A[BX],AX
CONT:  ADD       BX,2
LOOP      LP2
DEC       DI
JNZ       LP1
MOV       AH,4CH
INT       21H
CODE  ENDS
END       START
;*******************************************************************************************************************************************

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: