文档库 最新最全的文档下载
当前位置:文档库 › DSP28335汇编教程

DSP28335汇编教程

DSP28335汇编教程
DSP28335汇编教程

DSP28335汇编教程

当硬件执行指令时,寻找指令所指定的参与运算飞操作数的方式——寻址方式。根据程序的要求采用不同的寻址方式,可以有效地缩短程序的运行时间和提高代码执行效率。汇编指令是可执行指令,每一条指令对应一条机器码,用来控制处理器仲的执行部分进行各种操作。在本章节当中将主要以基于C28x的DSP芯片为例,为读者讲解DSP的寻址方式和汇编指令系统,其中大部分内容也可适用于其他Ti公司的DSP产品。

6.1汇编语言指令集概述

在学习C28x系列DSP的寻址方式和汇编指令指令之前,先来对一些基础的知识进行讲解一下先,在汇编程序当中开发人员会常常使用到许多的特殊符号和标志,它们都具有特殊的含义,在学习汇编之前读者们必须先理解这些符号和标志含义,在这里会对其中最常用最重要的操作数符号和寄存器经行详细说明。

在进行汇编讲解之前先来了解一下开发的核心——CPU。在TMS320C2000系列中,CPU 内核为:

C20x/C24x/C240x:C2xLP:

C27x/C28x:C27x、C28x

这些CPU的硬件结构有一定差别,指令集也不相同,但是,在C28x芯片中可以通过选择兼容特性模式,使C28xCPU与C27xCPU及C2xLPCPU具有最佳兼容性。可通过状寄存器STl的位OBJMODE和位AMODE的组合,选定模式。

C28x芯片具有3种操作模式:

1.C28x模式:在该模式中,用户可以使用C28x的所有有效特性、寻址方式和指令系统,

因此,一般应使C28x芯片工作于该种模式。

2.C27x目标——兼容模式:在复位时,C28x的CPU处于C27x目标-兼容模式。在该模式

下,目标码与C27xCPU完全兼容,且它的循环—计数也与C27xCPU兼容。

3.C2xLP源——兼容模式:该模式允许用户运行C2xLP的源代码,这些源代码是用C28x

代码生成工具编译生成的。

在下面的讲解当中会牵涉到模式的转换,希望读者要搞清楚每一个模式的对应关系。

本节假设条件为芯片工作于C28x模式(OBJMODE=1,AMODE=0)。复位后,通过执行指令C28OBJ或者SETC OBJMODE将ST1中的OBJMODE位置1,芯片即可工作于C28x模式。

6.1.1 DSP中的操作数

汇编语言离不开操作符和操作数,操作符可以认为就是CPU的指令或者编译器上的伪指令,操作数是指令执行过程中的参与者,也可以说操作数就是指令所控制的对象。

如表6-1,表6-2和表6-3对指令中常用到的一些操作数符号进行说明

在应用程序的开发过程当中少不了的就是算术运算还有比较运算,当然在汇编语言编程的时候也是一样的,在汇编语言当中进行算术运算的操作并不像C/C++那样直观、方便,需

要掌握众多的助记符才行,接下来会通过表6-2来说明一下关于算术方面的助记符以及与其

表6-2影响指令的判断条件的说明

在汇编程序当中实现乘法操作时一件非常不简单的事,由于是属于纯寄存器操作,因此,开发人员需要准备保存乘法结果的地址,在表6-1当中讲解操作数符号的时候有一个关于乘

表6-3 PM与结果保存方式的关系

6.1.2汇编语法指令描述

前一小节提到过,汇编指令一般都由操作符和操作数组成,操作符也被称为指令助记符,它是指令中的关键字,表示本条指令操作类型,不能省略。操作数可以省略,也可以有很多,但各操作数之间要用“,”分开。指令助记符与操作数之间要用空格分开。

ARn:

n为数值0~7,ARn指定下次的辅助寄存器。

ind:

选择一下7种符号之一:*,*+,*-,*0+,*0-,*BR0+,*BR0-(兼容模式使用)。

#:立即寻址方式中常用的前缀。数值前面带“#”,表示该数值为一个立即数。

<<左移。

>>右移。

@:

当使用C28x语法时,64位字段数据与通过“@”符号来表示,一帮组程序员理解当前正在使用哪种寻址模式。

@@:

当使用C28x语法时,128位字段数据页通过“@@”符号来表示。

loc16:16位寻址方式指定地址单元的内容。

loc32:32位寻址方式指定地址单元的内容。

#16bitsigned:16位有符号立即数。

6.2寻址方式

通过6.1节当中读者们应当对汇编语言编程有了一定的了解,仅仅了解了汇编语言的操作符还是不过的,接下来就从汇编语言最根本的开始学习——寻址方式寻址方式就是寻找操作数或者操作数地址的方式,在存储器中,操作数或指令字写入或读出的方式,有地址指定方式、相联存储方式或堆栈存取方式。几乎所有的计算机,在内存中都采用地址指定方式。当采用地址指定方式时,形成操作数或指令地址的方式称为寻址方式。C28x系列DSP的指令集采用7种寻址方式:

1.直接寻址方式:DP(数据页指针),在此方式中,16位的DP寄存器被当做一个固定的

页指针,讲指令中提供6未或者7位的地址偏移量与DP寄存器中的值组合起来就构成完整的地址。当访问具有固定地址的数据结构时,这种寻址方式特别有用,例如,外设寄存器和C/C++中的全局及静态变量。

2.堆栈寻址方式:SP(堆栈指针),在这种方式下,16位的SP指针被用来访问软件堆栈

的内容。C28x系列的堆栈是从低端地址想高端地址生长的,SP总是指向下一个空的存储单元。当需要访问堆栈中的数据时,SP的值减去指令仲提供的6位偏移量作为被访问数据的地址和,而堆栈指针将在入栈后加1,出栈前减1.

