汇编程序

汇编程序,第1张

题目名称:输入成绩,分别升序、降序排序

题目来源:http://zhidao.baidu.com/question/132061481.html

*** 作说明:成绩按百分制,输入成绩时,最多3位数,即100分滚野;小于100分的成绩,按回车确认

程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。

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

push ax

lea dx,Str_Addr

mov ah,9

int 21h

pop ax

EndM

------------------袜衫----大好喊---------------

功能:在当前光标位置显示一个字符

入口:dl=要显示的字符

Output_Chr proc Near

push ax

mov ah,2

int 21h

pop ax

ret

Output_Chr 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位的,空格结束输入。

由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536

约定:直接回车,视为数字0

入口:cs:@@Digits=数字位数;es:di=保存输入的数字首地址

cs:@@Type_Data=保存的数据类型,B=字节类型,W=字类型。

出口:转换后的二进制数保存在di所指的单元

Input_Dec Proc Near

push ds

push dx

push cx

push bx

push di

push cs

pop ds

call GetCursor 取光标位置

mov dx,WORD PTR Cursor_Row

mov @@Tmp_Cursor,dx 保存起始光标位置

lea di,@@Save_Tmp

push di

cld

mov cl,@@Digits

xor ch,ch

push cx

@@Input_Dec: call GetCursor 取光标位置

mov ah,1 从键盘接受一个字符

int 21h

cmp al,27 Esc?

jz @@Return

cmp al,CR 若键入的是回车,已经键入的数字不足N位

jz @@ASC_Dec 转去处理已经键入的数字

cmp al,KBBack

jz @@KB_Back 若是回空键,重新输入

cmp al,'0'

jb @@KBBack 若低于数字'0',重新输入

cmp al,'9'

ja @@KBBack 若高于数字'9',重新输入

jmp @@Save_Dig

@@KB_Back: cmp cl,cs:@@Digits 十进制数字位数

jz @@Input_Dec

inc cx

dec di

dec Cursor_Col

@@KBBack: call SetCursor 置光标位置

jmp @@Input_Dec

@@Save_Dig: and al,0fh 转换成二进制数

stosb 保存

loop @@Input_Dec 接受下一个数字

@@ASC_Dec: mov ax,cx

pop cx

pop si

sub cx,ax 实际输入的数字位数

xor bp,bp

xor dx,dx

xor ax,ax

jcxz @@Save_Ret 若直接回车,没有输入任何数字,按输入'0'处理

dec cx 实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数

jcxz @@One_Digit 若输入的数字只有一位,转去直接保存这个二进制数

mov bx,10

@@Mul_Ten: lodsb

xor ah,ah

add ax,bp

mul bx

mov bp,ax

loop @@Mul_Ten

@@One_Digit: lodsb

xor ah,ah

add ax,bp

@@Save_Ret: pop di

cmp @@Type_Data,'B' 字节类型?

jz $+5

stosw

jmp $+3

stosb

pop bx

pop cx

pop dx

pop ds

clc

ret

@@Return: pop cx

pop di

pop di

pop bx

pop cx

pop dx

pop ds

stc

ret

@@Tmp_Cursor dw ? 起始光标位置

@@Digits db ? 十进制数字位数

@@Type_Data db 'B' 保存的数据类型。B=字节类型,W=字类型

@@Save_Tmp db 7 dup(?)

Input_Dec EndP

-------------------------------------

功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示

入口:AX=二进制数

出口:在当前光标位置显示转换后的ASCII码数字

Unsi_Dec_ASCII Proc Near

push dx

push bx

push di

mov bx,10

lea di,@@Temp_Save[5]

mov BYTE PTR [di],'$'

dec di

cld

@@Divide: xor dx,dx

div bx

or dl,30h

mov [di],dl

dec di

test ax,ax

jnz @@Divide

inc di

push di

pop dx

mov ah,9

int 21h

pop di

pop bx

pop dx

ret

@@Temp_Save db 6 dup(?)

Unsi_Dec_ASCII EndP

-------------------------------------

Input_Score proc Near

mov @@Digits,3 十进制数字位数

mov @@Type_Data,'B' 保存的数据类型。B=字节类型,W=字类型

lea di,Buffer 成绩保存地址

Output Prompt_Str 提示输入成绩

@@Input_Scores:call Input_Dec 键盘输入一个指定位数(N)的十进制数字,将其转换成二进制数并保存在指定的内存单元

pushf

inc Cursor_Col

call Setcursor

mov dl,20h

call Output_Chr 显示一个空格

