文档详情

单片机汇编语言讲解.doc

发布:2017-03-25约3.83千字共12页下载文档
文本预览下载声明
80X86 汇编语言快速入门 80X86 汇编语言...指令集和段定义 注意: 当你以编译器汇编你设计的程序时,常会发生打字错误、标识符名称拼错、 十六进制 数少了h、 逻辑错误等。 汇编老手常给新人的忠告是: 最好料到自己所写的程序一定会有些 错误(别人告诉我的) ;如果第一次执行程序后,就得到期望的结果,你最好还是在检查一 遍,因为它可能是错的。原则上,只要大体的逻辑架构正确,查找程序中错误的过程,与写 程序本身相比甚至更有意思。 写大程序时, 最好能分成许多模块, 如此可使程序本身的目的 较单纯, 易于撰写与查错, 另外也可让程序中不同部份之间的界限较清楚, 节省编译的时间。 如果读程序有读不懂的地方最好用纸笔记下有关寄存器、 内存等内容, 在纸上慢慢比划, 就 豁然开朗了。 下面我们将写一个能从键盘取得一个十进制的数值, 并将其转换成十六进制数值而显示于屏 幕上的 “大程序” 。前言: 要让 8086 执行这样的功能,我们必须先将此问题分解成一连串的 步骤,称为程序规划。首先,以流程图的方式,来确保整个程序在逻辑上没有问题(不用说 了吧!什么语言都要有此步骤) 。这种模块化的规划方式,称之为“由上而下的程序规划” 。 而在真正写程序时,却是从最小的单位模块(子程序)开始,当每个模块都完成之后,再合 并成大程序;这种大处著眼,小处著手的方式称为“由下而上的程序设计” 。 我们的第一个模块是 BINIHEX ,其主要用途是从 8086 的 BX 寄存器中取出二进制数,并以 十六进制方式显示在屏幕上。注意:子程序如不能独立运行,实属正常。 binihex segment assume cs:binihex mov ch,4 记录转换后的十六进制位数(四位) rotate: mov cl,4 利用 CL 当计数器,记录寄存器数位移动次数 rol bx,cl 循环寄存器 BX 的内容,以便依序处理 4 个十六进制数 mov al,bl 把 bx 低八位 bl 内数据转移至 al and al,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 ()将 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
显示全部
相似文档