汇编语言程序有顺序程序、分支程序、循环程序三种。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。
分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。
扩展资料:
注意事项:
汇编指令不区分大小写,目的 *** 作数是存结果的,原 *** 作数是被 *** 作的。
二进制数后跟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的写法清晰很多
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)