popf

jnc @@Input_Scores

mov cx,di

sub cx,offset Buffer 成绩个数

mov Counter,cx 保存

ret

Input_Score Endp

-------------------------------------

Increase_Sort proc Near

mov BYTE ptr @@Compare[5],76h

jmp @@Sorting

Increase_Sort Endp

-------------------------------------

Decrease_Sort proc Near

mov BYTE ptr @@Compare[5],73h

@@Sorting: lea si,Buffer

mov cx,Counter 成绩个数

dec cx 外循环次数

cld

@@Scanning: push cx 入栈保存外循环次数

push si 入栈保存数组地址

@@Compare: mov di,si 当前数组元素地址赋给目的变址寄存器,以备交换之用

lodsb 将当前数组元素读入累加器

cmp al,[si] 当前数组元素与相邻的下一个数组元素相比较

jae @@NextOne 若大于或等于,不作数据交换,处理下一个数组元素

xchg al,[si] 若小于,交换数组元素

stosb 保存数值较小者

@@NextOne: loop @@Compare 处理下一个数组元素

pop si 数组地址出栈

pop cx 外循环次数出栈

loop @@Scanning 下一趟比较

mov WORD ptr Cursor_Row,12

call SetCursor 置光标位置

lea si,Buffer

mov cx,Counter 成绩个数

@@List_Scores: lodsb

xor ah,ah

call Unsi_Dec_ASCII 把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示

mov dl,20h

call Output_Chr 显示一个空格

loop @@List_Scores

ret

Decrease_Sort Endp

-------------------------------------

Prompt_Menu db 35 dup(20h),'Main Menu',13,10

db 30 dup(20h),201,18 dup(205),187,13,10

db 30 dup(20h),186,' 1. input scores ',186,13,10

db 30 dup(20h),186,' 2. increase sort ',186,13,10

db 30 dup(20h),186,' 3. decrease sort ',186,13,10

db 30 dup(20h),186,' 0. Return to DOS ',186,13,10

db 30 dup(20h),200,18 dup(205),188,13,10

db 32 dup(20h),'Choice(0-3):$'

Cursor_Tmp dw ?

Counter dw ? 成绩个数

Proc_Addr dw Input_Score,Increase_Sort,Decrease_Sort

Prompt_Str db13,10,10,'Please input scores:',13,10,'$'

Press_Key db7,13,12 dup(10),'The complated. Press any key to exit...$'

Start:push cs

pop ds 使数据段与代码段同段

mov ax,3 设置25*80字符显示方式

int 10h

Output Prompt_Menu 显示主菜单

xor bx,bx

mov ah,3

int 10h

mov Cursor_Tmp,dx

mov ax,0b800h

mov es,ax 设置字符显示方式缓冲区段地址

mov di,35*2+1

mov al,13 LightMagenta

mov cx,10

cld

Attribute: stosb

inc di

loop Attribute

mov di,160*2+32*2+1

stosb

add di,159

stosb

add di,159

stosb

add di,159

stosb

mov di,160*7+39*2+1

stosb

inc di

stosb

inc di

stosb

push cs

pop es 使附加段与代码段同段

Choice_Func: mov dx,Cursor_Tmp

xor bx,bx

mov ah,2

int 10h

mov ah,1

int 21h

cmp al,'0'

jz Exit_Proc

cmp al,'1'

jb Choice_Func

cmp al,'3'

ja Choice_Func

and ax,0fh

mov bx,ax

dec bx

shl bx,1

call Proc_Addr[bx]

jmp Choice_Func

-------------------------------------

Exit_Proc: Output Press_Key 提示 *** 作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch 结束程序

int 21h

Buffer db ? 数据缓冲区

Code ENDS

END Start 编译到此结束

1、汇编程序

汇编语言书写闷念的程序翻译成与之等价的机器语言程序的翻译程序。汇编程序输入的是用汇编语言中燃书写的源程序,输出的是用机器语言表示的目标程序。汇编语言是为特定计算机或计算机系列设计的一种面向机器的语言,由汇编执行指令和汇编伪指令组成。

采用汇编语言编写程序虽不如高级程序设计语言简便、直观,但是汇编出的目标程序占用内存较少、运行效率较高,且能直接引用计算机的各种设备资源。它通常用于编写系统的核心部分程序,或编写需要耗费大量运行时间和实时性要求较高的程序段。

2、解释程序

解释程序是一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行用户程序时,它直接执行源程序或源程序的内部形式(中间代码)。因此,解释程序并不产生目标程序,这是它和编译程序的主要区别。