3.间接寻址方式:XAR0到XAR7(辅助寄存器指针),在该方式下,32位的XARn寄存器被

当做一般的数据指针来使用个。通过相应的指令可以实现操作后XARn加1、操作前/后减1,还可以配合3位偏移量或者其他16位寄存器实现变址寻址。

4.寄存器寻址方式:这种方式下,另一个寄存器可以是该次访问的资源或者目的操作数。

这样在C28x中既能实现寄存器到寄存器的操作。

5.数据/程序/IO空间寻址方式:在这种方式下,存储器中操作数的地址被包含在指令中。

6.程序空间间接寻址方式:某些指令可以通过指针来访问位于程序空间中的存储器操作

数。由于在C28xCPU中存储器是统一寻址的,所以单周期内可以读取两个操作数。

7.字节寻址方式:该方式能访问到股东地址单元的最低有效位和最高有效位。

提示:

对于基于C28x的DSP芯片来说,以上的7种寻址方式仲出了IO空间寻址方式外其他

的都支持。

C28x的大多数指令都是利用操作符中的8位字段来选择寻址方式和对寻址方式进行修改.在C28x的指令系统中,这个8位字段用于以下寻址方式:

1.loc16:为16位数据访问选择直接/堆栈/间接/寄存器寻址方式。

[loc16]表示loc16这种寻址方式对应的16位数据。

2.loc32:为32位数据访问选择直接/堆栈/间接/寄存器寻址方式。

[loc32]表示loc32这种寻址方式对应的32位数据。

在直接寻址方式下,loc16/loc32指的是一个用标号表示的地址,这个地址由16位的DP寄存器和操作码内8位字段的6位或7位偏移量共同决定。[loc16]/[loc32]表示这个地址对应的16/32位数据。以上7种寻址方式都与“loc16/loc32”组合起来使用。

在间接寻址方式下,loc16/loc32表示放在辅助寄存器(XAR0~XAR7)中的一个地址,[loc16]/[loc32]表示这个地址对应的16/32位数据。

在堆栈寻址方式下,loc16/loc32表示堆栈指针指向的一个堆栈单元,[loc16]/[loc32]表示这个单元内的16/32位数据。

在寄存寻址方式下, loc16/loc32表示一个16位或32位寄存器(如ACC、P、XT、AH 等), [loc16]/[loc32]表示这些寄存器内的16/32位数据。

由于C28x提供了多种寻址方式,因此用寻址方式选择位(AMODE)来选择8位字段(loc16/loc32)的解码。该位属于状态寄存器ST1。寻址方式可以大致归类如下:

(1)AMODE=0——该方式是复位后的默认方式,也是C28x的C/C++编译器使用的方式。这种方式与C2xLP CPU的寻址方式不完全兼容。数据页指针偏移量是6位(在C2xLP CPU 中是7位),并且不支持所有的间接寻址方式。

(2)AMODE=1——该方式包括的寻址方式完全与C2xLP 器件的寻址方式兼容。数据页指针的偏移量是7位并支持所有C2xLP 支持的间接寻址方式。

编译器总是假定AMODE=0,所以它只使用对AMODE=0有效的寻址模式。而汇编器可以通过设置命令行选项实现默认AMODE=0或者AMODE=1。

v28:假定AMODE=0(C28x寻址方式)

v28 – m20:假定AMODE=1(与C2xLP全兼容的寻址方式)

在文件中使用内嵌伪指令:

. c28_amode :告诉汇编器后面的代码段都假定AMODE=0(C28x寻址方式)

. lp_amode :告诉汇编器后面的代码段都假定AMODE=1(与C2xLP全兼容的寻址方式)

6-4。

表6-4 loc16/loc32的寻址方式

6.2.1直接寻址方式

指令字中包含数据存储器的7位便宜地址与基地址构成16位数据存储器地址,基地址由数据页指针DP或堆栈指针SP提供,具体由ST1的CPL决定。64K数据存储器包含512个数据页指针DP,DP的范围记为0~511.状态寄存器ST0内的第9位数据指针中的值来确定当前数据页。具体的直接寻址方式如图6-1所示。

15~8位7位6~0位

图6-1直接寻址方式

表6-5直接寻址方式下loc16/loc32的语法说明

假设需要访问数据空间地址0000105DH:

(1)AMODE=0:

使用直接寻址方式访问数据存储器时,必须首先对DP进行设置以确定数据页面,然后再书写进行某种操作的指令,该指令的操作数将确定数据页面内部的特定偏移单元。其步骤如下:

1. 设置数据页面将当前数据页面载入DP。

MOVW DP,#0041H ;初始化数据页面指针

2. 设置偏移量

给出6位偏移量作为指令的一个操作数。

ADD AL,@1Dh ; AL与当前数据页面内偏移1DH单元的内容相加,结果存入到AL中

如图6-2所示直接寻址下AMODE为0的地址分配

16bit6bit

图6-2直接寻址下AMODE为0的地址分配

(1)AMODE=1:

1选择兼容选址模式

SETC AMODE ;令AMODE=1

.lp_amode ;通知编译器AMODE=1

2设置数据页面

讲当前数据页面载入DP

MOVW DP,#0040H ;初始化数据页面指针

3设置偏移量

给出7位偏移量作为指令的一个操作数。

ADD AL,@@5Dh ;AL与当前数据页面内偏移量5DH单元的内容相加,结果存入到AL中

如图6-3所示直接寻址下AMODE为1的地址分配。

15bit7bit

图6-3直接寻址下AMODE为1的地址分配

6.2.2堆栈寻址方式

