实验16 十字路口交通灯变换程序设计
【实验名称】十字路口交通灯变换程序设计
【实验目的】
综合使用汇编语言进行编程练习,学会调用系统中断服务完成程序功能,理解屏幕显示方式设置方法,以及
CMOS
数据的读写技术,掌握外设接口和端口号读写的
I/O
指令。
【实验内容】
编写十字路口交通灯变换程序。参考程序如下:
data segment
info1 db 0dh,0ah,'please choose the letter y,s,z:'
db 0dh,0ah,'input q to quit','$'
info2 db 0dh,0ah,'choose error!','$'
d3 dw 0
total db 12
dotyx db 50,160
db 60,135
db 60,185
db 75,115
db 75,205
db 95,110
db 95,210
db 110,114
db 110,210
db 130,135
db 130,195
db 145,165
data ends
stack segment stack
db 200 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ah,0
mov al,4
int 10h
input: lea dx,info1
mov ah,9
int 21h
mov ah,08
int 21h
cmp al,'s'
jz sa
cmp al,'z'
jz zhen
cmp al,'y'
jz yua
cmp al,'q'
jz exit
mov dx,offset info2
mov ah,09
int 21h
sa: call san
jmp input
zhen: call zheng
jmp input
yua: call yuan
jmp input
exit: mov ah,4ch
int 21h
ret
main endp
san proc near
push ax
push bx
push cx
push dx
mov ah,0
mov al,12h
int 10h
mov al,1
a0: mov dx,1
mov d3,1
mov cx,320
a1: push cx
push d3
a2: mov ah,12
push ax
int 10h
pop ax
inc cx
sub d3,1
jnz a2
pop d3
add d3,2
pop cx
inc dx
dec cx
jne a1
inc al
cmp al,5
jne a0
pop dx
pop cx
pop bx
pop ax
ret
san endp
zheng proc near
push ax
push bx
push cx
push dx
mov ah,0fh
int 10h
mov ah,0
mov al,3
int 10h
mov cx,1 ;
字符数量
mov ah,2
mov dh,5 ;5
行开始
mov dl,25 ;25
列开始
int 10h
line: mov ah,2
int 10h
mov al,2
mov ah,9
mov bl,0e0h ;
字符黄色
int 10h
inc dh ;
行增加
cmp dh,20 ;20
行
jne line
jmp line1
line1: mov ah,2
int 10h
mov al,2
mov ah,9
mov bl,0e0h ;
字符为黄色
int 10h
inc dl ;
列增加
cmp dl,55 ;55
列
jne line1
jmp line2
line2: mov ah,2
int 10h
mov al,2
mov ah,9
mov bl,0e0h ;
字符为黄色
int 10h
dec dh
cmp dh,5
jne line2
jmp line3
line3: mov ah,2
int 10h
mov al,2
mov ah,9
mov bl,0e0h ;
字符为黄色
int 10h
dec dl
cmp dl,25
jne line3
l00: mov ah,7
mov al,14
mov bh,20h ;
绿色
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l01: mov ah,0
int 1ah
cmp dl,10
jnz l01
l1: mov ah,6
mov al,14
mov bh,0f0h ;
白色
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l2: mov ah,0
int 1ah
cmp dl,15
jnz l2
l3: mov ah,7
mov al,14
mov bh,40h ;
红色
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l4: mov ah,0
int 1ah
cmp dl,30
jnz l4
l5: mov ah,6
mov al,14
mov bh,0d0h ;
品红
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l004: mov ah,0
int 1ah
cmp dl,10
jnz l004
l005: mov ah,7
mov al,14
mov bh,30h ;
青
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
l006: mov ah,0
int 1ah
cmp dl,10
jnz l006
l02: mov ah,7
mov al,14
mov bh,20h ;
绿色
mov ch,6
mov cl,26
mov dh,19
mov dl,54
int 10h
mov ah,2
mov dh,23
mov dl,0
int 10h
pop dx
pop cx
pop bx
pop ax
ret
zheng endp
yuan proc near
push ax
push bx
push cx
push dx
mov ax,0004h
int 10h
mov bx,00
push bx
mov ah,0bh
int 10h
mov bx,0003h
mov ah,0bh
int 10h
mov bl,total
mov si,offset dotyx
mov ch,0
mov dh,ch
plo: mov dl,[si]
mov cl,[si+1]
mov al,02h
mov ah,0ch
int 10h
inc si
inc si
dec bl
jnz plo
mov bx,50
pop bx
pop dx
pop cx
pop bx
pop ax
ret
yuan endp
code ends
end main
【实验要求】
1)
参考城市交通中的红绿灯显示程序。
2)
在显示器屏幕中开辟窗口区,进行红、黄、绿区域设置。
3)
每隔
30
秒进行信号变换,而且间隔时间可调。
4)
分别在
DOS
和
WIN32
环境下编程。
【实验步骤提示】
1)
划分功能模块,确定中断程序调用服务类型。
2)
画出详细的程序流程图,根据流程图,设计子函数。
3)
不同
OS
环境下进行程序的编译、连接、运行。
【实验报告要求】
1)
写出程序框架设计的详细设计文档。
2)
写出程序流程图。
3)
根据参考例程,写出符合实验要求的程序代码。
4)
实验报告要有程序执行结果的功能截图。
实验17 位图图像文件的显示、放大、移动程序设计实验
【实验名称】
位图图像文件的显示、放大、移动程序设计实验
【实验目的】
学习Win32环境下的高级汇编语言编程,理解用汇编指令调用Windows系统中的库函数方法,掌握文件打开、关闭操作的中断服务程序调用,熟练使用汇编语言进行编程。
【实验内容】
编写位图图像文件的显示、放大、移动程序,参考程序清单:
.386
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include showbmp.inc ; local includes for this file
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
invoke LoadIcon,hInst,500 ; icon ID
mov hIcon, eax
szText szClassName,"Project_Class"
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW \
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
m2m wc.hIcon, hIcon
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor, eax
m2m wc.hIconSm, hIcon
invoke RegisterClassEx, ADDR wc
mov Wwd, 250
mov Wht, 150
invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov Wty, eax
invoke CreateWindowEx,WS_EX_LEFT,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPED or WS_SYSMENU,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax
invoke LoadMenu,hInst,600 ; menu ID
invoke SetMenu,hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL var :DWORD
LOCAL caW :DWORD
LOCAL caH :DWORD
LOCAL hStatImage :DWORD
LOCAL hStatIcon :DWORD
LOCAL hIcon1 :DWORD
LOCAL hBmp :DWORD
LOCAL Rct :RECT
LOCAL hDC :DWORD
LOCAL Ps :PAINTSTRUCT
LOCAL buffer1[128]:BYTE ; these are two spare buffers
LOCAL buffer2[128]:BYTE ; for text manipulation etc..
.if uMsg == WM_COMMAND
.elseif uMsg == WM_CREATE
invoke StaticImage,NULL,hWin,20,20,10,10,65535
mov hStatImage, eax
invoke LoadBitmap,hInstance,750
mov hBmp, eax ; put the return value into a DWORD variable
invoke SendMessage,hStatImage,STM_SETIMAGE,IMAGE_BITMAP,hBmp
invoke StaticIcon,NULL,hWin,200,20,10,10,65534
mov hStatIcon, eax
invoke LoadIcon,hInstance,500
mov hIcon1, eax
invoke SendMessage,hStatIcon,STM_SETIMAGE,IMAGE_ICON,hIcon1
.elseif uMsg == WM_SIZE
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWin,ADDR Ps
mov hDC, eax
invoke Paint_Proc,hWin,hDC
invoke EndPaint,hWin,ADDR Ps
return 0
.elseif uMsg == WM_CLOSE
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 1 ; divide screen dimension by 2
shr wDim, 1 ; divide window dimension by 2
mov eax, wDim ; copy window dimension into eax
sub sDim, eax ; sub half win dimension from half screen dimension
return sDim
TopXY endp
Paint_Proc proc hWin:DWORD, hDC:DWORD
LOCAL btn_hi :DWORD
LOCAL btn_lo :DWORD
LOCAL Rct :RECT
invoke GetSysColor,COLOR_BTNHIGHLIGHT
mov btn_hi, eax
invoke GetSysColor,COLOR_BTNSHADOW
mov btn_lo, eax
return 0
Paint_Proc endp
end start
【实验要求】
1)
参考图像处理软件中的图片放大、缩小、移动功能。
2)
在窗口中开辟视图区,然后显示位图文件图标。
3)
根据鼠标消息实现放大、缩小、移动功能。
【实验步骤提示】
1)
划分子程序模块,确定
Win32
中汇编语言编程框架。
2)
画出详细的程序流程图,根据流程图,设计子函数。
3)
在
Win32
环境下进行程序的编译、连接、运行。
【实验报告要求】
1)
写出程序设计文档及程序流程图。
2)
根据参考例程,写出符合实验要求的程序代码。
3)
实验报告要有程序执行结果的功能截图。
实验18 键盘加密、解密程序设计实验
【实验名称】
键盘加密、解密程序设计实验
【实验目的】
学习键盘硬件接口程序设计方法,理解键盘内部微处理器INTEL 8048的处理功能,以及8255芯片接口的PA、PB端口的信息读取方法,掌握DOS和BIOS中键盘服务功能子程序的调用过程,进而实现对键盘扫描码和字符码的操作。
【实验内容】
编写键盘加密、解密程序,参考程序清单:
display equ 2h
doscall equ 21h
data segment
mess db 0dh,0ah, 'Scan ASCII CHAR $'
mess1 db ' $'
data ends
stack segment para stack 'stack'
db 64 dup(?)
stack ends
pro_nam segment ;define the program
main proc far
assume cs:pro_nam,ds:data
start:
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov dx,offset mess
mov ah,09h
int doscall
mov al,0dh
mov ah,display
int 21h
again:
mov ah,0
int 16h
cmp al,03h
jz exit
mov bx,ax
call binihex
mov dx,offset mess1
mov ah,09h
int doscall
mov dl,bl
mov ah,display
int doscall
mov dl,0dh
mov ah,display
int doscall
mov dl,0ah
mov ah,display
int doscall
jmp again
exit:
ret
main endp
binihex proc near
mov ch,4
rot1:
push ax
mov dx,offset mess1
mov ah,09h
int doscall
pop ax
rotate:
mov cl,4
rol bx,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit
add al,7h
printit:
mov dl,al
mov ah,display
int doscall
dec ch
cmp ch,2
jg rotate
jz rot1
cmp ch,0
jnz rotate
ret
binihex endp
pro_nam ends
end start
【实验要求】
1)
设计简单的加密、解密算法,实现对键盘输入码的重新定位。
2)
实现键盘输入的锁闭功能。
3)
编写常驻内存程序,跟踪登记客户键盘输入信息。
【实验步骤提示】
4)
划分程序模块功能,设计简单字符的加解密算法。
5)
画出详细的程序流程图,根据流程图,设计子函数。
6)
在
DOS
环境下进行程序的编译、连接、运行。
【实验报告要求】
4)
写出程序设计文档及详细的程序流程图。
5)
根据参考例程,写出符合实验要求的程序代码。
6)
实验报告要有程序执行结果的功能截图。