单片机汇编语言程序的三种基本结构

单片机汇编语言程序的三种基本结构,第1张

汇编语言程序有顺序程序、分支程序、循环程序三种。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。

分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。

扩展资料:

注意事项:

汇编指令不区分大小写,目的 *** 作数是存结果的,原 *** 作数是被 *** 作的。

二进制数后跟b,十六进制数后跟h,十进制数不需特殊标记。

汇编源程序中,数据不能以字母开头,需要在前面加上0,如0a000h。

HELLO,WORLD进阶汇编程序系列

Editor:admin Time:2004-3-21 12:49 Read:9785 Score:8 Print

Writer:LLUCT

Excerpt:80x86汇编小站

Preface:

感谢网友lluct为本站提供原创......适合初学者学习哦

Content:

TITLE ***HELLO,WORLD进阶程序之选择分支 BY LLUCT***

DATASEGMENT 定义数据段

MSG1DB '***WELCOME TO MY PROGRAM BY LLUCT***','$'

定义输出的第一个字符串信息,字符串必须用DB定义,$为结束标志

MSG2DB '1:BASIC MESSAGE 2:ADVANCED MESSAGE','$'

定义输出的字符串信息:选择菜单

MSG3DB 'PLEASE CHOOSE:','$'

定义输出的字符串信息:选择前缀

MSG4DB 'HELLO,WORLD!^-^','$'

定义输出的字符串信息:分支1的信息

MSG5DB 'THIS IS MY FIRST ASM_86 PROGRAM! @^-^@','$'

定义输出的字符串信息:分支2的信息

ERRMSG DB 'CHOOSE ERROR! -_-b','$'

定义输出的字符串信息:选择错误信息

DATAENDS 数据段结尾

CODESEGMENT 定义代码段

ASSUME CS:CODE 规定CS的内容

ASSUME DS:DATA 规定DS的内容

START: MOV AX,DATA 程序从START开始

MOV DS,AX DS置初值,DATA的段地址

CALL ENTER 调用显示回车换行子程序

LEA DX,MSG1 输出第一个字符串的偏移地址

CALL DISPCHS 调用显示字符串子程序

CALLENTER 调用显示回车换行子程序

CALLENTER 这个...同上啊^-^

LEA DX,MSG2 输出第二个字符串的偏移地址

CALL DISPCHS 调用显示字符串子程序

AGAIN: CALLENTER 定义AGAIN标号.用于选择错误循环

LEA DX,MSG3 输出第三个字符串的偏移地址

CALL DISPCHS 调用显示字符串子程序

MOV AH,01H 调用1号功能:从键盘输入一个字符并回显

INT 21H 完成输入回显

CMP AL,'1' 输入的字符和1相比较

JE BASICP 如果相等,转移到BASICP标号(JE=Jump if Equal)

CMP AL,'2' 输入的字符和2相比较 ||

JE ADVANP 如果相等,转移到ADVANP标号(JE=如果相等就转移)

JMP ERROR 否则就无条件转移到ERROR标号

EXIT: MOV AH,4CH 4C号功能调用:终止当前程序并返回调用程序

INT 21H 返回DOS

BASICP: CALLENTER 什么,还要解释啊.晕-_-!!!

LEA DX,MSG4 输出第三个字符串的偏移地址

CALL DISPCHS 调用显示字符串子程序

CALLENTER ..........

JMP EXIT 无条件转移到EXIT标号

ADVANP: CALLENTER 55555555

LEA DX,MSG5 解释了四次,应该懂了吧

CALL DISPCHS 调用显示字符串子程序

CALLENTER 再问就死给你看

JMP EXIT 无条件转移到EXIT标号

ERROR: CALLENTER

LEA DX,ERRMSG 输出选择错误信息

CALL DISPCHS 调用显示字符串子程序

MOV DL,07H 输出ASCII码的报警(响铃)控制符BEL(07H)

CALL DISPCH 调用显示单个字符子程序

CALLENTER

JMP AGAIN

DISPCH PROCNEAR

显示单个字符子程序,NEAR说明子程序和主程序在同一个代码段中(现无主程序调用)