3、编译程序

编译程序也称为编译器,是指把用高级程序设计语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。

它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下卖罩虚运行,加工初始数据,算出所需的计算结果。

扩展资料:

工作过程

1、汇编程序

输入汇编语言源程序。检查语法的正确性,如果正确,则将源程序翻译成等价的二进制或浮动二进制的机器语言程序,并根据用户的需要输出源程序和目标程序的对照清单;如果语法有错,则输出错误信息,指明错误的部位、类型和编号。最后,对已汇编出的目标程序进行善后处理。

2、解释程序

由总控程序完成初始化工作。依次从源程序中取出一条语句进行语法检查,如有错,输出错误信息;如果通过了语法检查,则根据语句翻泽成相应的指令并执行它。检查源程序是否已经全部解释执行完毕,如果未完成则继续解释并执行下一条语句,直到全部语句都处理完毕。

3、编译程序

先进行词法分析与语法分析,然后生成中间代码,接着对程序进行多种等价变换来代码优化,最后生成目标代码。

参考资料来源:百度百科—汇编程序

参考资料来源:百度百科—解释程序

参考资料来源:百度百科—编译程序

问题一:什么是汇编语言? 计算机程序设计语言的发展,经历手消态了从机器语言、汇编语毕源言到高级语言的历程。

1. 机器语言

电子计算机所使用的是由“0”和“1”组成的二进制数,二进制是计算机的语言的基础。计算机发明之初,人们只能降贵纡尊,用计算机的语言去命令计算机干这干那,一句话,就是写出一串串由“0”和“1”组成的指令序列交由计算机执行,这种语言,就是机器语言。使用机器语言是十分痛苦的,特别是在程序有错需要修改时,更是如此。而且,由于每台计算机的指令系统往往各不相同,所以,在一台计算机上执行的程序,要想在另一台计算机上执行,必须另编程序,造成了重复工作。但由于使用的是针对特定型号计算机的语言,故而运算效率是所有语言中最高的。机器语言,是第一代计算机语言。

2. 汇编语言

为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“A D D”代表加法,“M O V”代表数据传递等等,这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语言,即第二代计算机语言。然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序。

汇编语言同样十分依赖于机器硬件,移植性不好,但效率仍十分高,针对计算机特定硬件而编制的汇编语言程序,能准确发挥计算机硬件的功能和特长,桥裤程序精炼而质量高,所以至今仍是一种常用而强有力的软件开发工具。

3. 高级语言

从最初与计算机交流的痛苦经历中,人们意识到,应该设计一种这样的语言,这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能在所有机器上通用。经过努力,1 9 5 4年,第一个完全脱离机器硬件的高级语言―F O RT R A N问世了,4 0多年来,共有几百种高级语言出现,有重要意义的有几十种,影响较大、使用较普遍的有F O RT R A N、A L G O L、C O B O L、B A S I C、L I S P、S N O B O L、P L / 1、P a s c a l、C、P R O L O G、A d a、C + +、V C、V B、D e l p h i、J AVA 等。

高级语言的发展也经历了从早期语言到结构化程序设计语言,从面向过程到非过程化程序语言的过程。相应地,软件的开发也由最初的个体手工作坊式的封闭式生产,发展为产业化、流水线式的工业化生产。

6 0年代中后期,软件越来越多,规模越来越大,而软件的生产基本上是人自为战,缺乏科学规范的系统规划与测试、评估标准,其恶果是大批耗费巨资建立起来的软件系统,由于含有错误而无法使用,甚至带来巨大损失,软件给人的感觉是越来越不可靠,以致几乎没有不出错的软件。这一切,极大地震动了计算机界,史称“软件危机”。人们认识到:大型程序的编制不同于写小程序,它应该是一项新的技术,应该像处理工程一样处理软件研制的全过程。程序的设计应易于保证正确性,也便于验证正确性。1 9 6 9年,提出了结构化程序设计方法,1 9 7 0年,第一个结构化程序设计语言―P a s c a l语言出现,标志着结构化程序设计时期的开始。

8 0年代初开始,在软件设计思想上,又产生了一次革命,其成果就是面向对象的程序设计。在此之前的高级语言,几乎都是面向过程的,程序的执行是流水线似的,在一个模块被执行完成前,人们不能干别的事,也无法动态地改变程序的执行方向。这和人们日常处理事物的......>>