在堆栈寻址方式下,16位的SP指针被用于访问软件堆栈的信息。C28x的堆栈从存储器的低地址变化到高地址(小端方式),SP指针总是指向下一个空单元.当需要访问堆栈中的数据时,由程序提供6位偏移量,SP的值减去这6位的偏移量就是被访问的数据的地址,然后修改堆栈指针,堆栈寻址方式下loc16/loc32的语法说明见表6-6所示。

表6-6堆栈寻址方式下loc16/loc32的语法说明

下面的例子是带偏移量的堆栈寻址方式访问对栈区16/32数据,当AMODE=0时:

ADD AL,*-SP[5] ;将(SP-5)指向堆栈单元的16位内容加到AL;

MOV *-SP[8],AL ;将AL中的16位内容存入(SP-8)指向的堆栈单元

ADDL ACC,*-SP[12] ;将(SP-12)指向的堆栈单元的32位内容加到ACC

MOVL *-SP[34],ACC ;讲讲ACC中的32位内容存入(SP-34)指向的堆栈单元

下面的例子是利用堆栈寻址方式递增访问堆栈区16/32为数据:

MOV *SP++,AL ;将16位AL寄存器的值压入栈顶,且SP=SP+1

MOVL *SP++,P ;将32位P寄存器的值压入栈顶,且SPSP+2

最后通过例子来讲解一下通过堆栈寻址方式递减访问堆栈区16/32数据:

ADD AL,*--SP ;SP=SP-1,再把新SP指向的16位堆栈的内容加到AL中

MOVL ACC,*--SP ;SP=SP-2,再把新的SP指向的32位堆栈内容移到ACC中

6.2.3间接寻址方式

间接寻址方式的基本概念是指CPU对操作数读写时,通过辅助寄存器中存放的地址访问操作数。

逻辑上来讲是在间接寻址方式下,32位的XARn(辅助寄存器)被当做是一般性数据指针。其内容是操作数所在数据存储器的32位地址,CPU通过这个地址来取操作数。可以通过指令实现对辅助寄存器XARn加1加2、减1减2和变址操作(操作前/后),C28x的间接寻址方式(XAR0~XAR7)。

例如指令:MOVL ACC,*XAR2++;假设XAR2的值位0x80100h,内容地址0x80100的存储单元内容位1234h,0x80101的内容位5678h,执行这条指令后,ACC=56781234h,XAR2=80102h。

在物理上来看间接寻址方式下执行指令: MOVL ACC,*XAR2++,地址和数据通过寄存器和总线传送,当CPU将这条指令从程序空间读出并译码后,AEAU把XAR2中存放的地址0x00080100发送到DRAB上,然后CPU通过DRDB把内存单元数据56781234h读到数据缓冲寄存器,在发送操作数总线上(至此寻址过程结束),ALU读取DRDB的数据,经过处理后发送结果到结果总线,然后放入ACC中。间接寻址方式的loc16/loc32语法说明见表6-7所示。

表6-7 C28x的间接寻址方式下的loc16/loc32的语法说明几乎所有的处理器都具有间接寻址方式(只是使用数据指针寄存器不同而已),如F2812读/写操作数。

6.2.4寄存器寻址方式

在该寻址方式下,寄存器可以是访问的源操作数,也可以是目标操作数,这样在C28x 中就能实现寄存器到寄存器的操作.这一方式包括对32位和16位寄存器的寻址。寄存器寻址方式说明见表6-8所示。

下面通过以下简单的例子来说明一下在汇编程序当中的寄存器寻址的相关操作。

1、ACC寄存器寻址32位数据

MOVL XAR6,@ACC ;将ACC的内容装入到XAR6

MOVL @ACC,XT ;将XT寄存器的内容装入到ACC

ADDL ACC,@ACC ;ACC=ACC+ACC

2、P寄存器寻址32位数据

MOVL XAR6,@P ;将P的内容装入到XAR6

MOVL @P,XT ;将XT寄存器的内容装入P

ADDL ACC,@P ;ACC+ACC+P

3、AX寄存器寻址16位数据

MOV PH,@AL ;将AL的内容装入到PH

ADD AH,@AL ;AH=AH+AL

MOV T,@AL ;将AL的内容装入T

6.2.5数据/程序/IO空间立即寻址方式

在该寻址方式下,存储器操作的地址就存在指令中。数据/程序/IO空间立即寻址方式的说明见表6-9所示。

表6-9数据/程序/IO空间立即寻址方式下的指令语法说明

6.2.6程序空间间接寻址方式

某些指令可以通过使用间接指针对程序空间中的存储器进行访问。因为C28xCPU的存储器是标准一致的,使用的是统一寻址,这就使在一个机器周期中进行两次读操作成为可能。

6.2.7字节寻址方式

字节寻址的例子如下:

MOV AX.LSB,loc16 ;若(地址方式=*+XARn[AR0/AR1/3bit])

;若(偏移量=偶数值),AX.LSB=[loc16].LSB,AX.MSB=0x00

;若(偏移量=奇数值),AX.LSB=[loc16].MSB,AX.MSB=0x00

;否则,AX.LSB=[loc16].LSB,AX.MSB=0x00

MOVB AX.MSB,loc16 ;若(地址方式=*+XARn[AR0/AR1/3bit])

;若(偏移量=偶数值),AX.LSB=原值,AX.MSB= [loc16].LSB

;若(偏移量=奇数值),AX.LSB=原值,AX.MSB=[loc16].MSB

;否则,AX.LSB=[loc16].LSB,AX.MSB=[loc16].LSB

6.3 C28x汇编操作指令

在C28x系列的DSP当中有超过150条的汇编指令,按照功能来分可分位15类,接下来通过表格的方式向读者解释一下最常用的指令。

1.对辅助寄存器(XAR0~XAR7)的操作

