提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
以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