汇编语言程序设计(汇编语言小程序100例)
大家好,今天小编来为大家解答以下的问题,关于汇编语言程序设计,汇编语言小程序100例这个很多人还不知道,现在让我们一起来看看吧!
汇编语言程序设计题
;本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。虽不敢说万无一失,但自信无虞;请楼主严格测试,若还有误,本回答作废。
;题目名称:键盘输入两个10位数以内(位数可变)十六进制数,求和并显示输出
;题目来源:
;操作说明:输入两个10位数以内(位数可变)十六进制数时,输足10位,自动结束输入;不足10位,按回车键结束输入。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
;-------------------------------------
;功能:显示指定地址(Str_Addr)的字符串
;入口:
; Str_Addr=字符串地址(要求在数据段)
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
;-------------------------------------
;功能:在当前光标位置显示一个字符
;入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr Endp
;-------------------------------------
;功能:显示、输出一个回车、换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF Endp
;-------------------------------------
;功能:取光标位置
;入口:无
;出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH CS
POP DS
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
POP DS
RET
Cursor_Row DB?
Cursor_Col DB?
GetCursor EndP
;-------------------------------------
;功能:置光标位置
;入口:Cursor_Row=行坐标; Cursor_Col:列坐标)
SetCursor Proc Near
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH CS
POP DS
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
POP DS
RET
SetCursor EndP
;-------------------------------------
;功能:键盘输入一个指定位数(N)的十六进制数字,保存在指定的存储单元
;输足N位的,自动结束输入;不足N位的,回车结束输入。
;入口:@@Hexadec=数字位数,ds:di=输入数据保存地址
;出口:保存在指定的存储单元
Input_Hex Proc Near
push es
push di
push cx
push ax
push ds
pop es
mov cx,cs:@@Hexadec;十六进制数位数
cld
push cx
xor al,al
rep stosb;数据缓冲区清零
pop cx
dec di
@@Input_Hex: call GetCursor;取光标位置
mov ah,1;从键盘接受一个字符
int 21h
cmp al,CR;回车?已经键入的十六进制字符不足N位
jz@@Return_Hex
cmp al,KBBack;回空键?
jz@@KB_Back;是,重新输入
cmp al,'0';低于数字'0'?
jb@@KBBack;是,重新输入
cmp al,'9';低于或等于数字'9'?
jbe@@Convert_Bin;是,转去转换成二进制数
and al,0dfh;对高于数字'9'的字符视为字母并转换成大写,以便判断是否是A~F之间的字母
cmp al,'A';低于字母'A'?
jb@@KBBack;是,重新输入
cmp al,'F';高于字母'F'?
ja@@KBBack;高于字母'F',重新输入
sub al,7;使低4位等于对应字母的十六进制值
@@Convert_Bin: and al,0fh;转换成二进制数
push ax;入栈保存
loop@@Input_Hex;接受下一个数字
@@Return_Hex: mov ax,cx
mov cx,cs:@@Hexadec
sub cx,ax
jcxz@@Return_pop
std
@Reverse_Order:pop ax
stosb;保存
loop@Reverse_Order
@@Return_pop: pop ax
pop cx
pop di
pop es
ret
@@KB_Back: cmp cx,cs:@@Hexadec;十六进制数位数
jz@@Input_Hex
inc cx
dec di
dec Cursor_Col
@@KBBack: call SetCursor;置光标位置
jmp@@Input_Hex
@@Hexadec dw?;数字位数
Input_Hex EndP
;-------------------------------------
;功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
;入口:AL
;出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10;AL<10?
jb@@To_ASCII;AL<10,按数字处理
add al,7;AL>=10,按大写字母处理
@@To_ASCII: add al,'0';转换成相应的数字或大写字母
ret
AL_ASCII EndP
;-------------------------------------
;功能:键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回
;入口:无
;出口:若输入的是'y',进位标志置位;若输入的是'n',进位标志复位。
Yes_or_No proc Near
push dx
push ax
@@Input_Chr: mov ah,7;不带回显的键盘输入
int 21h
mov dl,al
and al,0dfh
cmp al,'Y'
jnz$+5
stc
jmp$+7
cmp al,'N'
jnz@@Input_Chr
clc
mov ah,2
int 21h
pop ax
pop dx
ret
Yes_or_No Endp
;-------------------------------------
N equ 10;数据位数
Summand db N dup(?);被加数
Addend db N dup(?);加数
Sum db N+1 dup(?);和
Prompt_Str1 db'Please input the summand:$';“输入被加数”提示信息
Prompt_Str2 db 13,10,'Please input the addend:$';“输入加数”提示信息
Prompt_Str3 db 13,10,'The sum:$';“显示相加之和”提示信息
Prompt_Str4 db 13,10,13,10,'Do you want to continue(y/n)?$';“继续做加法?”提示信息
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
;-------------------------------------
Start: push cs
pop ds
push cs
pop es
mov@@Hexadec,10;数字位数
Addition_Hex: lea di,Sum;相加和存放地址
mov cx,N+1
xor al,al
cld
rep stosb;相加之和初始值清零
Output Prompt_Str1;提示输入被加数
lea di,Summand;被加数存放地址
call Input_Hex;键盘输入一个指定位数(N)的十六进制数字,保存在指定的存储单元
Output Prompt_Str2;提示输入加数
lea di,Addend;加数存放地址
call Input_Hex
mov si,9;个位数下标
lea di,Sum[10];相加之和个位数存放地址
mov cx,10;数据位数
std
clc;进位标志位复位
Addition: mov al,Summand[si];读入一位被加数
adc al,Addend[si];加上加数
push cx
xor ah,ah
mov cx,4
shl ax,cl;左移4位,把进位标志位移到AH
shr al,cl;右移4位,把AL的低4位移回
pop cx
stosb;保存相加结果
rcr ah,1;带进位循环右移1位,把进位结果移至标志位
dec si
loop Addition
mov al,ah
rcl al,1;把进位标志移入AL
test al,al
jz$+3
stosb;保存最高位进位
Output Prompt_Str3;提示显示相加和
mov cx,N+1
lea di,Sum;相加和存放地址
xor al,al
cld
repz scasb;扫描相加和最高有效位
dec di
inc cx
mov si,di;相加和最高有效位地址
@@Output_Data: lodsb;读入1位相加和结果
call AL_ASCII;将AL中的低4位二进制数转换成十六进制显示的ASCII码
mov dl,al
call Output_Chr;显示一个字符
loop@@Output_Data
Output Prompt_Str4;提示是否继续做十六进制加法
call Yes_or_No;键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回
call Output_CTLF;显示、输出一个回车、换行
call Output_CTLF
jc Addition_Hex
;-------------------------------------
Exit_Proc: Output Press_Key;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch;结束程序
int 21h
Code ENDS
END Start;编译到此结束
汇编语言程序设计的一般步骤是什么
汇编语言程序设计的基本步骤了解了汇编语言指令的功能和用法,了解了汇编语言程序的编写格式,就可以编制完整的汇编语言程序了。一个程序通常具有顺序、分支、循环和子程序4种结构形式。顺序程序结构就是指完全按顺序逐条执行的指令序列。在程序设计过程中,顺序结构大量存在,屡见不鲜。但一个完整的程序只是逐条去执行指令,这非常少见。常见的程序结构,是上述4种结构的混合体。一般来说,编制一个汇编语言程序的步骤如下:(1)分析题意,确定算法或算法思想。算法是指解决问题的方法和步骤。比如现有的一些计算方法和日常生活中解决问题的逻辑思维推理方法等。(2)根据算法画出流程图,简单的情况也可不画。画出描述算法的流程图,可以首先从图上检验算法的正确性,减少出错的可能,使得动手编写程序时的思路更加清晰。(3)分配存储空间和工作单元,合理地使用寄存器。分配存储空间和工作单元,是指存储空间的分段和数据定义。另外,由于寄存器的数量有限,编写程序时经常会感到寄存器不够用。因此,对于字节数据,要尽量使用8位寄存器。而采用适当的寻址方式,也会达到节省寄存器的目的。(4)根据流程图编写程序。这是编制汇编语言程序最为重要的一步。算法里规定的功能,是要通过一条条指令描述出来的。为了提高编程能力,对于初学者,一是要多阅读现有的程序,以学习别人的编程经验;而更为重要的是,必须多亲自动手编写,不要怕失败,只有通过无数次失败,才能从中积累自己的编程经验。(5)上机调试运行程序。通过汇编的源程序,只能说明它里面不存在语法错误。但是它是否能达到算法所要求的预期效果,还必须经过上机调试,用一些实验数据来测试,才能够真正地得出结论。可以这么说,即使是一个非常有经验的程序员,也没有百分之百的把握说他编写的程序一次就成功。用流程图表示算法流程图用一些图形框来代表各种操作。用图形表示算法,直观形象,可以用来帮助人们对算法的理解。下图给出了一些常用的流程图符号。
上图中的判断框(菱形)用来对一个给定的条件作出判断,以决定如何执行其后的操作。它有一个入口,两个出口,如下图(a)所示。
连接点(圆圈)是用来将画在不同地方的流程线连接起来。例如在下图(b)里,有两个圈里写着数字1的圆圈,它表示是从左边的1出来,进到右边图的1里(这由流程线的方向给出)。可以看出,这两个点其实就是同一个点,只是由于画不下而分开来画的。用连接点,可以避免流程图中的流程线相互交叉或过长,从而使流程图清晰。
注释框不是流程图中必需的部分。在流程图中使用它,是为了对流程图中的某些框的操作做一些必要的说明,以便使人们能够更好地通过流程图来理解算法。
处理框反映做些什么样的操作,如把某个单元的内容送入某个寄存器,从某个存储单元取出数据等。它是流程图里最为本质的、出现最多的图形框。
输入/输出框反映程序的输入和输出情况。计算机程序无外乎接收数据,进行处理,然后加以输出,所以输入/输出框是必不可少的。
汇编语言是一种什么程序设计语言
汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。
比起机器语言,汇编语言具有更高的机器相关性,更加便于记忆和书写,但又同时保留了机器语言高速度和高效率的特点。
汇编语言仍是面向机器的语言,很难从其代码上理解程序设计意图,设计出来的程序不易被移植,故不像其他大多数的高级计算机语言一样被广泛应用。所以在高级语言高度发展的今天,它通常被用在底层,通常是程序优化或硬件操作的场合。
扩展资料:
在许多程序的设计当中,高级语言和汇编语言可以相互交叉调用,进行参数传递,共享数据信息,这便是所谓的混合编程。
程序员往往在高级语言程序中直接嵌入汇编语句,以实现对硬件直接进行控制的功能,这是混合编程中常见的做法。也可以在高级语言程序中使用汇编语言中定义的变量和常量,或使用内部函数对汇编语句进行调用。
简而言之,这类混合编程的方法可以让高级语言与汇编语言互相取长补短,各自发挥各自优势,同时减少各自缺点所带来的不便,善用这个方法可以使开发和编程工作达到事半功倍的效果。
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!