Skip Navigation Links.
Collapse 电工与电子技术 代码阅读实践
Collapse 电工与电子技术 计算机文化基础
Collapse 电工与电子技术 Visual Foxpro数据库应用技术
Expand 实验室简介 实验课程简介
Expand 实验室简介 实验室简介
Expand 实验室简介 实验大纲
Expand 实验室简介 实验内容
Expand 实验室简介 实验课件
Expand 实验室简介 实验视频
Expand 实验室简介 常见问题及解答
Expand 实验室简介 在线测试
Expand 实验室简介 等级考试题集
Expand 实验室简介 相关知识点
Expand 实验室简介 学习推荐
Collapse 电工与电子技术 数字图像处理
Collapse 电工与电子技术 数据结构和VC编程
Collapse 电工与电子技术 数据库
Collapse 电工与电子技术 多媒体技术应用
Collapse 电工与电子技术 汇编语言程序设计
Collapse 电工与电子技术 VB程序设计
Expand 实验室简介 课程简介
Expand 实验室简介 实验室简介
Expand 实验室简介 理论教学
Expand 实验室简介 实验教学
Expand 实验室简介 创新型实验
Expand 实验室简介 教学视频
Expand 实验室简介 课程习题
Expand 实验室简介 在线测试
Expand 实验室简介 VB等级考试
Expand 实验室简介 软件下载
Expand 实验室简介 2012年秋“VB程序设计”考试题目
Collapse 电工与电子技术 计算机维护维修
首页 >   主页 > 课程 > 计算机类 > 汇编语言程序设计 > 实验内容 > 创新实验(16-18)
创新实验(16-18) 
 

实验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) 实验报告要有程序执行结果的功能截图。