问题二:什么是汇编语言 汇编语言它是计算机语言,计算机语言说通俗点就是人类与计算机(CPU)沟通的桥梁,计算机它不认识人类的语言,听不懂也读不懂,要让计算机替我们去完成我们的工作,就需要我们将要交给计算机完成的任务翻译为计算机语言。汇编语言是各种语言中的一种,它属于低级的计算机语言,这是相对于面向过程的C语言,以及面向对象的C++,java而言。它是除机器语言以外最接近硬件的计算机语言,而且可以通过学习汇编语言深入的了解 *** 作系统的底层运行机制,并以CPU的角度思考问题。这样可以让你在编写高级语言的程序的时候避免很多错误,并且能更深入理解高级语言的执行 原理。因为汇编语言属于低级语言,所以既然低级就肯定不容易被普通用户认识,这需要一定的硬件基础知识和一些计算机工作原理的知识。以前在大学阶段学过汇编语言,但没有当回事儿,连作业都是复制加粘贴完成的(像这样的不在少数吧:))。工作以后才发现这个语言是个好东西,它其实是个非常重要的基础课程。所以现在有时间就把书打开多看一点,学一点。汇编语言目前常见的有两种:一个是基于8086/88架构的DOS下的16位汇编语言,还有就是基于80386架构及其以后型号的windows下32位汇编语言。我不知道linux下有没有汇编语言。顺便说一下,不管什么汇编语言它所编出来的程序都属于软件,所以不管什么软件都需要依赖 *** 作系统这个基础平台,它才可以被硬件CPU所执行,因为 *** 作系统就是提供硬件与用户之间的接口,所有软件都要通过它来分配到硬件资源(不知道对不对哈:)才可以被执行)。一般先学习16位的DOS汇编,然后再学32位的windows汇编。所以我们先谈谈16位的DOS汇编哈。要学汇编语言首先就是要了解CPU,你只有了解了CPU才能了解汇编语言的执行,因为它基本就是直接在 *** 作CPU的各个组成单元(像寄存器)。在 *** 上找了这个图,如下:上面这个CPU的逻辑结构图是8088的,8088和8086大的架构差不多,所以就以这个为例介绍下各个组成部分的作用。主寄存器:AX(AH,AL)累加寄存器,一般用作暂存数据;BX(BH,BL)基址寄存器,一般用作偏移地址存放;CX(CH,CL)计数寄存器,一般用在循环控制次数;DX(DH,DL)数据寄存器,好像和AX差不多吧;SP堆栈指针寄存器,栈指针;BP基址指针寄存器,可作SP使用;SI源变址寄存器和DI目的变址寄存器,这两个做为BX扩展用于偏移地址存放。段寄存器: CS:代码段寄存器,任何一个程序都是从代码段开始执行的,CS寄存器指明了代码段的段地址。DS:数据段寄存器,存放程序中数据部分的段地址。SS:堆栈段寄存器,堆栈是内存中特殊的内存块,堆与栈不同,目前我只知道栈是尊循“先进后出,后进先出”的原则而使用。ES:附加段寄存器,应该是作为DS数据段寄存器的扩充吧。地址加法器: 这是用在对内存寻址时所使用,它通过将段寄存器中的段地址与BX、SI、DI等寄存器中的偏移地址作一定处理从而输出物理地址,然后就可以访问内存单元了。汇编程序中的地址只是逻辑地址,并不是真实的内存上的地址。在程序实际运行时每次访问内存都会先将逻辑地址转换成物理地址才可以访问到物理内存。关于CPU寻址,逻辑地址,物理地址我也会再写篇文章来讨论。逻辑运算单元和控制单元:这是CPU最核心的单元,我们暂只记住它们是负责执行与控制就好了。内部数据,地址总线:CPU内部各部件之间通信的通道。外部地址总线:用来传输CPU想要读取/写入内存单元的物理地址。它的宽度就决定了CPU能够访问的内存的最大容量。外部数据和控制总......>>

问题三:简述用汇编语言进行程序设计的步骤。 汇编语言程序设计步骤:

(1)分析问题:已知条件、要解决的问题、功能/性能要求等。

(2)建立数学模型:把问题数学化、公式化,便于计算机处理。

(3)确定算法:简单、速度快、精度高、代码量小、编程容易。

(4)绘制程序流程图:用箭头、框图、菱形图等表示程序结构。

(5)内存空间分配:为程序或数据分配内存空间。

(6)编制程序与静态检查:程序结构层次简单、清楚、易懂。

(7)程序调试:利用调试软件DEBUG进行调试。

问题四:1、汇编程序与汇编语言源程序的区别? 汇编程序是汇编语言源程序经过编译后的结果