CPU提供了8个32位的辅助寄存器:XAR0、XAR1、XAR2、XAR3、XAR4、XAR5、XAR6和XAR7。可以作为地址指针指向存储器,或者作为通用目的寄存器来使用。许多指令可以访问

XAR0~XAR7的低16位,其中,辅助寄存器的低16位为AR0~AR7,它们用作循环控制和

16

位比较的通用目的寄存器。当访问AR0~AR7时,寄存器的高16位(AR0H~AR7H)可能改变或者不改变,着主要取决于所应用的指令。AR0H~AR7H只能作为XAR0~XAR7的一部分来读取,不能单独进行访问。具体操作看表6-12。

表6-12对寄存器XARn的操作说明

2.对数据页指针(DP)的操作

在直接寻址方式中,对数据存储器的寻址要在64个字(即一个页面为64个字)的数据页中进行。由低4M字节的数据存储器组成65536个数据也,用0-65535进行标号。在DP 直接寻址方式下,16位的数据页指针(DP)包含了目前的数据页数。可以通过DP通过给DP

表6-13对DP寄存器操作的说明

3.对堆栈指针SP的操作

堆栈指针(SP)允许在数据存储器中使用软件堆栈。堆栈指针为16位,可以对数据空间的低64K进行寻址。当使用SP时,将32位地址的高16位置为0。复位后SP指向地址00000400h。堆栈操作说明如下:

1.栈从低地址向高地址增长。

2.P总是指向堆栈中的下一个区域。

3.SP被初始化,它指向地址00000400h。

4.将32位数值存入堆栈时,先存入低16位,然后将高16位存入下一个高地址中。

5.当读取32位的数值时,C28x系列的CPU期望存储器或外设接口逻辑把读写排成偶地址。例如,如果SP包含一个奇数地址00000083h,那么,进行一个32位的读操作时,将从地址00000082h和00000083h中读取数值。

6.如果增加SP的值。如果他超过FFFFh,或者减少SP的值,使它低于0000h开始计数。例如,如果SP=FFFFh而一个指令又想SP加3,啫结果是0001h。当减少SP的值使它达到0000h,它就会重新从FFFFh计数。例如,如果SP=0002h而一个指令又从SP减4,则结果就是FFFFh。7当数值存入堆栈是,SP并不要求排成奇数或者偶数地址。排列由存储器或者外设接口逻辑完成。具体的语法操作说明看表6-14。

4.对AX寄存器的操作

在汇编语言程序中,累加器——AX是一个非常重要的寄存器,但在程序中用它来保存临时数据时,最好将其转存到其它寄存器或内存单元中,以防止在其它指令的执行过程中使其中的数据被修改,从而得到不正确的结果,为程序的调试带来不必要的麻烦。具体操作请看表

表6-15 AX寄存器操作说明

5.对16位ACC寄存器的操作

累加器(ACC)是CPU的主要工作寄存器。除了那些对存储器和寄存器的直接操作外,所有的ALU操作结果最终都要送入ACC。ACC支持单周期数据传送、加法、减法和来自数据存储器的宽度为32位的比较运算,它也可以接受32位乘法操作的运算结果。对ACC可以单独进行16位/8位的访问。累加器还具有如下的相关状态位。

(1).溢出模式位(OVM)

(2).符号扩展模式位(SXM)

(3).测试/控制标志位(TC)

(4).进位位(C)

(5).零标志位(Z)

(6).负标志位(N)

(7).溢出标志位(V)

(8).溢出计数位(OVC)

对于ACC寄存器的具体操作说明请看表6-16 16位ACC寄存器操作说明、表6-17 32

表6-17 32位ACC寄存器操作说明

表6-18 64位ACC寄存器操作说明

5 .对P或XT寄存器的操作

被乘数寄存器(XT寄存器)主要用于在32位乘法操作之前,存放一个32位有符号整数

值。XT寄存器的低16位部分是TL寄存器。该寄存器能装载一个16位有符号数,能自动对该数进行符号扩展,然后将其送人32位XT寄存器。XT寄存器的高16位部分是T寄存器。该寄存器主要用来存储16位乘法操作之前的16位整数值。T寄存器也可以为一些移位操作设定移位值,在这种情况下,根据指令,只可以使用T寄存器的一部分。具体的操作说明看表

表6-19 P或XT的操作的说明

6.对中断控制寄存器的操作(IFR、IER、DBGIER)

C28x有3个寄存器用于控制中断:中断标志寄存器(IFR)、中断使能寄存器(IER)和调试中断使能寄存器(DBGIER)。IFR包含的标志位用于可屏蔽中断(可以用软件进行屏蔽)。当通过硬件或软件设定了其中某位时,则相应的中断就被使能。可以用IER中的相应位屏蔽和使能中断。当DSP工作在实时仿真模式并且CPU被挂起时,DBGIER表明可以使用时间临近中断(如果被使能)。具体操作看表6-20。

表6-20中断寄存器的操作说明

7.对状态寄存器(ST0、ST1)的操作 C28x 有两个状态寄存器ST0和

STl ,其中包含着不同的标志位和控制位。这些寄存器可以和数据寄存器交换数据,也可以保存机器的状态和为子程序恢复状态。状态位根据流水线中位值的改变而改变,ST0的位在流水线的执行阶段中改变,STl 的位在流水线的译码2阶段中改变。状态寄存器ST0的各位,所有这些位都可以在流水线执行的过程中进行更改。状态寄存器ST0的位分布如图6-4所示,ST1的位分布如图6-5所示。具体的寄存器操作说明看表6-21

D15~D10D9~D7D5D6D3D4D2D1D0

图6-4状态寄存器ST0的位分布

D15~D13D12D10D11D8D9D7

D1D0D6D5D4D3D2

图6-5状态寄存器ST1的位分布

表6-23 32*32乘法操作说明