MOV AH,02H 2号功能调用:显示器输出字符

INT 21H 完成输出显示

RET 返回

DISPCH ENDP 子程序结尾

ENTER PROCNEAR 显示回车换行子程序

MOV DL,0DH 输出ASCII码的回车控制符CR(0DH)

CALLDISPCH 调用显示单个字符子程序

MOV DL,0AH 输出ASCII码的换行控制符LF(0AH)

CALLDISPCH 调用显示单个字符子程序

RET 返回

ENTER ENDP 子程序结尾

DISPCHS PROC NEAR

显示字符串子程序,NEAR说明子程序和主程序在同一个代码段中(现无主程序调用)

MOV AH,09H 9号功能调用:显示字符串

INT 21H 完成输出显示

RET

DISPCHS ENDP

CODEENDS 代码段结尾

END START 结束汇编

把以上代码复制到记事本等文本程序中,并保存.(如helloch.asm)

编译:masm helloch.asm

连接:link helloch.obj

执行:helloch.exe

======================================================

title ***hello,world进阶之字符串输入输出 by lluct***

datasegment 定义数据段

input db 100 dup(?)

定义输入的字符串,字符串必须用db定义,长度为100个字节

msg1db 'Hello,','$'

定义输出的前缀字符串信息,字符串必须用db定义,$为结束标志(24h)

msg2db ',Welcome to here!','$'

定义输出的后缀字符串信息

headmsg db 'PLEASE INPUT YOUR NAME:','$'

开始显示的字符串信息

dataends 数据段结尾

codesegment 定义代码段

assume cs:code 规定cs的内容

assume ds:data 规定ds的内容

start: mov ax,data 程序从start开始

mov ds,ax ds置初值,data的段地址

mov si,0 变址寄存器置初值0

callenter 调用显示回车换行子程序

lea dx,headmsg 输出开始显示的字符串的偏移地址

calldispchs 调用显示字符串子程序

repeat: mov ah,01h

定义repeat标号,用于循环输入单个字符.调用1号功能:从键盘输入一个字符并回显

int 21h 完成输入回显

cmp al,0dh 输入的字符和CR(回车)比较

je exit 如果等于回车就转移到exit

mov input[si],al 把al的值传送到input的si地址中(好像是这样吧)

inc si si加1

jmp repeat 无条件转移到repeat

exit: callenter

mov input[si],24h 给输入完成的字符串加上结束标志($)

callenter

lea dx,msg1 输出前缀字符串的偏移地址

calldispchs 调用显示字符串子程序

lea dx,input 输出刚才输入的字符串

calldispchs

lea dx,msg2

calldispchs

callenter

mov ah,4ch 4c号功能调用:终止当前程序并返回调用程序

int 21h 返回dos

enter procnear 显示回车换行子程序

mov dl,0dh 输出ascii码的回车控制符cr(0dh)

calldispch

mov dl,0ah 输出ascii码的换行控制符lf(0ah)

calldispch

ret 返回

enter endp 子程序结束

dispch procnear

mov ah,02h 2号功能调用:显示器输出字符

int 21h 完成输出显示

ret 返回

dispch endp

dispchs procnear

mov ah,09h 9号功能调用:显示字符串

int 21h 完成输出显示

ret 返回

dispchs endp

codeends 代码段结尾

end start 结束汇编

把以上代码复制到记事本等文本程序中,并保存.(如heinout.c)

编译:masm heinout.asm

连接:link heinout.obj

执行:heinout.exe

个人感觉最大的特点就是:松散

比如高级语言中一个简单的if判断,到了汇编都要用到跳转,所以汇编的源程序要用到大量的标号和跳转指令,这就使得源程序变得支离破碎,源程序跳来跳去,也就是我说的松散了

解决这个问题的最好方法大概是将过程化思想最大化的应用到汇编的源程序设计中,把一个源程序分割成一个一个的过程,这样调试和维护就会省不少事

我现在写大程序一般都是用MAIN过程初始化一些整个程序都会用到的寄存器,然后就是几个call,然后就是mov ax,4C00H int 21H,说实话,比原来那种不用call的写法清晰很多


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11850046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存