汇编语言程序设计步骤 有那几步
汇编语言程序设计步骤:1、 分析问题,抽象出描述问题的数据模型 2、 确定问题的算法思想 3、 画出流程图或结构图 4、 分配存储器和工作单元(寄存器) 5、 逐条编写程序 6、 静态检查,上机调试 例:编程查找考生的最高分,假设所有考生分数已存入计算机内存.1、 分析问题 根据条件、特点、规律 →数学模型 本例分数已给定为0~200之间的整数集合(考虑加试分) ,记为{S},找max{S}(注:简单问题不一定写数学模型) .2、 确定算法思想 最好利用现成算法和程序设计方法,若无,则需根据实践经验总结算法思想.如本例,从成绩单第一分数往下看,边看边比较,记住较高分,舍弃较低分,直至看完,最高分存于 脑中.归纳算法思想:建立数据指针并指向数据区首地址.将第一数取入寄存器(如AL) ,与下一数比较,若下一数大则将其取入寄存器,否则调整指针,再与下一数比较,重复上述 直至比较完毕,寄存器中即最高分.读分数用MOV指令,比较用CMP指令,分析判断用条件转移指令.3、 画流程图或结构图 有逻辑流程、算法流程、程序流程等,复杂问题需画模块结构.本例简单,只画出程序 流程图(用模块化结构的N-S流程图表示) :本例的N-S流程图 图中初始化包括:设一个计数器,将分数个数减一后送计数器,每比较一次减一,至 零查找结束;建立一个指针指向数据区.开始 初始化 取第一数到寄存器 与下一数比较 下一数大?是 否 取大数到寄存器 修改指针,计数次数减一 返回到循环体开始,直到计数次数为0退出循环 结束 4、 分配存储器空间和工作单元(寄存器) 定义数据段、堆栈段、代码段等.工作单元一般用寄存器.本例:分数放数据段,建100 字节堆栈空间,BX作数据指针,CX作计数器,AL放最高分.5、 逐条编写程序 DATA SEGMENT FEN DB 85,90,60,75,87,35,80,78,96,82…… ;存分数 MAX DB ;存最高分 DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ DB 100 DUP(?) ;100字节堆栈 STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START PROC FAR PUSH DS MOV AX,0 PUSH AX ;为了返回DOS MOV AX,DATA MOV DS,AX ;置数据段寄存器 MOV BX,OFFSET FEN ;置数据指针 MOV CX,MAX-FEN ;置计数器初值 DEC CX ;N个分数比较N-1次 MOV AL,[BX] ;取第一个分数 LOP:INC BX ;调整指针 CMP AL,[BX] ;与下一数比较 JAE NEXT ;大于等于则转 MOV AL,[BX] ;否则取下一数 NEXT:LOOP LOP ;计数器减一,;不为零转LOP MOV MAX,AL ;存放最高分 RET ;返回DOS START ENDP CODE ENDS END START 6、 静态检查,上机调试 选用指令尽量字节少,使其执行速度快.易错处应重点查,如比较次数、转移条件等.确信无错后方可上机调试.
汇编语言程序设计的基本步骤了解了汇编语言指令的功能和用法,了解了汇编语言程序的编写格式,就可以编制完整的汇编语言程序了。一个程序通常具有顺序、分支、循环和子程序4种结构形式。顺序程序结构就是指完全按顺序逐条执行的指令序列。在程序设计过程中,顺序结构大量存在,屡见不鲜。但一个完整的程序只是逐条去执行指令,这非常少见。常见的程序结构,是上述4种结构的混合体。一般来说,编制一个汇编语言程序的步骤如下:(1) 分析题意,确定算法或算法思想。算法是指解决问题的方法和步骤。比如现有的一些计算方法和日常生活中解决问题的逻辑思维推理方法等。(2) 根据算法画出流程图,简单的情况也可不画。画出描述算法的流程图,可以首先从图上检验算法的正确性,减少出错的可能,使得动手编写程序时的思路更加清晰。(3) 分配存储空间和工作单元,合理地使用寄存器。分配存储空间和工作单元,是指存储空间的分段和数据定义。另外,由于寄存器的数量有限,编写程序时经常会感到寄存器不够用。因此,对于字节数据,要尽量使用8位寄存器。而采用适当的寻址方式,也会达到节省寄存器的目的。(4) 根据流程图编写程序。这是编制汇编语言程序最为重要的一步。算法里规定的功能,是要通过一条条指令描述出来的。为了提高编程能力,对于初学者,一是要多阅读现有的程序,以学习别人的编程经验;而更为重要的是,必须多亲自动手编写,不要怕失败,只有通过无数次失败,才能从中积累自己的编程经验。(5) 上机调试运行程序。通过汇编的源程序,只能说明它里面不存在语法错误。但是它是否能达到算法所要求的预期效果,还必须经过上机调试,用一些实验数据来测试,才能够真正地得出结论。可以这么说,即使是一个非常有经验的程序员,也没有百分之百的把握说他编写的程序一次就成功。 用流程图表示算法 流程图用一些图形框来代表各种操作。用图形表示算法,直观形象,可以用来帮助人们对算法的理解。下图给出了一些常用的流程图符号。
上图中的判断框(菱形)用来对一个给定的条件作出判断,以决定如何执行其后的操作。它有一个入口,两个出口,如下图(a)所示。
连接点(圆圈)是用来将画在不同地方的流程线连接起来。例如在下图(b)里,有两个圈里写着数字1的圆圈,它表示是从左边的1出来,进到右边图的1里(这由流程线的方向给出)。可以看出,这两个点其实就是同一个点,只是由于画不下而分开来画的。用连接点,可以避免流程图中的流程线相互交叉或过长,从而使流程图清晰。
注释框不是流程图中必需的部分。在流程图中使用它,是为了对流程图中的某些框的操作做一些必要的说明,以便使人们能够更好地通过流程图来理解算法。
处理框反映做些什么样的操作,如把某个单元的内容送入某个寄存器,从某个存储单元取出数据等。它是流程图里最为本质的、出现最多的图形框。
输入/输出框反映程序的输入和输出情况。计算机程序无外乎接收数据,进行处理,然后加以输出,所以输入/输出框是必不可少的。
●认识领先。《汇编语言程序设计》根据人的认识规律实践-理论-实践的特点组织教学内容,在全书开始及各重要章节开始,都以完整的实例引导,学生通过实例能感性地了解到需要学习的内容以及意义,比纯概念式的灌输能产生更好的教学效果。
●准确定位。《汇编语言程序设计》强调为应用类读者服务,力求门槛低、内容全、描写细腻,与“应用类”读者群的需求相适应。选择从具有代表性、汇编难度适中的8086/8088入手,重点关注汇编语言程序设计方法,为学生进一步掌握计算机控制技术、学习计算机接口和单片机等课程打好基础。
●精选用例。《汇编语言程序设计》在设计用例时,突出主要知识点及应用中的关键问题,尽量减少代码量并给出详细注释,让程序结构与设计思想一目了然。
●加强输入/输出程序设计的教学。《汇编语言程序设计》加入了对外设操作常用芯片的介绍,着重讨论外部连接、工作方式及其设定,学习相关程序设计方法,突出软件方面内容。对于这一部分,教师可以根据实际情况灵活处理,即使之后开设接口课,多数会基于C语言教学,《汇编语言程序设计》介绍的输入输出内容也是有益的衔接。
●配套实验指导。随《汇编语言程序设计》出版,我们将在出版社网站上同时发布相应的实验指导材料,采用认识-模仿-组装-创新的结构组织实验内容。在每次实验前,教师可以向学生下发当次实验的电子文档,学生上机时,有些内容只需要复制、粘贴就可以进入实质性的实验,突出汇编语言程序算法与设计方法的学习,避免将大量的时间用到文字输入与审校中。为了让学生充分思考问题,又设计了一些带创新性的问题,包括程序组装与程序设计题,引导学生不断深入。
LJMP MAIN
ORG 0030H
MAIN:
MOV A,P1
MOV P0,A
SJMP MAIN
END
include kcsj.mac
.model small
.386
.stack 200h
public prog1
.data
menu db 30 dup(' '),'1.Display text file',0ah,0dh
db 30 dup(' '),'2.Copy text file',0ah,0dh
db 30 dup(' '),'3.Delete text file',0ah,0dh
db 30 dup(' '),'4.The end',0ah,0dh
db 30 dup(' '),'Please select one(1~4):','$'
prompt1 db 0ah,0dh,'File name:$'
prompt2 db 0ah,0dh,'Lines of page(1~25):$'
FNAME db 15,?,15 dup(' ') 存放文件名的缓冲区
out1 db 0ah,0dh,'Can not open file!$'
out2 db 0ah,0dh,'Can not read file!$'
out3 db 0ah,0dh,'Can not creat file!$'
out4 db 0ah,0dh,'Can not write file!$'
out5 db 0ah,0dh,'Can not delete file!$'
out6 db 0ah,0dh,'The file has been copyed!$'
out7 db 0ah,0dh,'The file has been deleted!$'
buffer db ?
endcode db 0 错误标志
end1 db 0 结束标志
code1 dw ? 原文件的代号
code2 dw ? 新建文件的代号
sign db 0
ask1 db 0ah,0dh,'Input source file name:$'
ask2 db 0ah,0dh,'Input dest file name:$'
row db 23
info db 'Press ESC to quit,p to change page,anykey to continue!$'
.code
prog1 proc far
init
call mainshow
L1:mov ah,1
int 21h
cmp al,'1'
je display
cmp al,'2'
je copy
cmp al,'3'
je delete
jmp rtn1
display:call fdisp
call mainshow
mov end1,0
mov [row],23
mov endcode,0
jmp L1
copy:call fcopy
call mainshow
mov endcode,0
mov sign,0
jmp L1
delete:call fdel
call mainshow
jmp L1
rtn1:ret
prog1 endp
mainshow proc near
scroll 0
cursor 10,0
strdisp menu
ret
mainshow endp
fdisp proc near分页显示
strdisp prompt1
call fopen
scroll 0 清屏
cursor 0,0 置光标
cmp endcode,1
jne cont
mov ah,7
int 21h
jmp ext0
cont:mov bx,code1
call fread
cmp endcode,1
je ext1
call fshow 显示
cmp end1,1
je ext1
jmp cont
ext1:mov ah,3eh 关闭文件
mov bx,code1
int 21h
ext0:mov endcode,0
ret
fdisp endp
fopen proc near 打开文件
call in_name
mov ah,3dh
mov al,0
int 21h
jnc next
mov endcode,1
strdisp out1
ret
next:mov bx,ax
mov code1,ax
ret
fopen endp
in_name proc near 输入文件名
lea dx,FNAME
mov ah,0ah
int 21h
lea bx,FNAME+2
mov ah,0
mov al,FNAME+1
add bx,ax
mov byte ptr [bx],0
add dx,2
ret
in_name endp
fread proc near 读取文件
mov ah,3fh
mov cx,1
lea dx,buffer
int 21h
jnc past
strdisp out2
jmp exit
past:cmp ax,0
je exit
ret
exit:mov ah,3eh
int 21h
mov endcode,1
ret
fread endp
fshow proc near 显示文件
mov dl,[buffer]
mov ah,2
int 21h
mov ah,3
mov bh,0
int 10h
cmp dh,[row]
jae d1
ret
d1:strdisp info
d2:mov ah,7
int 21h
cmp al,0
jz d2
cmp al,1bh 按ESC退出
jz d4 退出关闭文件endcode=1
cmp al,70h 按P提示输入每页行数
jnz d3
strdisp prompt2
call chtonum
mov [row],al
d3:scroll 0
cursor 0,0
ret
d4:mov end1,1
ret
fshow endp
chtonum proc near
mov bx,0
newchar:mov ah,1 输入数字并转换为十进制
int 21h
sub al,30h
jl goon
cmp al,9
jg goon
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
goon:mov al,bl 行数传给AL
ret
chtonum endp
fcopy proc near 文件拷贝
scroll 0
cursor 0,0
strdisp ask2
call fcreat
cmp endcode,1
je over
mov code2,ax
strdisp ask1
call fopen
cmp endcode,1
je etn0
again:call fread
cmp endcode,1
je etn0
mov sign,1
push bx
cmp ax,0
je next2
mov cx,ax
mov bx,code2
mov ah,40h
int 21h
pop bx
jnc again
strdisp out4
ret
next2:mov ah,3eh
mov bx,code1
int 21h
etn0:mov ah,3eh
mov bx,code2
int 21h
cmp sign,1
jne over
strdisp out6
over:mov ah,7
int 21h
ret
fcopy endp
fcreat proc near 创建文件
call in_name
mov ah,3ch
mov cx,00
int 21h
jnc next1
mov endcode,1
strdisp out3
next1:ret
fcreat endp
fdel proc near 删除文件
scroll 0
cursor 0,0
strdisp prompt1
call in_name
mov ah,41h
int 21h
cmp ax,0
jnz quit
strdisp out5
mov ah,7
int 21h
ret
quit:strdisp out7
mov ah,7
int 21h
ret
fdel endp
end prog1
1.ADD BX,AX 或 ADD BL,AL 类型配对
2.MOV AX,0A999H
3.MOV AX,0F8H
4.MOV AX,1234H 或 MOV AL,12H
5.MOV AX,[BX]
6.MOV DS,AX DS不能直接存立即数
7.ADD [BX],10对
8.PUSH AXpush不能直接push立即数
9.IN AL,DX
10.OUT 40H ,AL
11.MUL AL mul不能直接跟立即数
12.MOV [DI],AX mov不能两个都是内存
13.ADD DI,AX
14.MOV DS,AX CS不可以改
15.SUB 10[SI],AX si di 不可以同时出现
二.
SUB [BP], BX 寄存器间接寻址方式30400H
MOV [BX+DI], SI 基址变址寻址方式10400H
ADD ES:[SI], DI 寄存器相对寻址方式20200H
MOV 10[BX], DI 寄存器相对寻址方式10100H
MOV DS:[100H], BX 相对基址变址寻址方式;10100H
三.
3456H5678H1234H5678H
四.
1234H2468H0008H1008H0804H0408H0508H0508H
五.
01H,31H,0FFH,00H,78H,56H,FFH,FFH,00H,24H,00H,0BH,00H,0BH,19H,09H,09H
(从左往右地址变大)
AX=3101H,BX=0023H
六.
1.
汇编语言:(AssemblyLanguage)是面向机器的程序设计语言。
汇编:把汇编语言翻译成机器语言的过程称为汇编。
汇编程序:把汇编语言书写的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言书写的源程序,输出的是用机器语言表示的目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,由汇编执行指令和汇编伪指令组成。采用汇编语言编写程序虽不如高级程序设计语言简便、直观,但是汇编出的目标程序占用内存较少、运行效率较高,且能直接引用计算机的各种设备资源。它通常用于编写系统的核心部分程序,或编写需要耗费大量运行时间和实时性要求较高的程序段。
2.
3.
单独cmpsb就是逐一比较8个位;加上rep,循环比较,还是比较这8位啊
4.
是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。
5.
宏和子程序都是为了简化源程序的编写,提高程序的可维护性,但是它们二者之间存在着以下本质的区别:
1、在源程序中,通过书写宏名来引用宏,而子程序是通过CALL指令来调用;
2、汇编程序对宏通过宏扩展来加入其定义体,宏引用多少次,就相应扩展多少次,所以,引用宏不会缩短目标程序;而子程序代码在目标程序中只出现一次,调用子程序是执行同一程序段,因此,目标程序也得到相应的简化;
3、宏引用时,参数是通过“实参”替换“形参”的方式来实现传递的,参数形式灵活多样,而子程序调用时,参数是通过寄存器、堆栈或约定存储单元进行传递的;
4、宏引用语句扩展后,目标程序中就不再有宏引用语句,运行时,不会有额外的时间开销,而子程序的调用在目标程序中仍存在,子程序的调用和返回均需要时间。
总之,当程序片段不长,速度是关键因素时,可采用宏来简化源程序,但当程序片段较长,存储空间是关键因素时,可采用子程序的方法来简化源程序和目标程序。
七.
…………
1、MASM。
微软公司为x86 微处理器家族开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm,是Windows下开发汇编的利器。
2、NASM。
全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序,其设计初衷是为了实现编译器程序跨平台和模块化的特性。
3、TASM。
Borland公司开发的汇编编译器,被广泛用于Turbo C,Quick Basic等编译器,用作中间过渡编译。它也能独立的编译纯汇编或是Win32Asm的代码。具有编译快速,高效的特点,至今依然是汇编开发的首选利器。
4、GAS。
GNU汇编器(GNU Assembler),简称为GAS,是由GNU计划所使用的汇编器,GNU的核心精神是自由与分享,所以GAS亦是自由软件。
5、RadASM。
一款著名的WIN32汇编编辑器,支持MASM、TASM等多种汇编编译器,Windows界面,支持语法高亮,自带一个资源编辑器和一个调试器。拥有较强的工程管理功能,加之众多插件的支持,使得它用汇编语言编写Windows软件变得得心应手。
参考资料来源:百度百科-汇编语言