;将数据段内的字母改成大写
.MODEL SMALL
.STACK 100H
.DATA
DB 'ibm '
DB 'win '
DB 'len '
DB 'hua '
.CODE
MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX
MOV SI,0000H
MOV CX,0003H
MOV BX,0000H
MOV DX,0004H
J:
MOV AL,[BX+SI]
AND AL,11011111B
MOV [BX+SI],AL
INC SI
LOOP J
ADD BX,0008H
MOV CX,0003H
MOV SI,0000H
DEC DX
JNZ J
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
DOSSEG
.MODEL SMALL ; 设定8086汇编程序使用Small model
.8086 ; 设定采用8086汇编指令集
; 8255芯片端口地址 (Port number)分配:
PortA EQU 90H ; Port A's port number in I/O space
PortB EQU 92H ; Port B's port number in I/O space
PortC EQU 94H ; Port C's port number in I/O space
CtrlPT EQU 96H ; 8255 Control Register's port number in I/O space
Patch_Protues EQU IN AL, 0 ; Simulation Patch for Proteus, please ignore this line
.data ; 定义数据段;
DelayShort dw 200
SEGTAB DB 3FH ; 7-Segment Tube, 共阴极类型的7段数码管示意图
DB 06H ;
DB 5BH ; a a a
DB 4FH ; f b
DB 66H ; f b
DB 6DH ; f b
DB 7DH ; g g g
DB 07H ; e c
DB 7FH ; e c
DB 6FH ; e c
DB 77H ; d d d h h h
DB 7CH ; ----------------------------------
DB 39H ; b7 b6 b5 b4 b3 b2 b1 b0
DB 5EH ; DP g f e d c b a
DB 79H ;
DB 71H ;
.code ; Code segment definition
.startup ; 定义汇编程序执行入口点
;------------------------------------------------------------------------
Patch_Protues ; Simulation Patch for Proteus,
; Please ignore the above code line.
;------------------------------------------------------------------------
MOV AH,10001001B ;设置控制状态为C输入,AB输出(控制字不改变)
SUB AL,AL
OUT CtrlPT,AX
L: ;开关处于ON为0,处于OFF为1
IN AX,PortC ;读入开关状态
NOT AX ;转换为合适的状态
MOV AL,AH ;将需要的数据从AH移动到AL
;沿用上一题代码的形式
MOV BL,AL
AND BL,11110000B ;获取高四位数据
SUB BH,BH
MOV CL,4 ;8086指令中只支持ROR BL,1或者ROR BL,CL格式
ROR BX,CL
MOV SI,OFFSET SEGTAB
SUB BH,BH
ADD SI,BX
MOV AH,[SI]
MOV DH,AH ;DH中存储着输入数据高四位对应的显示
SUB BL,BL ;BL清零
MOV BL,AL
AND BL,00001111B
MOV DI,OFFSET SEGTAB
SUB BH,BH
ADD DI,BX
MOV DL,[DI] ;DL 中存储着输入数据低4位对应的显示
AND AL,11110000B
MOV BH,AL ;BH中存储着输入8位数据的高四位状态
;第四位和第二位显示
MOV AH,BH
ADD AH,00001010B
OUT PortA,AX
MOV AH,DH
OUT PortB,AX
CALL DELAY
;第三位和第一位显示
MOV AH,BH
ADD AH,00000101B
OUT PortA,AX
MOV AH,DL
OUT PortB,AX
CALL DELAY
JMP L
RET
DELAY PROC
PUSH CX
MOV CX,DelayShort
D1: LOOP D1
POP CX
RET
DELAY ENDP
.stack 100h ; 定义256字节容量的堆栈
END ;指示汇编程序
结束编译
;将welcome to masm!复制到相邻的内存空间中
assume: ds:data,cs:code
data segment
db 'welcome to masm!'
db ' '
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,16
j:
mov al,[si]
mov [di],al
inc si
inc di
loop j
mov ah,4ch
int 21h
code ends
end start