用标号是为了标记程序段,内存段,跳转位置等等

loop p ov add1可以

问题五:编程语言和汇编语言有什么区别啊 计算机语言从低级到高级可以分为:

机器语言,即由0、1组成的机器硬件可以识别的语言;

低级语言,即汇编语言

中级语言,如C语言

高级语言,如C++,JAVA,C#等。

汇编语言是将由0、1组成的机器语言用具有简单语义的英文代码表示,以便于理解和程序员编程。汇编语言通常用于对硬件的直接 *** 控。由于汇编语言编写的程序很小,所以通常在程序中最核心的、控制硬件的代码可以采用汇编语言编写,一方面是安全,另一方面提高运行速度。

对于计算机的初学者,应该从中高级语言学起,如c语言,vb,java等,如果你是想要学习如何编程,学习一到两门高级语言已经够用了。

如果你已经掌握了基本的编程技能,最好是可以学习数据结构和 *** 作系统以及计算机硬件的基本工作原理,以便优化你编写的程序,提高安全性和运行效率。

如果你想要从事更高级的开发工作,则可能需要学习汇编语言。

在高校中,计算机科技专业的学生汇编语言是必修课,而软件工程专业的学生则对汇编语言不做要求。

至于汇编与编程的区别是显而易见的,汇编语言是一种用于编写某些程序的语言。而编程则是程序员用某种语言编写程序的过程。

问题六:汇编语言是什么扩展名 .ASM的扩展名

问题七:汇编语言程序的开发有哪4个步骤 编辑:使用记事本,生成:*.ASM 文件。 编译:使用 MASM.EXE ,生成:*.OBJ 文件。 连接:使用 LINK.EXE,生成:*.EXE 文件。 执行:使用 *.EXE 文件。

问题八:汇编语言子程序是如何定义的? 直接jmp跳转过去,然后ret回来。

call xxx

xxx proc uses eax,esi,edi,var:ddword......

xxx endp

也可以带参数的。第二种方式格式就是这样,说白了也是jmp跳转。只是经过了编译器优化。防止程序员跳转,导致堆栈前后不对齐。

问题九:汇编语言有什么特点 汇编语言的总体特点1.机器相关性

这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。

2.高速度和高效率

汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。

3.编写和调试的复杂性

由于是直接控制硬件,且简单的任务也需要很多汇编语言语句,因此在进行程序设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源。这样,就不可避免地加重了程序员的负担。与此相同,在程序调试时,一旦程序的运行出了问题,就很难发现。

优点

1、因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源。

2、目标代码简短,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分广泛。

缺点

1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。不同的处理器有不同的汇编语言语法和编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性;

2、难于从汇编语言代码上理解程序设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试;

3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开发效率很低,周期长且单调。

问题十:微程序和汇编语言的区别是什么。 5分 微代码和汇编都是低级语言,但是微代码比汇编更底层。微代码和汇编都和硬件有着紧密的联系,但是对于同一产品系列的不同代产品来说,汇编可以完全相同,微代码可能有着巨大的区别,因为微代码是完全依赖于芯片内部的硬件连接。

对于同样一句C语言,在不同的处理器上会生成不同的汇编语言。每一条汇编语言的执行时间也许是一个或者两个时钟周期,甚至更多。微代码和汇编的关系,就像C 与汇编的关系,也就是说一条汇编也许会生成一条或多条微代码。所谓微代码,或者微指令,是处理器内部最小的 *** 作原语,控制着诸如门电路(gates)开关等专门动作,和组成一条指令的微 *** 作的序列。例如,对于一个加法ADD的简单动作,微代码可以决定接受哪两个寄存器或总线为输入,输出到什么总线或者寄存器里,标志寄存器要保存还是丢弃,根据条件进行跳转或者直接执行下一条微代码。一个内部只有8位宽的数据总线完全可以支持32位整数的汇编 *** 作,就是因为有微代码。

微代码原来只是用来开发计算机的逻辑控制。古老的CPU往往都是“硬连线”,每个机器指令(加法,移动)都是由电路实现,虽然有着高性能的优点,但随着指令复杂度的增长,也带来了研发和DEBUG的困难,以及电路的复杂性。微代码的出现让CPU的设计者可以通过写一个微程序的方式来实现一条机器指令,而不是设计电路来实现它。在将来的开发设计过程中,微代码可以很容易地改变,硬件电路却不可更改,否则带来的将是巨大的商业损失。这种灵活的CPU设计导致了今天日益复杂的指令集。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存