;因为(5*Y)会出现32位变量,32位变量不能作为除数,所以需要改变运算顺序
MOV AX,W ;AX←W
SUB AX,X ;AX←W-X
MOV BX,2
IMUL BX ;AX←2*(W-X)
IDIV Y ;AX←2*(W-X)/Y
CWD;除数变为(DX,AX)
MOV CX,5
IDIV CX ;AX←2*(W-X)/Y/5
MOV Z,AX;Z←AX
org 100h
.MODEL TINY
.STACK 100
.DATA
digital db 0 ;emu8086不支持"db ?"的写法
english db 0
other db 0
.CODE
start: mov ax,@data
mov ds,ax
mov es,ax
mov ah,7;7号功能:等待键盘输入
int 21h;键盘功能调用
cmp al,30H;0的16进制ascii值为30h
jl labeloth;ascii<30h,则为其他字符
cmp al,39H;9的16进制ascii值为39h
jg label2;ascii>39h,判断是否为字母
mov digital,al
jmp exit;多分支类型,跳转
label2:
cmp al,41H;'A'的16进制ascii值为41h
jl labeloth;不是数字而且ascii值小于41h
cmp al,5AH;'Z'的16进制ascii值为5ah
jg label3;ascii值>5ah,判断是否可能为小写字母
mov english,al
jmp exit
label3:
cmp al,61H;'a'的ascii值为61H
jl labeloth;不是小写字母
cmp al,7AH;'z'的ascii值为7ah
jg labeloth;不是小写字母
mov english,al
jmp exit
labeloth:
mov other,al
exit:
jmp $
end start
ret
org 100h
.MODEL TINY
.STACK 100
.DATA
arr db 58,98,70,50,55,69,64,80,81,74,87,84,94,61,56,68,61,89,87,81,69,68,61,91,73,62,63,77,72,54,74,75,88,61,60,67,90,77,92,75,99,51,72,79,99,94,88,96,52,66,96,70,53,96,68,55,89,71,75,87,91,87,89,95,68,83,79,56,92,87,74,74,71,51,67,52,91,62,76,76,74,57,95,92,90,73,57,56,57,84,85,65,87,66,91,66,84,71,81,72,77,63,73,91,54,99,62,99,97,58,54,99,97,78,61,74,67,92,92,66,96,66,60,81,50,52,63,52,53,85,66,97,73,67,71,93,100,85,56,88,55,57,74,94,66,88,65,98,93,64,62,74,58,70,84,59,96,54,52,78,87,97,56,94,90,78,52,98,70,74,76,89,69,68,84,83,77,92,90,100,76,66,93,51,75,88,94,86,94,97,92,81,99,51,61,59,50,72,53,95,92,52,89,60,61,55,100,90,84,61,59,98,57,89,63,79,88,82,51,88,92,65,67,93,91,60,66,57,62,65,73,75,56,56,95,70,53,60,91,75,60,66,70,94,79,78,50,85,67,51;//随机生成250个数据
acnt dw 0;//90-100人数
bcnt dw 0;//80-89人数
ccnt dw 0;//70-79人数
dcnt dw 0;//60-69人数
.CODE
start: mov ax,@data
mov ds,ax
mov es,ax
lea bx,arr
mov cx,250
call calcacnt
mov acnt,ax;90-100人数
call calcbcnt
mov bcnt,ax;80-89人数
call calcccnt
mov ccnt,ax;70-79人数
call calcdcnt
mov dcnt,ax;60-69人数
int 21H
;子程序名:calcacnt
;功能:求90-100人数
;入口参数cx=数组元素个数
;ds:bx=数组段地址:偏移地址
;出口参数:ax=数组元素和
;影响寄存器:ax
calcacnt proc near
push cx
push bx;保护现场
xor ax,ax
lea bx,arr
mov cx,250
nexta:
cmp [bx],90
jl exita:
cmp [bx],100
jg exita:
inc ax
exita:
inc bx
loop nexta
pop bx
pop cx
ret
calcacnt endp
;子程序名:calcbcnt
;功能:求80-89人数
;入口参数cx=数组元素个数
;ds:bx=数组段地址:偏移地址
;出口参数:ax=数组元素和
;影响寄存器:ax
calcbcnt proc near
push cx
push bx;保护现场
xor ax,ax
lea bx,arr
mov cx,250
nextb:
cmp [bx],80
jl exitb:
cmp [bx],89
jg exitb:
inc ax
exitb:
inc bx
loop nextb
pop bx
pop cx
ret
calcbcnt endp
;子程序名:calcccnt
;功能:求70-79人数
;入口参数cx=数组元素个数
;ds:bx=数组段地址:偏移地址
;出口参数:ax=数组元素和
;影响寄存器:ax
calcccnt proc near
push cx
push bx;保护现场
xor ax,ax
lea bx,arr
mov cx,250
nextc:
cmp [bx],70
jl exitc:
cmp [bx],79
jg exitc:
inc ax
exitc:
inc bx
loop nextc
pop bx
pop cx
ret
calcccnt endp
;子程序名:calcdcnt
;功能:求60-69人数
;入口参数cx=数组元素个数
;ds:bx=数组段地址:偏移地址
;出口参数:ax=数组元素和
;影响寄存器:ax
calcdcnt proc near
push cx
push bx;保护现场
xor ax,ax
lea bx,arr
mov cx,250
nextd:
cmp [bx],60
jl exitd:
cmp [bx],69
jg exitd:
inc ax
exitd:
inc bx
loop nextd
pop bx
pop cx
ret
calcdcnt endp
code ends
end start
4.试编制程序:以查询方式输入100个字节数据存入内存 INBUF 区。
org 100h
.MODEL TINY
.STACK 100
.DATA
inbuf db 100 DUP(?);inbuf区存字节数据
.CODE
start:
mov ax,@data
mov ds,ax
mov es,ax
mov bx,offset inbuf;bx指向内存inbuf区
mov cx,100;循环次数100
status:
mov dx,102h
in al,dx
test al,80h
jz status
mov dx,100h
in al,dx
mov [bx],al;al数据存入inbuf
inc bx;bx指向下一数据
loop status
mov ax,4c00h
jmp $
end start
ret
.MODEL TINY
.STACK 100
.DATA
outbuf db 127,-128,0,1,-1
.CODE
start:
mov ax,@data
mov ds,ax
mov es,ax
mov bx,offset outbuf;bx指向outbuf区
status:
mov dx,102h
in al,dx
test al,80h
jnz status
mov dx,100h
mov al,[bx]
out dx,al;向输出端口写入数据
inc bx;bx指向数组下一个数据
cmp al,-1;条件循环
jnz status
mov ax,4c00h
jmp $
end start
ret

