汇编语言源程序基础分析--跑马灯

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

以LED跑马灯汇编代码为例,介绍汇编代码基础知识


一、示例代码

代码如下(示例):

data   segment
portA  equ 400H        ; PA口地址
s      db "twenty four LEDs flicker circularly. Press any key to exit ...",0dh,0ah,"$"   ;程序功能提示
data   ends
code   segment
        assume cs:code,ds:data
go:    mov ax,data
       mov ds,ax
      mov dx,offset s    ;显示提示
      mov ah,9
      int 21h
       mov dx,porta+3
       mov al,80h
       Out dx,al         ; 三端口均初始化为方式0输出
L0:    mov si,24
       mov bx,7         ;16位初始值设为1(一个灯亮)
       mov cl,0          ;8位初始值设为0
L1:    mov ah,0bH
        Int 21h         ; 有无按键
        Cmp al,0ffH
        Jz  exit       
        mov dx,porta   ; 输出24位数
        mov al,bl
        Out dx,al  
        Inc  dx
        mov al,bh
        Out dx,al  
        Inc  dx
        mov al,cl
        Out dx,al  
        Call delay05    ; 延时
        SHL  bx,1       ;16位左移一位
        Rcl  cl,1         ;8位左移一位
        dec si       
        jnz  L1
        Jmp  L0         ; 重新开始
Exit:   mov ah,4ch
        Int 21h
delay05 proc near        ; 循环延时子程序
        push cx
        push bx
        mov cx,0020H
d1:     mov bx,1200h
d2:     dec bx
        jnz d2
        loop d1
        pop bx
        pop cx
        ret
delay05 endp
Code   ends
        End go




二、代码分析

1.显示提示

ds寄存器存入段地址,即data段内容存入
代码如下:

go:    mov ax,data
       mov ds,ax

offset语句调用偏移地址s处的内容
代码如下:

s      db "twenty four LEDs flicker crosswise. Press any key to exit ...",0dh,0ah,"$"    ;
      程序功能提示
...
go:
	mov dx,offset s ;显示提示

mov ah,9 int 21h;实现字符串输出显示

      mov ah,9
      int 21h
AH功能调用参数返回参数
09显示字符串DS:DX=串地址’$'结束字符串

2.端口输出

porta+端口与dx连接,dx输出al值(80h),即三端口初始化
代码如下(示例):

       mov dx,porta+3
       mov al,80h
       Out dx,al         ; 三端口均初始化为方式0输出

3.初始化灯值

初始化灯亮,三个灯亮
代码如下(示例):

L0:    mov si,24
       mov bx,7         ;16位初始值设为7(三个灯亮)
       mov cl,0          ;8位初始值设为0

4.检测

检测有无按键
代码如下(示例):

L1:    mov ah,0bH
        Int 21h         ; 有无按键
AH功能调用参数返回参数
0B检验键盘状态AL=00 有输入AL=FF 无输入

检测al地址是否等于0ffh
代码如下(示例):

L1:   ...
 		Cmp al,0ffH
        Jz  exit

cmp相当于减法,且值影响ZF标志位。al-0ffh=0,则ZF=1;
JZ跳转至exit函数
exit:带返回值结束

Exit:   mov ah,4ch
        Int 21h

5.输出

通过端口A输出24位数至dx

L0:     .....
        mov dx,porta   ; 输出24位数

将bl值写入dx,低八位

L0:     .....
        mov al,bl
        Out dx,al

dx自动增加1,同DX++

L0:     .....
 		Inc  dx

dx输出bh值,中八位

L0:     .....
 		mov al,bh
        Out dx,al

dx自动增加1,同DX++

L0:     .....
 		Inc  dx

dx输出cl值,高8位

L0:     .....
 		mov al,cl
        Out dx,al 

6.延时

call语句:IP(和CS)入栈,后转移;同jmp

L0:     .....
		Call delay05      ; 延时

循环延时子程序

delay05 proc near        ; 循环延时子程序
        push cx
        push bx
        mov cx,0020H
d1:     mov bx,1200h
d2:     dec bx
        jnz d2
        loop d1
        pop bx
        pop cx
        ret
delay05 endp

7.移位

代码:

L0:     .....
		SHL  bx,1       ;16位左移一位
        Rcl  cl,1         ;8位左移一位

SHL(Shift Left): 逻辑左移:每位左移, 低位补 0, 高位进 CF
SHR(Shift Right): 逻辑右移:每位右移, 低位进 CF, 高位补 0
SAL(Shift Arithmetic Left): 算术左移:每位左移, 低位补 0, 高位进 CF
SAR(Shift Arithmetic Right):
算术右移:每位右移, 低位进 CF, 高位不变

结果影响 OF、SF、ZF、PF、CF

;ROL(Rotate Left): 循环左移:循环左移, 高位到低位并送 CF
ROR(Rotate Right): 循环右移:循环右移, 低位到高位并送 CF
RCL(Rotate through Carry Left): 带进位循环左移:循环左移, 进位值(原CF)到低位, 高位进 CF
RCR(Rotate through Carry Right): 带进位循环右移:循环右移, 进位值(原CF)到高位, 低位进 CF

结果影响 OF、CF


8、收尾

si- - ,jnz判断si是否结果为0;不为0则转入L1,否则向下执行jmp L0

L0:     .....
		dec si       
        jnz  L1
        Jmp  L0         ; 重新开始

dec:减1指令,相当于sub si,1
影响AF、OF、PF、SF、ZF标志位,但不影响CF进位标志位.

JCC指令
1、JE, JZ 结果为零则跳转(相等时跳转) ZF=1
2、JNE, JNZ 结果不为零则跳转(不相等时跳转) ZF=0,否则按序向下执行。N为不,Z为0
3、JS 结果为负则跳转 SF=1


总结

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值