表6-24对直接存储器操作的说明11.对I/O

12.程序空间的操作说明(看表6-26)

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%&“醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

80x86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著)

80x86汇编语言程序设计教程》(清华大学出版社,黑色封面,杨季文著) 《计算机操作系统原理》 《Inside Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000 技术内幕之类吧)。 《数据结构和算法》——这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱战立,刘天时) 《软件工程》——这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》(黄色,清华) 《Windows 程序设计》——《北京大学出版社,Petzold著》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本 建议:你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书 关于编程的网站 计算机编程 郭新明-FTP服务器体验式学习课程(张孝祥监制) https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=3997 https://www.wendangku.net/doc/3a8815244.html,快速开发新闻系统在线播放 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=4708 数字电路基础[宁波电大] https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=774 计算机组成与汇编语言程序设计(赵丽梅)宁波电大 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=1242 操作系统(陈访荣)宁波电大(在线播放) https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=4708 计算机网络(马敏飞)宁波电大 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=1243 https://www.wendangku.net/doc/3a8815244.html, 2.0快速入门(12)-https://www.wendangku.net/doc/3a8815244.html, 2.0网站快速导航 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=2501 Internet和Intranet应用(薛昭旺)宁波电大 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=1245 2004年电脑硬件安装调试维修视频教学讲授 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=4825 https://www.wendangku.net/doc/3a8815244.html, 高级排错技巧 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=768 SQL Server 2000管理专家系列课程 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=4832 开心三人行系列(2):使用Atlas 构建AJAX应用 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=2564 Visual Basic 2005开发技巧系列课程(4): 在Visual Basic 2005中使用.NET Framework 2.0新增功能 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=2526 SQL Server 2005 系列课程-使用ADO https://www.wendangku.net/doc/3a8815244.html,开发SQL Server 2005 OLAP应用 https://www.wendangku.net/doc/3a8815244.html,/so/so138.aspx?id=2535

ARM经典汇编程序

1冒泡排序的ARM汇编程序ORG 09B0H QUE:MOV R3,#50H QUE1:MOV A,R3 MOV R0,A MOV R7,#0AH CLR 00H MOV A,@R0 Q12:INC R0 MOV R2,A CLR C MOV 22H,@R0 CJNE A,22H,Q13 SETB C Q13:MOV A,R2 JC Q11 SETB 00H XCH A,@R0 DEC R0 XCH A,@R0 INC R0 Q11:MOV A,@R0 DJNZ R7,Q12 JB 00H,QUE1 SJMP $ END

