汇编语言程序设计
汇编语言程序设计步骤: 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、 静态检查,上机调试 选用指令尽量字节少,使其执行速度快。易错处应重点查,如比较次数、转移条件等。 确信无错后方可上机调试。
汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。
比起机器语言,汇编语言具有更高的机器相关性,更加便于记忆和书写,但又同时保留了机器语言高速度和高效率的特点。
汇编语言仍是面向机器的语言,很难从其代码上理解程序设计意图,设计出来的程序不易被移植,故不像其他大多数的高级计算机语言一样被广泛应用。所以在高级语言高度发展的今天,它通常被用在底层,通常是程序优化或硬件操作的场合。
扩展资料:
在许多程序的设计当中,高级语言和汇编语言可以相互交叉调用,进行参数传递,共享数据信息,这便是所谓的混合编程。
程序员往往在高级语言程序中直接嵌入汇编语句,以实现对硬件直接进行控制的功能,这是混合编程中常见的做法。也可以在高级语言程序中使用汇编语言中定义的变量和常量,或使用内部函数对汇编语句进行调用。
简而言之,这类混合编程的方法可以让高级语言与汇编语言互相取长补短,各自发挥各自优势,同时减少各自缺点所带来的不便,善用这个方法可以使开发和编程工作达到事半功倍的效果。
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
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 AX
PUSH BX
PUSH CX
PUSH DX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
RET
SetCursor EndP
; -------------------------------------
; 功能:键盘输入一个指定位数的十六进制数字,将其转换成二进制数
; 由于限定最大数据类型为字,所以,十六进制数字位数最多4位,最大无符号数:0FFFFH
; 约定:直接回车,视为数字0
; 入口:@@Hexadec=数字位数
; 出口:转换后的二进制数保存在AX寄存器中
Input_Hex Proc Near
push cx
push bx
mov cx,cs:@@Hexadec ;十六进制数位数
xor bx,bx ;十六进制数初值
@@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'?
jbe @@Convert_Bin ;是,转去转换成二进制数
jmp @@KBBack ;高于字母'F',重新输入
@@KB_Back: dec Cursor_Col
inc cx
@@KBBack: call SetCursor ;置光标位置
jmp @@Input_Hex
@@Convert_Bin: and al,0fh ;转换成二进制数
push cx
mov cx,4
shl bx,cl ;前面的数左移4位,实现乘16
or bl,al ;加上刚输入的数
pop cx
loop @@Input_Hex ;接受下一个数字
@@Return_Hex: mov ax,bx
pop bx
pop cx
ret
@@Hexadec dw ? ;数字位数
Input_Hex EndP
; -------------------------------------
Hex_Number dw 3 dup(?) ;
Prompt_Hex db 'Please input 4 bits hexadecimal number: $'
Temp_Cursor dw ? ;保存光标位置
Press_Key db 7,13,10,13,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
Output Prompt_Hex ;提示输入4位十六进制数
lea di,Hex_Number ;十六进制数存放地址
mov cs:@@Hexadec,4 ;十六进制数位数
mov cx,3
cld
Input_Data: call GetCursor ;取光标位置
mov ax,WORD PTR Cursor_Row
mov Temp_Cursor,ax ;保存光标位置
call Input_Hex ;键盘输入一个指定位数的十六进制数字,将其转换成二进制数
stosw ;保存
cmp cx,1 ;最后一个数?
jz @@Continue ;是,跳过显示逗号
mov ax,Temp_Cursor ;取光标位置
add ah,4 ;列号加4
mov WORD PTR Cursor_Row,ax
call SetCursor ;置光标位置
mov dl,','
call Output_Chr ;显示一个字符
@@Continue: loop Input_Data ;下一个十六进制数
call Output_CTLF ;输出一个回车、换行
mov ax,Hex_Number ;读入第一个数
mov dl,'0' ;假设三个数都不相等
cmp ax,Hex_Number[2] ;等于第二个数?
jnz Next_One ;不等,转去判断是否等于第三个数
inc dl ;相等,增值
mov ax,Hex_Number[2] ;读入第二个数
Next_One: cmp ax,Hex_Number[4] ;等于第三个数?
jnz $+4 ;不等,显示字符
inc dl ;相等,增值
call Output_Chr ;显示一个字符
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
申请内存
输入数字
设置一个变量,初始是0
将接收的数字分别写到3个申请的内存中,
然后分别比较,符合条件修改这个变量。
输出
回到DOS
什么是程序设计语言
什么是程序设计语言:程序设计语言是用于书写计算机程序的语言。计算机程序介绍如下:计算机程序(Computer Program),港、台译做电脑程式。计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。它以某些程序设计语言编写,运行于某种目标结构体系上。打个比方,程序就...
汇编语言程序设计步骤 有那几步
汇编语言程序设计步骤: 1、 分析问题,抽象出描述问题的数据模型 2、 确定问题的算法思想 3、 画出流程图或结构图 4、 分配存储器和工作单元(寄存器) 5、 逐条编写程序 6、 静态检查,上机调试 例:编程查找考生的最高分,假设所有考生分数已存入计算机内存。 1、 分析问题 根据条件、特点、规律 ...
什么是程序设计?
程序设计是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。任何设计活动都是在各种约束条件和相互矛盾的需求之间寻求一种平衡,程序设计也不例外。在计算机技术发展的...
程序设计语言通常有哪些?
程序设计语言通常分为:机器语言、汇编语言、高级语言三类。机器语言是最底层的语言,只有“0”和“1”,二进制语言,就像开关一样,0是关,1是通过。汇编语言指令是机器指令的符号化,与机器指令存在着直接的对应关系。高级语言面向用户的、基本上独立于计算机种类和结构的语言。高级语言的一个命令可以...
什么是程序设计和编程?
程序设计(Programming)是给出解决特定问题程序的过程,是软件构造活动中的重要组成部分。程序设计往往以某种程序设计语言为工具,给出这种语言下的程序。程序设计过程应当包括分析、设计、编码、测试、排错等不同阶段。专业的程序设计人员常被称为程序员。某种意义上,程序设计的出现甚至早于电子计算机的出现。...
c语言结构化程序设计的三种基本结构
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可...
程序设计语言一般可分为三类
程序设计语言分成了三大类,分别是机器语言,汇编语言和高级语言。1,机器语言 机器语言,顾名思义就是机器认识的语言,即这类语言或者其构成的程序可以直接被机器所识别的语言。这类语言是无需翻译的,其优点是较为直接,但缺点也非常明显——难以被人类所理解和记忆。2,汇编语言 汇编语言是第二代...
C语言程序设计课程讲什么内容?
C语言程序设计课程是入门级的程序设计课程,针对没有或很少具有编程经验的在职人员。课程通过学习C语言编程的基础语法,对程序设计有一个基本的认识,为后续计算机专业课程以及面向对象程序设计课程的学习打下基础。课程主要内容:C语言程序基本结构及相关概念、变量、函数、语句、if条件语句、switch条件语句、...
汇编语言程序设计的一般步骤是什么
一、 上机实验步骤注:以下步骤适用于除汇编语言程序设计的实验一到实验四外的所有实验(实验一到实验四仅使用TD.EXE)。1.确定源程序的存放目录建议源程序存放的目录名为ASM(或MASM),并放在C盘或D盘的根目录下。如果没有创建过此目录,请用如下方法创建:通过Windows的资源管理器找到C盘的根目录,在C盘的根目录窗口中...
C语言程序设计是什么?
什么是C语言?C语言的简介。C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛,不仅仅是在软件开发上,而且各类科研都需要用到C语言,具体...
俎宏今威:[答案] 汇编语言程序设计步骤:1、 分析问题,抽象出描述问题的数据模型 2、 确定问题的算法思想 3、 画出流程图或结构图 4、 分配存储器和工作单元(寄存器) 5、 逐条编写程序 6、 静态检查,上机调试 例:编程查找考生的最高分,假设所有考生分...
市中区19568328700: 简单介绍一下汇编语言程序设计 - ?
俎宏今威: 汇编比较好的书有:王爽老师《汇编语言》,杨季文老师的《80X86汇编语言程序设计》.看汇编不看保护模式的程序设计的话,汇编也就白学了,所以保护模式非常重要.当然这也是汇编一些应用的基础,比如软件解密,驱动的编写.有了好...
市中区19568328700: 汇编语言程序设计 - ?
俎宏今威: DEV C++下编译成功#include<stdio.h>#include<stdlib.h>#include<string.h> int zhuanhua(char num[]) { int j,i=0,sum=0; char *p,s[]="0123456789ABCDEF"; p=num; while(i<strlen(num)) { for(j=0;j<16;j++) { if(*p==s[j]) { sum=16*sum+j; p++; break; } }...
市中区19568328700: .汇编语言程序设计考题,一、判断题(5道小题,1、MASM汇编语言的注释用分号开始,无所谓英文分号、还是中文分号.(3分) 正确 错误 2、按照... - ?
俎宏今威:[答案] 一、判断题(5道小题,共15分) 1、MASM汇编语言的注释用分号开始,无所谓英文分号、还是中文分号.(3分) 错误 2、按照MASM语法编程时,可以将SHL作为8086指令的标号.(3分) 错误 3、指令“mov ax,ds:[100h]”中,若DS...
市中区19568328700: 汇编语言程序设计与计算机原理的区别 - ?
俎宏今威: 汇编语言程序设计这个课程重点讲述基于8086 8088CPU的汇编语言设计,偏重汇编软件的学习应用,由于汇编语言与硬件关系太密切,不得不带进计算机的硬件讲解,但重中之重还是软件; 计算机原理则是全方位的,硬件工作原理与软件工作原理兼顾,更全面些
市中区19568328700: 汇编语言程序设计 - ?
俎宏今威: ; 本程序通过编译,运行正确Code Segment Assume CS:Code,DS:Coden equ 8Start: mov cx,n cmp cx,1 ;n>1? ja Next ;是,阶乘 mov ax,1 ;n<=1,n!=1 jmp Exit_ProcNext: ...
市中区19568328700: 汇编语言程序设计的一般步骤是什么? - ?
俎宏今威: 汇编语言程序设计的基本步骤了解了汇编语言指令的功能和用法,了解了汇编语言程序的编写格式,就可以编制完整的汇编语言程序了.一个程序通常具有顺序、分支、循环和子程序4种结构形 式.顺序程序结构就是指完全按顺序逐条执行的...
市中区19568328700: 汇编语言程序设计题实现有符号数绝对值的加法运算设字节变量X和Y中存放的是16位有符号数,试编写程序实现|X|+|Y|结果送AL的计算 - ?
俎宏今威:[答案] mov ax,x test ah,0xF0 //是否为负数 jnz nz: not ax nz: mov dx,ax mov ax,y test ah,0xF0 ;是否为负数 jnz nz: not ax nz: add ax,dx ;高16位在dx,低16位在ax 把结果送入al是不行的
市中区19568328700: 汇编语言程序设计1?
俎宏今威: 汇编就是按ASCII读数的,直接排序,输出时好像是用int 9输出字符,汇编好多年没用了,自己找相关的书看看吧