微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机汇编指令入门学习和查看

单片机汇编指令入门学习和查看

时间:11-25 来源:互联网 点击:

至此已经生成EXE文件,我们还须使用EXE2BIN 将EXE文件(SMILE.EXE),转换成COM文件(SMILE.COM)。输入EXE2BIN SMILE产生 BIN 文件(SMILE.BIN)。其实 BIN 文件与 COM 文件是完全相同的,但由于DOS只认COM、EXE及BAT文件,所以BIN文件无法被正确执行,改名或直接输入 EXE2BIN SMILE SMILE.COM即可。现在,磁盘上应该有 SMILE.COM 文件了,你只要在提示符号C:>

andal,0fh;把无用位清零

add al,30h ;把AL内数据加30H,并存入al

cmp al,3ah ;与3ah比较

jl printit ;小于3ah则转移

add al,7h ;把AL内数据加30H,并存入al

printit:mov dl,al ;把ASCII码装入DL

mov ah,2

int 21h

dec ch ;ch减一,减到零时,零标志置1

jnz rotate ;JNZ:当零标志未置1,则跳到指定地址。即:不等,则转移

int 20h ;从子程序退回主程序

binihex ends

end

利用循环左移指令ROL循环寄存器BX(BX内容将由第二个子程序提供)的内容,以便依序处理4个十六进制数:1. 利用CL当计数器,记录寄存器移位的次数。2.将BX的第一个十六进制值移到最右边。利用 AND (逻辑“与”运算:对应位都为1时,其结果为1,其余情况为零)把不要的部份清零,得到结果:先将BL值存入AL中,再利用AND以0Fh(00001111)将AL的左边四位清零。由于0到9的ASCII码为30h到39h,而A到F之ASCII码为41h到46h,间断了7h,所以得到结果:若AL之内容小于3Ah,则AL值只加30h,否则AL再加7h。ADD指令会将两个表达式相加,其结果存于左边表达式内。标志寄存器(Flag Register)是一个单独的十六位寄存器,有9个标志位,某些汇编指令(大部份是涉及比较、算术或逻辑运算的指令)执行时,会将相关标志位置1或清0,常碰到的标志位有零标志(ZF)、符号标志(SF)、溢出标志(OF)和进位标志(CF)。标志位保存了某个指令执行后对它的影响,可用其他相关指令,查出标志的状态,根据状态产生动作。CMP指令很像减法,是将两个表达式的值相减,但寄存器或内存的内容并未改变,只是相对的标志位发生改变而已:若 AL 值小于 3Ah,则正负号标志位会置0,反之则置1。 JL指令可解释为:小于就转移到指定位置,大于、等于则向下执行。CMP和JG 、JL等条件转移指令一起使用,可以形成程序的分支结构,是写汇编程序常用技巧。

第二个模块DECIBIN 用来接收键盘打入的十进制数,并将它转换成二进制数放于BX 寄存器中,供模块1 BINIHEX使用。

decibin segment

assume cs:decibin

mov bx,0 ;BX清零

newchar:mov ah,1 ;

int 21h ;读一个键盘输入符号入al,并显示

sub al,30h ;al减去30H,结果存于al中,完成ASCII码转二进制码

jl exit ;小于零则转移

cmp al,9d

jg exit ;左>右则转移

cbw ;8位al转换成16位ax

xchg ax,bx ;互换ax和bx内数据

mov cx,10d ;十进制数10入cx

mul cx ;表达式的值与ax内容相乘,并将结果存于ax

xchg ax,bx

add bx,ax

jmp newchar ;无条件转移

exit: int 20 ;回主程序

decibin ends

end

CBW 实际结果是:若AL中的值为正,则AH填入00h;反之,则AH填入FFh。XCHG常用于需要暂时保留某个寄存器中的内容时。

当然,还得一个子程序(CRLF)使后显示的十六进制数不会盖掉先输入的十进制数。

crlf segment

assume cs:crlf

mov dl,0dh ;回车的ASCII码0DH入DL

mov ah,2

int 21h

mov dl,0ah ;换行的ASSII码0AH入AH

mov ah,2

int 21h

int 20 ;回主程序

crlf ends

end

现在我们就可以将BINIHEX、DECIBIN及CRLF等模块合并成一个大程序了。首先,我们要将这三个模块子程序略加改动。然后,再写一段程序来调用每一个子程序。

crlf proc near;

mov dl,0dh

mov ah,2

int 21h

mov dl,0ah

mov ah,2

int 21h

ret

crlf endp

类似SEGMENT与ENDS的伪指令,PROC与ENDP也是成对出现,用来识别并定义一个程序。其实,PROC 真正的作用只是告诉编译器:所调用的程序是属于近程(NEAR)或远程(FAR)。 一般的程序是由 DEBUG 直接调用的,所以用 INT 20 返回,用 CALL 指令所调用的程序则改用返回指令RET,RET会把控制权转移到栈顶所指的地址,而该地址是由调用此程序的 CALL指令所放入的。

各模块都搞定了,然后我们把子程序组合起来就大功告成

decihex segment ;主程序

assume cs:decihex

org 100h

mov cx,4 ;循环次数入cx;由于子程序要用到cx,故子程序要将cx入栈

repeat: call decibin;调用十进制转二进制子程序

call crlf ;调用添加回、换行符子程序

call binihex ;调用二进制转十六进制并显示子程序

call crlf

loop repeat ;循环4次,可连续运算4次

mov ah,4ch ; 调用DOS21号中断4c号功能,退出程序,作用跟INT 20H

int 21H ; 一样,但适用面更广,INT20H退不出时,试一下它

decibin proc near push cx ;将cx压入堆栈,;

┇ exit: pop cx ;将cx还原; retdecibin endp binihex proc near push cx

┇ pop cx retbinihex endp crlf proc near

push cx

┇ pop cx retcrlf endpdecihex ends end

CALL指令用来调用子程序

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top