;8255A口工作方式0输入,B口工作方式0输出,C口输出
;A口60H,B口62H,C口64H,控制口66H
mov al,10010000B
mov dx,66H
out dx,al
mov al,04H
mov dx,62H
out dx,al
mov al,01H
mov dx,64H
out dx,al
(2)
;8254的0口在方式2,5*10^6/(1*10^3)=5000=1388H,地址40H
;8254的1口在方式3,5*10^6/(500*10^3)=10H,地址42H
mov al,00110100B
mov dx,46H
out dx,al
mov al,88H
mov dx,40H
out dx,al
mov al,13H
out dx,al
mov al,01010110B
mov dx,46H
out dx,al
mov al,0AH
mov dx,42H
out dx,al
ret
(3)
产生中断类型号82H,中断向量存放在中断向量表
| 0208H | 80H | IP |
|---|---|---|
| 0209H | 78H | IP |
| 020AH | 10H | CS |
| 020BH | 32H | CS |
(4)
mov ax,0
mov es,ax
mov bx,82H*4
mov ax,offset intproc
mov es:[bx],ax
mov ax,seg intproc
mov es:[bx+2],ax
in al,22H
and al,11111011B
mov dx,22H
out dx,al
(5)
intproc proc far
push ax
push ds
push dx
sti
mov ax,seg temp
mov ds,ax
mov dx,60H
in al,dx
mov temp,al
in al,22H
or al,00000100B
out 22H,al
cli
mov al,20H
out 20H,al
pop dx
pop ds
pop ax
iret