2 ARM汇编希尔排序法对10个带符号数进行排序Code: void shell(int src[],int l,int r){ int ih; r++; for(ih=1;ih<(r-l)/9;ih=ih*3+1); //eax,ih //ebx,il //ecx,ir //edx,cmps _asm{ push eax push ebx push ecx push edx push esi push edi;貌似这堆进栈用处不大哎 mov edi,src mov eax,dword ptr [ih] LIH: cmp eax,0 jna EXIH mov ebx,eax dec ebx LLH: cmp ebx,dword ptr [r] jnb EXLLH mov ecx,ebx mov edx,dword ptr [edi+ecx*4]

LCMP: mov esi,eax dec esi cmp ecx,esi jna EXCMP push ecx sub ecx,eax cmp edx,dword ptr [edi+ecx*4] pop ecx jnb EXCMP push ebx push ecx sub ecx,eax mov ebx,dword ptr [edi+ecx*4] pop ecx mov dword ptr [edi+ecx*4],ebx pop ebx sub ecx,eax jmp LCMP EXCMP: mov dword ptr [edi+ecx*4],edx inc ebx jmp LLH EXLLH: push ecx mov ecx,3 push edx cdq

6、汇编学习从入门到精通(荐书)

汇编学习从入门到精通Step By Step 2007年12月15日星期六00:34 信息来源:https://www.wendangku.net/doc/3a8815244.html,/hkbyest/archive/2007/07/22/1702065.aspx Cracker,一个充满诱惑的词。别误会,我这里说的是软件破解,想做骇客的一边去,这年头没人说骇客,都是“黑客”了,嘎嘎~ 公元1999年的炎热夏季,我捧起我哥留在家的清华黄皮本《IBM-PC汇编语言程序设计》,苦读。一个星期后我那脆弱的小心灵如玻璃般碎裂了,为了弥补伤痛我哭爹求妈弄了8k大洋配了台当时算是主流的PC,要知道那是64M内存!8.4G硬盘啊!还有传说中的Celeon 300A CPU。不过很可惜的是在当时那32k小猫当道的时代,没有宽带网络,没有软件,没有资料,没有论坛,理所当然我对伟大的计算机科学体系的第一步探索就此夭折,此时陪伴我的是那些盗版光盘中的游戏,把CRACK_XXX文件从光盘复制到硬盘成了时常的工作,偶尔看到光盘中的nfo 文件,心里也闪过一丝对破解的憧憬。 上了大学后有网可用了,慢慢地接触到了一些黑客入侵的知识,想当黑客是每一个充满好奇的小青年的神圣愿望,整天看这看那,偷偷改了下别人的网页就欢喜得好像第一次偷到鸡的黄鼠狼。 大一开设的汇编教材就是那不知版了多少次的《IBM-PC汇编语言程序设计》,凭着之前的那星期苦读,考试混了个80分。可惜当时头脑发热,大学60分万岁思想无疑更为主流,现在想想真是可惜了宝贵的学习时间。 不知不觉快毕业了,这时手头上的《黑客防线》,《黑客X档案》积了一大摞,整天注来注去的也厌烦了,校园网上的肉鸡一打一打更不知道拿来干什么。这时兴趣自然转向了crack,看着杂志上天书般的汇编代码,望望手头还算崭新的汇编课本,叹了口气,重新学那已经忘光了的汇编语言吧。咬牙再咬牙,看完寻址方式那章后我还是认输,不认不行啊,头快裂了,第三次努力终告失败。虽然此时也可以爆破一些简单的软件,虽然也知道搞破解不需要很多的汇编知识,但我还是固执地希望能学好这门基础中的基础课程。 毕业了,进入社会了,找工作,上班,换工作成了主流旋律,每天精疲力尽的哪有时间呢?在最初的中国移动到考公务员再到深圳再到家里希望的金融机构,一系列的曲折失败等待耗光了我的热情,我失业了,赋闲在家无所事事,唯一陪伴我的是那些杂志,课本,以及过时的第二台电脑。我不想工作,我对找工作有一种恐惧,我靠酒精麻醉自己,颓废一段日子后也觉得生活太过无聊了,努力看书考了个CCNA想出去,结果还是被现实的就业环境所打败。三年时间,一无所获。 再之后来到女朋友处陪伴她度过刚毕业踏入社会工作的适应时期,这段时间随便找了个电脑技术工作,每月赚那么个几百块做生活费。不过这半年让我收获比较大的就是时间充裕,接触到了不少新东西,我下定决心要把汇编学好,这时我在网上看到了别人推荐的王爽《汇编语言》,没抱什么希望在当当网购了人生中的第一次物,19块6毛,我记得很清楚,呵呵。 废话终于完了,感谢各位能看到这里,下面进入正题吧。

Windows汇编语言程序设计基础

第1章Windows汇编语言程序设计基础 Windows汇编语言程序分为控制台编程和图形界面编程两种,控制台编程相对简单一些。为了由浅入深,本书从控制台编程开始讲解。 读者总希望用最快的速度掌握书中的概貌,为此从一个最简单的程序开始。一些汇编语言语法也结合程序进行讲解,有些指令和语法用注解的方法说明。 1.1 第一个完整的Windows汇编语言程序 Windows汇编语言程序有自己的编程规范,它的编程规范比Visual C要简单得多,调试也很方便。更重要的是系统把重要的东西都呈现给读者,使读者更能掌握其中的本质。 用一条一条的汇编语言指令很难写出大程序,Windows汇编语言程序也是调用系统提供的API来写程序。因而,用Windows汇编语言同样可写出大程序。以下是一个最简单的Windows程序。 ;程序功能:显示一个信息框。 ;ex1.asm(e:\masm\base) ;程序名 ;编译链接方法: ;ml /c /coff ex1.asm ;link /subsystem:console ex1.obj .386 ;指明指令集 .model flat,stdcall ;程序工作模式,flat为Windows程序使用的模式(代码和数据 ;使用同一个4GB段),stdcall为API调用时右边的参数先入栈option casemap:none ;指明大小写敏感 include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .data ;数据段 szCaption db '抬头串',0 szText db 'Hello!',0 .code ;代码段 start:

汇编语言课程设计报告-打字练习程序

提供全套毕业设计,欢迎咨询 汇编语言课程设计报告 程序题目:打字练习程序 学生姓名:XX 班级:2010级计算机科学与技术专业4班学号:XXX 院系:计算机科学学院 指导教师:XXX

目录

1设计目的 本程序运行后,出现主界面,按回车键出现由26个字母组成的乱序行,这时其中任一字母落下,在键盘上敲入该字母,如果输入正确,字母消失;按回车键进入打字练习;按ESC键返回主界面;按空格键暂停;按‘E’退出。通过课程设计,主要达到以下目的: 1. 增进对汇编语言的认识,加强用汇编语言编程的能力; 2. 掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等; 3. 了解和掌握汇编语言程序设计过程、方法及实现,为以后微机原理课程的学习打下良好基础; 4. 通过课程设计可以使我们更加了解书上的知识,了解书上的语句并且能够应用自己的程序中; 5. 掌握屏幕输出显示的设计方法。 2概要设计 2.1 系统总体分析 根据题目要求可以看到有以下几部分来实现打字练习:1.由26字母乱序组成一行显示行。2.字母自动落下。3.从键盘输入的字母与落下字母相同则该字母消失,并且下一个字母自动接着落下。4.按下“Ese”键则程序返回到主界面。5.按空格键游戏暂停。6.在主界面按“E”则程序退出。打字练习的主要功能由以上六部分组成,每一部分之间的联系都是比较紧密的。对于以上及部分,最主要的部分就是第二三两个部分,这是打字练习的重点,需要详细设计其所需要的功能。 2.2主模块框图及说明

是 否 否 是 是 图2-1程序设计流程图 程序的核心模块是打字,各个模块功能的实现主要是通过键盘输入指令来融合的,主要流程是先到主界面,然后选择你想要进行的指令ENTER 进入打字界面开始打字,E退出程序,空格在打字练习时执行暂停的功能,ESC是从打字界面返回到主界面。核心模块的流程大体如下面的流程图图2-1: 3 详细设计 3.1 主模块及子模块说明 主界面是程序的初始入口,也是其他功能模块的接入点。主模块是打字模块,也是核心模块,主要通过各个键盘符来控制各个子模块之间的协调。子模块分为判断输入字符判断模块(这当中包含两个小的子模块:主界面输入字符判断和打字模块输入字符判断)、暂停模块、退出模块(这当中包含两个小的子模块:打字界面返回主界面模块和主界面退出程序模块)

Windows X86-64位汇编语言入门

Windows X86-64位汇编语言入门 Windows X64汇编入门(1) 最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。 文章的标题包含了本文的四方面主要内容: (1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista 64位版,调用的均为windows API。 (2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。至于三者间的区别,可自行搜索。 (3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。 (4)入门:既是入门,便不会很全。其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。其二,便于类似我这样刚接触x64汇编的新手入门。 本文所有代码的调试环境:Windows Vista x64,Intel Core 2 Duo。 1. 建立开发环境 1.1 编译器的选择 对应于不同的x64汇编工具,开发环境也有所不同。最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio 2005一起发布。因此,如果你是微软的忠实fans,直接安装VS2005既可。运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。

第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC 资源编译器,且自带了Include目录。它的最大好外是小,不用为了学习64位汇编安装几个G 的VS。因此,本文的代码就在GoASM下编译。 第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。 不同的编译器,语法会有一定差别,这在下面再说。 1.2 IDE的选择 搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。因此,最简单的方法是自行修改EditPlus的masm语法文件,这也是我采用的方法,至少可以得到语法高亮。当然,如果你懒得动手,那就用notepad吧。 没有IDE,每次编译时都要手动输入不少参数和选项,做个批处理就行了。 1.3 硬件与操作系统 硬件要求就是64位的CPU。操作系统也必须是64位的,如果在64位的CPU上安装了

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS 的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

清华大学学习视频教程下载,有需要的千万别错过

da清华大学(英文名:Tsinghua University),地处北京西北郊繁盛的园林区,是在几处清代皇家园林的遗址上发展而成的。清华大学的前身是清华学堂,始建于1911年,曾是由美国退还的部分庚子赔款建立的留美预备学校。1912年,清华学堂更名为清华学校。1925年设立大学部,开始招收四年制大学生。1928年更名为国立清华大学,并于1929年秋开办研究院。清华大学的初期发展,虽然渗透着西方文化的影响,但学校十分重视研究中华民族的优秀文化瑰宝。 清华大学《运筹学》共40讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-232-1-1.html 清华大学《C++语言程序设计》周登文 48讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-371-1-1.html 清华大学《数据结构》(c语言)严蔚敏48讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-1547-1-1.html 清华大学《计算机文化基础》视频教学共28讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-233-1-1.html 清华大学《计算机原理》王诚 64讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-328-1-1.html 清华大学《模式识别》林学訚 32讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-375-1-1.html 清华大学《计算机网络体系结构》汤志忠 48讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-374-1-1.html 清华大学《汇编语言程序设计》温冬婵 64讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-356-1-1.html 清华大学《JA V A编程语言》许斌32讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-354-1-1.html 清华大学《人工智能原理》朱晓燕48讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-329-1-1.html 清华大学《编译原理》张素琴吕映芝64讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-330-1-1.html 清华大学《软件工程》刘强48讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-327-1-1.html 思想道德修养清华大学 https://www.wendangku.net/doc/3a8815244.html,/thread-327-1-1.html 清华大学《C++语言程序设计》周登文48讲学习梦想家园 https://www.wendangku.net/doc/3a8815244.html,/thread-2-1-2.html 清华大学《模拟电子技术》华成英56讲学习梦想家园

最经典的51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计 开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 程序A: ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 程序B: ;用移位方式实现流水灯

ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main: mov a,#0feh ;给A赋值成11111110 loop: mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay: mov r3,#20 ;最外层循环二十次 d1: mov r4,#80 ;次外层循环八十次 d2: mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S djnz r4,d2 djnz r3,d1 ret end 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。 ORG 0 ;程序从0地址开始 START: MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容 RR A ;让ACC的内容左移 CALL DELAY ;调用延时子程序 LJMP LOOP ;跳到LOOP处执行 ;0.1秒延时子程序(12MHz晶振)=================== DELAY: MOV R7,#200 ;R7寄存器加载200次数 D1: MOV R6,#250 ;R6寄存器加载250次数 DJNZ R6,$ ;本行执行R6次 DJNZ R7,D1 ;D1循环执行R7次 RET ;返回主程序

汇编语言基础知识

汇编语言基础知识 汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有 效地应用汇编语言对其编程,因此,本章对硬件系统结构的问题进行部分探讨,首先介绍了计算机的基本结构、Intel 公司微处理器的发展、计算机的语言以及汇编语言的特点,在此基础上重点介绍寄存器、内存组织等汇编语言所涉及到的基本知识。 1.1 微型计算机概述 微型计算机由中央处理器(Central Processing Unit ,CPU )、存储器、输入输出接口电路和总线构成。CPU 如同微型计算机的心脏,它的性能决定了整个微型计算机的各项关键指标。存储器包括随机存储器(Random Access Memory ,RAM )和只读存储器(Read Only Memory ,ROM )。输入输出接口电路用来连接外部设备和微型计算机。总线为CPU 和其他部件之间提供数据、地址和控制信息的传输通道。如图1.1所示为微型计算机的基本结构。 外部设备存储器输入输出接口电路中央处理器 CPU 地址总线 数据总线 控制总线 图1.1 微型计算机基本结构 特别要提到的是微型计算机的总线结构,它使系统中各功能部件之间的相互关系变 为各个部件面向总线的单一关系。一个部件只要符合总线结构标准, 就可以连接到采用这种总线结构的系统中,使系统功能得到扩展。 数据总线用来在CPU 与内存或其他部件之间进行数据传送。它是双向的,数据总线 的位宽决定了CPU 和外界的数据传送速度,8位数据总线一次可传送一个8位二进制数据(即一个字节),16位数据总线一次可传送两个字节。在微型计算机中,数据的含义是广义的,数据总线上传送的不一定是真正的数据,而可能是指令代码、状态量或控制量。 地址总线专门用来传送地址信息,它是单向的,地址总线的位数决定了 CPU 可以直接寻址的内存范围。如 CPU 的地址总线的宽度为N ,则CPU 最多可以寻找2N 个内存单 元。

单片机汇编语言经典一百例

51单片机实用程序库 4.1 流水灯 程序介绍:利用P1 口通过一定延时轮流产生低电平 输出,以达到发光二极管轮流亮的效果。实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。 程序实例(LAMP.ASM) ORG 0000H AJMP MAIN ORG 0030H MAIN: 9 MOV A,#00H MOV P1,A ;灭所有的灯 MOV A,#11111110B MAIN1: MOV P1,A ;开最左边的灯 ACALL DELAY ;延时 RL A ;将开的灯向右边移 AJMP MAIN ;循环 DELAY:

MOV 30H,#0FFH D1: MOV 31H,#0FFH D2: DJNZ 31H,D2 DJNZ 30H,D1 RET END 4.2 方波输出 程序介绍:P1.0 口输出高电平,延时后再输出低电 平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM): ORG 0000H MAIN: ;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAY SETB P1.0 ACALL DELAY 10 CLR P1.0 AJMP MAIN ;////////////////////////////////////////////////// DELAY: MOV R1,#0FFH

DJNZ R1,$ RET END 五、定时器功能实例 5.1 定时1秒报警 程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。程序实例(DIN1.ASM): ORG 0000H AJMP MAIN ORG 000BH AJMP DIN0 ;定时器0入口 MAIN: TFLA G EQU 34H ;时间秒标志,判是否到50个 0.2秒,即50*0.2=1秒 MOV TMOD,#00000001B;定时器0工作于方式 1 MOV TL0,#0AFH MOV TH0,#3CH ;设定时时间为0.05秒,定时 20次则一秒 11 SETB EA ;开总中断

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

快速入门单片机汇编语言 简要: 单片机有通用型和专用型之分。专用型是厂家为固定程序的执行专门开发研制的一种单片机,其程序不可更改。通用型单片机是常用的一种供学习或自主编制程序的单片机,其程序需要自己写入,可更改。单片机根据其基本操作处理位数不同可以分为:1位、4位、8位、16、32位单片机。 正文: 在此我们主要讲解美国ATMEL公司的89C51单片机。 一、89C51单片机PDIP(双列直插式)封装引脚图: 其引脚功能如下: P0口(—):为双向三态口,可以作为输入/输出口。但在实际应用中通常作为地址/数据总线口,即为低8位地址/数据总线分时复用。低8位地址在ALE信号的负跳变锁存到外部地址锁存器中,而高8位地址由P2口输出。 P1口(—):其每一位都能作为可编程的输入或输出线。 P2口(—):每一位也都可作为输入或输出线用,当扩展系统外设时,可作为扩展系统的地址总线高8位,与P0口一起组成16位地址总线。对89c51单片机来说,P2口一般只作为地址总线使用,而不作为I/O线直接与外设相连。 P3口(—):其为双功能口,作为第一功能使用时,其功能与P1口相同。当作为第二功能使用时,每一位功能如下表所示。 P3口第二功能

Rst\Vpd:上电复位端和掉电保护端。 XTAL1(xtal2):外接晶振一脚,分别接晶振的一端。 Gnd:电源地。 Vcc:电源正级,接+5V。 PROG\ALE:地址锁存控制端 PSEN:片外程序存储器读选通信号输出端,低电平有效。 EA\vpp:访问外部程序储存器控制信号,低电平有效。当EA为高电平时访问片内存储器,若超出范围则自动访问外部程序存储器。当EA为低电平时只访问外部程序存储器。 二、常用指令及其格式介绍: 1、指令格式: [标号:]操作码 [ 目的操作数][,操作源][;注释] 例如:LOOP:ADD A,#0FFH ;(A)←(A)+FFH 2、常用符号: Ri和Rn:R表示工作寄存器,i表示1和0,n表示0~7。 rel:相对地址、地址偏移量,主要用于无条件相对短转移指令和条件转移指令。 #data:包含于指令中的8位立即数。 #data16:包含于指令中的16位立即数。

汇编经典代码

1.顺序程序设计 将两个多位十进制数相加,要求被加数、加数均以ASCⅡ码形式各自顺序存放在以DATA1和DATA2为首的五个内存单元中(低位在前),结果送回DATA1处。 DATA SEGMENT DATA1 DB 34H,35H,39H,38H,36H,' ' ;被加数 DATA2 DB 37H,34H,33H,36H,32H,' ' ;加数 DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,DATA1 ;有效地址送SI,为调用显示子程序做准备 CALL DISPLAY ;调用显示子程序 CALL CRLF ;调用回车换行子程序 LEA SI,DATA2 ;有效地址送SI,为调用显示子程序做准备,同时为加法运算做准备 CALL DISPLAY ;调用显示子程序 CALL CRLF ;调用回车换行子程序 LEA DI,DATA1 ;有效抵制送DI,为加法运算做准备 MOV AX,0 MOV BX,0 MOV CL,05H ;记录循环次数 ADDS: MOV AL,[SI] ;将加数送往AL SUB AL,30H ADD AL,BL ;加上进位 MOV BL,[DI] ;将被加数送往BL SUB BL,30H ADD AL,BL ;加法运算 ADD AL,30H CMP AL,3AH JA SUBA ;结果>=10,跳到SUBA JB NSUBA SUBA: SUB AL,0AH ;减去10的值,并置BL为1 MOV BL,01H JMP CONTINUE NSUBA: MOV BL,00H ;置BL为0 CONTINUE:MOV [DI],AL ;将相加的结果从AL送往DI的地址,即DATA1的地址INC DI ;地址加1 INC SI ;地址加1 LOOP ADDS ;循环 JC SHUCHU JNC SHUCHU2 SHUCHU2: MOV AL,31H ;CF为1设置结果最高位为1 JMP CONTINUE2 SHUCHU:MOV AL,30H ;CF为0设置结果最高位为0

汇编语言入门教程

汇编语言入门教程 2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

相关文档