汇编语言

汇编语言
汇编语言

西安财经学院信息学院《汇编语言程序设计》

学生姓名:

学号:

班级:

专业:计算机科学与技术

完成日期: 2015年6月24日

题目一(顺序):

1.编写完成表达式M=500-A+B的程序设计,其中变量都是字数据。

题目分析

顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构首先,在数据段中,定义x,y,z分别存500,4,5,要求结果送往M中,先将运算结果送往AX,最后将寄存器AX的内容传送到S中。编写完成表达式M=500-A+B.其中变量都是字数据.

源程序代码

data segment

x dw 500

y dw 4

z dw 5

M dw ?

data ends

code segment

main proc far

assume cs:code,ds:data

start:

mov ax,data

mov ds,ax

mov ax,x

SUB ax,y

ADD ax,z

mov M,ax

ret

main endp

code ends

end start

调试分析过程:

(1).用masm程序产生WL1文件,没有错误,如下图:

(2).用link程序产生WL1.exe文件,如下图。

(3).用u命令反汇编,查看代码段,数据段所在内存单元;

(4).用T命令单步执行该程序,实现初始化。

(4).用T命令单步执行该程序,看到将500送AX.

(5)执行T命令,可以看出将相减后的数据送AX。

(6)使用D命令查看数据段,从图中可以看出最终结果存储在0007和0008内。

(7)运行结束,输入Q命令退出DEBUG.

题目二(选择):编程对已知的5个数据,找出最小值。

题目分析

本程序需采用冒泡排序算法,从第一个数开始,依次和后面四个数比较,如果次序正确则不作任何操作,如此序不对,则使两个数交换位置。冒泡法

从第一个元素开始,依次对相邻的两个元素进行比较,使前一个元素不大于后一个元素;将所有元素比较完之后,最大的元素排到了最后;然后,除掉最后一个元素之外的元素依上述方法再进行比较,得到次大的元素排在后面;如此重复,直至完成就实现元素从小到大的排序。n个数需要n-1遍比较,第一遍比较出一个最大(或最小)数,第二遍对剩下的数进行比较,得到一个次最大(或次最小)数,第n-1遍比较出最后两个数的大小顺序,至此整个数组全部排好序。每一遍比较需要比较的次数为要比较数减一。如n=5,第一遍比较次数为4(内循环),第二遍比较次数为3 (内循环),第三遍比较次数为2 (内循环),第四遍比较次数为1 (内循环)。

源程序代码:

DATA SEGMENT

buf db 7,2,3,4,5;输入字符串缓冲区

count equ $-buf

msgd db "the min is:$";显示信息,提示输出最小值

DATA ENDS

CODE SEGMENT

assume cs:CODE, ds:DATA

MAIN PROC FAR ;主程序入口

mov ax, dseg

mov ds, ax

lea si,buf;数据起始地址存入SI

mov cx,count;数据个数存入CX中

mov bl,[si];找最小值存入BL中

dec cx

next:

cmp bl,[si+1]

jbe next1

mov bl,[si+1]

next1:inc si

loop next

lea dx,msgd;显示信息,提示输出最小值

mov ah,9

int 21h

call disp;用十六进制形式最小值

mov ah,1;按任意键退出

int 21h

mov ax, 4c00h ;程序结束,返回到操作系统系统

int 21h

MAIN ENDP

disp proc near

mov ch,2

rotate:

mov cl,4

rol bl,cl

mov al,bl

and al,0fh

add al,30h

cmp al,3ah

jl printit

add al,7h

printit:

mov dl,al

mov ah,2

int 21h

dec ch

jnz rotate

mov dl,'H'

mov ah,2

int 21h

ret

disp endp

CODE ENDS

END MAIN

调试分析过程:

(1)用masm程序产生WL2.obj文件。

(2)用Link程序产生WL2.exe文件。(3)用十六进制输出结果

(4).用u命令反汇编,查看代码段,数据段所在的内存单元;

(5)用T命令单步执行,进行初始化,执行lea指令之后,可以看出si为0000H 即将起始地址存入SI.并且数据段0000H的数值是1C19.如下图:

(6),执行T命令,可以看出将数据个数存入CX,数据个数为5,然后找出最小值存入BL从DS数据段看出最小值的十六进制为19H.

(7)循环执行进行数据比较:

(8)执行G命令,方便输出,省去过程中的一些重复循环的过程。

(9)使用D命令查看数据单元,可以看出最小值存在0000H处,为19H.

(10)调试结束,输入Q命令退出DEBUG.

题目三:3.将数n插入已经排序的字数组中,所有的数据已按降序排序。

题目分析:把数据插入已存在数组要把新插入的数据与原树组数据分别进行比较,直到某一个数据小于新插入数据为止

由于数组已经排好序,因此可以将正数n依次和数组中的数进行比较,比较有个方向问题,这里假设数组在存储单元中按地址递增的方向从大到小依次存放。不妨从大数开始进行比较,当遇到第一个比n大的数,记下该位置,该位置就是要插入n 的位置。找到出入位置后,如何在不破坏原来数据顺序基础上插入n同样,我们可以如法炮制,数组中将要插入数n位置前的数依次前移一个位置(两个字节),空出要插入位置,将n放入即可。

程序代码:

data segment

x dw ?

array_head dw 99,78,65,52,49,37,23,15,5,3

array_end dw 1

n dw 32

data ends

prognam segment

main proc far

assume cs:prognam,ds:data

start:push ds

sub ax,ax

push ax

mov ax,data

mov ds,ax

mov ax,n

mov array_head-2, 0ffffh

mov si, 0

compare:

cmp array_end [si], ax

jle insert

mov bx, array_end [si]

mov array_end [si+2], bx

sub si, 2

jmp short compare

insert:

mov array_end [si+2], ax

ret

main endp

prognam ends

end start

程序调试:

(1)用masm程序产生WL3.obj文件。

(2)用Link程序产生WL3,exe文件。

(3).进入DEBUG环境,然后用u命令反汇编,查看代码段,数据段所在的内存单元;

(4).用T命令单步执行,如下图所示:

(5)继续执行T命令,将先将AX送DS,再将0018H中的数值0020H送AX,如下图所示。

6)在用u命令进行反汇编,然后使用G命令,执行想要运行的代码段,如下图

所示,运行的是0015H到002DH.

(7)运行结束,输入Q命令退出DEBUG

题目四:在屏幕上显示提示信息“Please input 10 numbers:”,提示用户输入10个数(数的范围在0~99之间),然后从键盘上读入这10个数。接着对这10个数从小到大进行排序,并统计0~59、60~79、80~99的数各有多少。最后在屏幕上显示排序后的数(每个数之间用逗号分隔)并显示统计的结果。显示格式如下:

Sorted numbers: xx,xx,xx,xx,xx,xx,xx,xx,xx,xx

0-59: xx

60-79: xx

80-99: xx

题目分析:

通过运用计算机汇编语言指令系统,将我们所要表达的语言转换成机器指令,任其识别。

这是一个在使用子程序为主的基础上,综合应用顺序结构、循环结构和分支等结构的程序,以实现从键盘终端输入成绩,并对其进行分类的过程。

程序主要要实现的部分为,第一部分:从键盘中键入数据并将其转化成二进制保存,并且要注意,输入的数是一位还是两位。

第二部分:该部分运用循环结构编写,主要做比较交换。将数字用冒泡排序按从小到大的顺序排列好,对NUMBERS中的10个数据进行统计,结果放在GE80,GE60和LE59中。

第三部分:将数据转换成ASCII码,并保存到不同的寄存器中。把排序后的10个数据转换成ASCII码依次存入SORTNUM字符中,然后再把统计结果转化成ASCII码存入MESS80,MESS60,MESS00字符串中

第四部分:显示排序后的数据和结果。

程序代码:

CALLDOS MACRO FUNCTION

MOV AH,FUNCTION

INT 21H

ENDM

CRLF MACRO

MOV DL,0DH

CALLDOS 2

MOV DL,0AH

CALLDOS 2

ENDM

DATA SEGMENT

MESSAGE DB 'Please input 10 number:',0DH,0AH,'$'

NUMBERS DB 10 DUP(?)

KB_BUF DB 3

ACTLEN DB ?

BUFFER DB 3 DUP(?) ;输入的字符放在次区域中

LE59 DB 0 ;0——5的个数

GE60 DB 0 ;60——79的个数

GE80 DB 0 ;80——99的个数

SORTSTR DB 'Sorted numbers'

SORTNUM DB 9 DUP(20H,20H,','),20H,20H,0DH,0AH

MESS00 DB '0-59:',30H,30H,0DH,0AH

MESS60 DB '60-79:',30H,30H,0DH,0AH

MESS80 DB '80-99:',30H,30H,0DH,0AH,'$'

DATA ENDS ;数据段结束

CODE SEGMENT ;定义代码段

ASSUME CS:CODE,DS:DATA,ES:DATA

START:MOV AX,DATA

MOV DS,AX

MOV ES,AX

LEA DX,MESSAGE

MOV AH,09H

INT 21H ;显示MESSAGE

;从键盘读入数据并转化成二进制数保存

MOV CX,10

LEA DI,NUMBERS ;设置数据保存区指针LP11:LEA DX,KB_BUF

MOV AH,0AH

INT 21H ;从键盘读入数据

CMP ACTLEN,0

JZ LP11

CMP ACTLEN,1

JNZ LP12

MOV AL,BUFFER ;若只有一个数字

AND AL,0FH ; 转化成二进制

JMP LP13

LP12:MOV AH,BUFFER ;若有二个数字

MOV AL,BUFFER+1

AND AX,0F0FH ; 转化成BCD数

AAD ; 转化成二进制数

LP13:STOSB ; 保存数据

CRLF

LOOP LP11

MOV BL,9

LP21:LEA SI,NUMBERS

MOV CL,BL

LP22:LODSB ; ?第一个数Ni

CMP AL,[SI] ; Ni<=Nj?

JLE LP23 ; 若小于等于则不交换 XCHG AL,[SI] ; 否则交换Ni,Nj

MOV [SI-1],AL

LP23:DEC CL

JNZ LP22 ;若内循环未结束则继续 DEC BL

JNZ LP21 ;若外循环未结束则继续

;对NUMBERS中的10个数据进行统计,结果放在GE80,GE60和LE59中

LEA SI,NUMBERS ;指向数据保存区

MOV CX,10

LP31:CMP BYTE PTR[SI],60

JGE LP32

INC LE59

JMP LP34

LP32:CMP BYTE PTR[SI],80

JGE LP33

INC GE60

JMP LP34

LP33:INC GE80

LP34:INC SI

LOOP LP31

;把排序后的10个数据转换成ASCII码依次存入SORTNUM字符串中

LEA SI,NUMBERS ; 指向数据保存区

LEA DI,SORTNUM ; 指向字符串

LP41:LODSB

CMP AL,10 ; 大于10,则有二位数字J GE LP42

ADD AL,30H ; 只有一位数字则直接转换MOV AH,20H ; 高位显示成空格

JMP LP43

LP42:AAM ; 转化成二位BCD数ADD AX,3030H ;转化成ASCII码

LP43:XCHG AH,AL ; 十位数放到AL中

MOV [DI],AX

ADD DI,3

LOOP LP41

;把统计结果转化成ASCII码存入MESS80,MESS60,MESS00字符串中

MOV AH,LE59

CMP AH,10 ;大于10,则有二位数字

JGE LP51

ADD AH,30H ; 只有一位数字则直接转换

MOV AL,20H ;高位显示成空格

JMP LP52

LP51:MOV AX,3031H

LP52:MOV WORD PTR MESS00+6,AX

MOV AH,GE60

CMP AH,10 ; 大于10,则有二位数字

JGE LP53

ADD AH,30H ;只有一位数字则直接转换MOV AL,20H ;高位显示成空格

JMP LP54

LP53:MOV AX,3031H

LP54:MOV WORD PTR MESS60+6,AX

CMP AH,10 ;大于10,则有二位数字JGE LP55

ADD AH,30H ;只有一位数字则直接转换MOV AL,20H ; 高位显示成空格

JMP LP56

LP55:MOV AX,3031H

LP56:MOV WORD PTR MESS80+6,AX

;显示排序后的数据和统计结果

LEA DX,SORTSTR

CALLDOS 9

CALLDOS 1

CALLDOS 4CH ;返回DOS

CODE ENDS ;代码段结束

END START ;程序结束

程序调试:

1.将编写的代码命名为WL4.asm,在汇编环境下进行汇编。

2.用link程序产生WL4.exe文件,如下图。

3.输入数据,查看运行结果,如下图:

4.进入debug环境,并用u命令反汇编,查看代码段,数据段所在内存单元;

5. 用单步执行命令t,逐步实现数据段及代码段的初始化;

6.执行lEA指令,将有效地址0000H送寄存器DX

7. 将两个数进行比较,从运行结果中可以看出,小于不交换,该指令执行的是比较排序。

8.内循环未结束,继续执行。

9.因为循环次数较多,单步执行较为缓慢,所以用u命令返汇编,找出将要执行的程序段,用g命令一步执行地址为000BH到001CH之间和程序段.

10.将01分别和0,1比较并根据结果跳转到不同的代码段:

11.循环执行0016H所代表的代码段,

汇编语言编写贪吃蛇游戏

DA TA SEGMENT dw 0,0 snk db 1 blk db 32 food db 3 tal1 db 4 tal2 db 2 adrs db 5 len db ? pst db ? addrs dw ? frow db ? fcol db ? hwrt db ? gmov db 'game over press r to restart press q to quit $' score1 db 'score :$' score2 db ? score0 db 1 zero db 48 writer db 'Developer: Geniusdot $' email db 'e-mail: pang@https://www.360docs.net/doc/8d6743821.html,$' msg1 db 'The way to play the game:$' way db ' press w to up ,press s to down,press a to left,press d to right$' msg db 'Press any key(except a,s,d,w) to start$' DA TA ENDS STACK SEGMENT stack db 200 dup(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DA TA,SS:STACK start: mov ax,data mov ds,ax mov ax,0 mov es,ax mov frow,10 mov fcol,6 mov dh,10 mov dl,26 mov ah,2

int 10h mov ah,9 lea dx,msg1 int 21h mov dh,11 mov dl,7 mov ah,2 mov bh,0 int 10h mov ah,9 lea dx,way int 21h mov dh,12 mov dl,20 mov ah,2 mov bh,0 int 10h mov ah,9 lea dx,msg int 21h mov ah,0 int 16h mov ah,6 mov al,0 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,10 int 10h mov dh,0 mov dl,0 mov ah,2 mov bh,0 int 10h mov ah,9 lea dx,score1 int 21h mov dl,15 mov ah,2 mov bh,0 int 10h

汇编语言程序设计教学大纲

《汇编语言程序设计》课程教学大纲 二、课程简介 汇编语言是计算机能够提供给用户使用的最快最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言,因而,对程序的空间和时间要求很高的场合及需要直接控制硬件的应用场合,汇编语言的应用是必不可少三、课程目标 汇编语言课程是计算机专业的一门专业选修课。通过本课程的学习,应使学 生系统地了解计算机组成原理与内部的运行机理,掌握汇编语言程序设计及相关 知识,为学习本专业后继课程和进行与硬件有关的技术工作打下良好基础。通过 上机实验,使学生受到软硬件实验的初步训练,并培养学生分析问题和解决问题 的能力。 四、教学内容及要求 第一章基础知识 1.教学内容 (1) 为什么要用汇编语言编写程序 (2) 进位计数制与不同基数的数之间的转换 (3) 二进制数和十六进制数运算 (4) 计算机中数和字符的表示 (5) 几种基本的逻辑运算 2.基本要求 了解机器指令、代码指令、机器语言、汇编指令、汇编语言、汇编语言源程 序、汇编程序、汇编等概念;掌握进位计数制与不同基数的数之间的转换及

运算;计算机中数和字符的表示;“与”、“或”、“非”、“异或”等几种基本的逻辑运算; 第二章80X86计算机组织 1.教学内容 计算机系统概述、存储器、中央处理机和外部设备。 2.基本要求 理解计算机的硬件和软件系统及其关系。掌握计算机的基本结构及总线;存储器的内容、地址及存储器的分段;中央处理机的组成、80X86系列CPU工作寄存器构成和功能,特别是段寄存器和标志寄存器;外设接口、端口和8086/8088的端口地址范围和访问方法。 第三章80X86的指令系统 1.教学内容(重点内容) IBM PC机的寻址方式、IBM PC机的指令系统。 2.基本要求 熟练掌握IBM PC机寻址方式及物理地址的计算;数据传送、算术、逻辑、串处理、控制转移和处理机控制指令六组中的所有指令的格式、操作、及影响的标志位。了解机器语言的指令组成; 第四章汇编语言程序格式 1.教学内容 汇编程序功能、伪操作、汇编语言程序格式、汇编语言程序的上机过程。 2.基本要求 掌握DEBUG程序和命令及能用DEBUG 程序调试和运行简单小程序;汇编语言上机步骤、汇编程序的功能;数据定义及存储器分配、表达式赋值“EQU”和“=”、段定义、程序开始和结束、对准、基数控制等六类伪操作;汇编语言程序格式中的名字、操作、操作数和注释等项。 第五章循环与分支程序设计 1.教学内容 程序设计的一般步骤和基本结构、循环程序设计和分支程序设计 2.基本要求 掌握汇编语言程序的编制步骤和结构化程序设计的三种基本结构;循环的设计方法和多层循环的设计;分支程序的设计方法,并能编制相应的程序。第六章子程序结构 1.教学内容 子程序的设计方法、嵌套与递归子程序、子程序举例和DOS系统功能调用

汇编语言知识大全

第一章基础知识: 一.机器码: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

C语言与汇编语言互相调用

浅谈C程序中调用汇编模块的方法 C语言是目前非常流行的一种编程语言,除具有高级语言使用方便灵活、数据处理能力强、编程简单等优点外,还可实现汇编语言的大部分功能,如可直接对硬件进行操作、生成的目标代码质量较高且执行的速度较快等。所以在工程上对硬件处理速度要求不很高的情况下,基本可以用C代替汇编语言,编写接口电路的控制软件。但C也不能完全取代汇编语言,如在一些对速度要求很高的实时控制系统中,以及对硬件的特殊控制方面,C有时也不能完全很好胜任,还需要汇编语言来编写。因为汇编语言目标代码更精练,对硬件直接控制能力更强和执行速度更快,但汇编语言编程烦难、表达能力差也显而易见。比较好的解决办法是C与汇编语言混合编程,即用C编写软件的调度程序、用户界面以及速度要求不高的控制部分,而用汇编语言对速度敏感部分提供最高速度的处理模块,供C调用。这种方法提供了最佳的软件设计方案,做到了兼顾速度效率高和灵活方便。由于本人的毕业设计需要C 程序中调用汇编模块的方法来提高ARM定点指令的执行速度,故对这方面进行了学习。学习心得如下: 对于C和汇编语言的接口主要有两个问题需要解决。 一、调用者与被调用者的参数传递 这种数据传递通过堆栈完成,在执行调用时从调用程序参数表中的最后一个参数开始,自动依次压入堆栈;将所有参数压入堆栈后,再自动将被调用程序执行结束后的返回地址(断点)压入堆栈,以使被调程序结束后能返回主调程序的正确位置而继续执行。例如一调用名为add汇编程序模块的主函数:main( ){...... add(dest,op1,op2,flages);......}。在此例中对主函数进行反汇编,主函数在调用add函数前自动组织的堆栈。 . . . lea 0xfffffffe8(%ebp),%eax #flages数组的首地址入栈 push %eax pushl 0xfffffff8(%ebp) #OP2入栈 pushl 0xfffffffc(%ebp) #OP1 入栈 pushl 0xfffffff0(%ebp) #dest地址入栈 call 0x80483f0 #调用add函数 . . 执行完add调用语句后,栈内数据结果如图一所示。 进入汇编子程序后,为了能正确获取主调程序并存入堆栈中的数据,被调的汇编子程序先后要做如下一些工作: 1、保存esp的副本 进入汇编子程序后,子程序中免不了要有压栈和出栈的操作,故ESP时刻在变化。为了能用ESP访问堆栈中的参数,安全办法是一进入子程序后,先为ESP制副本,以后对传递参数的访问都用副本进行。一般可用EBP保存ESP,如: push %ebp mov %ebp,%esp

基础的汇编语言小程序

基础的汇编语言小程序 1.1 Hello World !程序(完整段) (注:所有的标点符号以及空格回车均为英文输入法状态下的,否则报错!) DATAS SEGMENT STRING DB ‘Hello World !’,13,10,’$’ DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX LEA DX,STRING MOV AH,9 INT 21H MOV AH,4CH INT 21H CODES ENDS END START 1.2 Hello World !程序(简化段) .MODEL SMALL .DATA

STRING DB’Hello World !’,13,10,’$’ .STACK .CODE .STARTUP LEA DX,STRING MOV AH,9 INT 21H .EXIT END 2.1完整段的求3+5的和 DATA SEGMENT FIVE DB 5 DATAS ENDS STACKS SEGMENT DB 128 DUP(?) STACKS ENDS CODES SEGMENT ASSUME CD:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AL,FIVE

ADD AL,3 ADD AL,30H MOV DL,AL MOV AH,2 MOV AH,4CH INT 21H CODES ENDS END START 2.2;简化段的求3+5的和.MODEL SMALL .DATA FIVE DB 5 .STACK DB 128 DUP (?) .CODE .STARTUP MOV AL,FIVE ADD AL,3 ADD AL,30H MOV DL,AL MOV AH,2 INT 21H

32位80x86汇编语言ptr指令学习笔记

阅读反汇编后的汇编程序挺麻烦,尤其是在c语言程序的子函数参数中有数组参数,同时当子函数里有循环操作时,反汇编后的代码中频繁出现ptr指令操作。该指令的用法十分灵活,有时候读入(或写入)的是某内存地址,有时候读入(写入)的是某内存地址中存储的值,初学时总感觉很迷惑,分不清什么时候读内存地址,什么时候读内存地址中值,参考相关文献和书籍后作如下总结。 例如一段简单的C语言程序: int mywork(int a[9], int b[9], int c[9]) { int i; for ( i=0; i<9; i++) c[i] =a[i] +b[i]; } 这段代码debug版反汇编后代码很简单,但是里面有许多小细节值得推敲。 int mywork(int a[9], int b[9], int c[9]) ;原c代码 … … ;这里为开始调用函数时当前寄存器数据保存 for ( i = 0 ; i < 9 ; i ++) mov dword ptr [i], 0;这里为i初始化,值为0 jmp mywork+xx1h ;进入循环体内部 mov eax, dword ptr [i]; add eax, 1 mov dword ptr [i], eax mywork+xx1h:cmp dword ptr [i], 9 jge mywork+xx2h ;如果i等于或大于9,跳出循环 c[i] =a[i] +b[i]; mov eax, dowrd ptr [i] ;读入参数i mov ecx, dword ptr [a] ;这里是读入参数数组a的首地址 mov edx, dword ptr [b] ;这里是读入参数数组b的首地址 mov eax, dword ptr [ecx + eax*4] ;读入a add eax, dword ptr [edx +eax*4] ; eax = a[i]+b[i] mov edi, dword ptr [c] ;这里是读入参数数组c的首地址 mov dword ptr [edi+ eax*4], eax ;这里保存计算结果,c[i]= a[i]+b[i] inc eax jmp mywork+xx1h mywork+xx2h: … … ;一些数据恢复操作,主要是出栈等 ret 文中用红色标记处两处涉及ptr指令的地方。 第一处为mov eax, dword ptr [i] 本条mov指令的结果是将变量i的值读入到eax寄存器中,至于从i变量存储地址处读取几个字节,由dword修饰符指定(4个字节)。 第二处为mov ecx, dword ptr [a] 这里表示将参数数组a的首地址读入到ecx寄存器中。 同样两个mov 寄存器, dword ptr [变量]操作,为何第一个寄存器eax读入数值,而第二个ecx寄存器读入的为地址呢?

浅谈计算机编程语言的发展

浅谈计算机编程语言的发展 信息学院103班潘红10263210 摘要:一九九三年美国的克林顿政府提出了“信息高速公路”计划,从而在这十多年间在全球范围内引发了一场信息风暴,信息技术几乎触及了现代生活的方方面面,毫不夸张的说没有了信息技术,现代文明的生活将无从谈起;作为信息技术中最重要的部分,计算机技术无疑是其发展的核心问题,而我们知道计算机只是一台机器,它只能按照计算机语言编好的程序执行,那么正确认识计算机语言的过去和未来,就是关系到计算机发展的重中之重。1.引言 在计算机科学中,编程语言是用来编写可被计算机运行的一系列指令(计算机程序)的人工语言,于英语等自然语言相类似,编程语言具有词汇、语法和句法。然而,自然语言不适合计算机编程,因为它们能引起歧义,也就是说它们的词汇和语法结构可以用多种方式进行解释。用于计算编程的语言必须具有简单的逻辑结构,而且它们的语法、拼写和标点符号的规则必须精确。 2.计算机编程语言的发展历史 二十世纪四十年代当计算机刚刚问世的时候,程序员必须手动控制计算机。当时的计算机十分昂贵,唯一想到利用程序设计语言来解决问题的人是德国工程师楚泽(konrad zuse)。几十年后,计算机的价格大幅度下跌,而计算机程序也越来越复杂。也就是说,开发时间已经远比运行时间来得宝贵。于是,新的集成、可视的开发环境越来越流行。它们减少了所付出的时间、金钱(以及脑细胞)。只要轻敲几个键,一整段代码就可以使用了。这也得益于可以重用的程序代码库。随着c,pascal,fortran,等结构化高级语言的诞生,使程序员可以离开机器层次,在更抽象的层次上表达意图。由此诞生的三种重要控制结构,以及一些基本数据类型都能够很好的开始让程序员以接近问题本质的方式去思考和描述问题。随着程序规模的不断扩大,在60年代末期出现了软件危机,在当时的程序设计模型中都无法克服错误随着代码的扩大而级数般的扩大,以至到了无法控制的地步,这个时候就出现了一种新的思考程序设计方式和程序设计模型-----面向对象程 序设计,由此也诞生了一批支持此技术的程序设计语言,比如eiffel,c++,java,这些语言都以新的观点去看待问题,即问题就是由各种不同属性的对象以及对象之间的消息传递构成。面向对象语言由此必须支持新的程序设计技术,例如:数据隐藏,数据抽象,用户定义类型,继承,多态等等。 3.计算机编程语言的发展现 目前通用的编程语言有两种形式:汇编语言和高级语言。 2.1汇编语言 汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。计算机编程人员用汇编语言使机器语言程序编写起来更简单一些。在汇编语言中,每条语句大致对应一条机器语言指令。汇编语言的语句是借助易于记忆的命令编写的。在典型的汇编语言

基本演示汇编语言实验操作方法

基本演示1汇编语言实验操作方法 一.实验的基本方法(MASM宏汇编子目录下) 1.在DEBUG下运行汇编指令或简单小程序 在DEBUG提示符下,用汇编命令A:输入汇编指令或简单小程序,用单步命令T 或全程命令G来执行,并检查执行中间结果与最后结果。 2.标准汇编程序上机方法 A.建立ASM文件,用https://www.360docs.net/doc/8d6743821.html,全屏幕编辑文件或其他编辑文件建立扩展名为ASM的源程序. B.用MASM(或ASM)产生扩展名为OBJ目标文件。 C.用LINK产生扩展名为EXE可执行文件。 D.在DEBUG下,把文件调入内存,调试程序。 E.在DOS下可直接执行扩展名为EXE的文件。(详细过程) 二.汇编语言的工作环境. A.硬件环境 IBM-PC及其系列机 内存256K字节以上 外存:硬盘或至少一个软驱 CPU:80586以上 显示器:单色或彩色显示器 键盘:标准ASCII码键盘 B.软件环境 编缉程序:https://www.360docs.net/doc/8d6743821.html,或其他编缉程序 汇编程序:MASM.EXE或ASM.EXE 连接程序:LINK.EXE 调试程序:https://www.360docs.net/doc/8d6743821.html,或DEBUG.EXE

A命令 在命令A后跟地址,按回车输入程序,可以连续输入,当按下回车后,就退回到DEBUG下。 T命令

T命令为跟踪命令。 G命令 该地址指定了运行的起始地址,如不指定则从当前的cs:ip开始运行EDIT.EXE

怎样生成.exe文件

生成.obj文件

基本演示2DEBUG命令的使用 A.程序调用命令 C>DEBUG[D:][PATH][FILENAME[.EXT]][PARM1][PARM2] 其中,文件名是被调试文件的名字。如未键入文件名。可用DEBUG命令N和L 把需要文件装入存储器后再调试。D指定驱动器,PATH为路径,FILENAME为文件名,PARM为命令参数 B.显示存储单元命令 -D[ADDRESS]或;ADDRESS地址 -D[RANGE];RANGE范围 C.修改存储单元内容命令 -E ADDRESS[LIST] D.检查和修改寄存器内容命令 -R[REGISTER NAME];Register name寄存器名字 E.汇编命令 -A[ADDRESS] F.跟踪命令 -T[=ADDRESS][VALUE];Value变量值 G.运行命令 -G[=ADDRESS][ADDRESS2[ADDRESS3] H.反汇编命令 -U[ADDRESS] -U[RANGE]

汇编语言基础知识

汇编语言基础知识 汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有 效地应用汇编语言对其编程,因此,本章对硬件系统结构的问题进行部分探讨,首先介绍了计算机的基本结构、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 个内存单 元。

ARM中C语言调用汇编语言方法浅析

ARM中C语言调用汇编语言方法浅析在嵌入式系统开发中,目前使用的主要编程语言是C 和ARM指令汇编。在一些对性能非常敏感的代码块,基于汇编与机器码一一对应的关系,这时不能依靠C编译器的生成代码,而要手工编写汇编,从而达到优化的目的。 一、在C语言中内嵌汇编 在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过使用与单纯的汇编程序使用的指令略有不同,存在一些限制,主要有下面几个方面: ①不能直接向PC 寄存器赋值,程序跳转要使用B或者BL指令; ②在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突; ③R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能把R0-R3、R12及R14用于子程序调用,因此避免直接使用这些物理寄存器; d 一般不要直接指定物理寄存器; ④让编译器进行分配内嵌汇编使用的标记是__asm或asm关键字,用法如下:__asm{instruction [; instruction]}或asm("instruction [; instruction]")。 下面是一个例子来说明如何在C中内嵌汇编语言: //C语言文件*.c #include void my_strcpy(const char *src, char *dest){ char ch; __asm{ loop: ldrb ch, [src], #1 strb ch, [dest], #1 cmp ch, #0 bne loop } } int main(){ char *a="forget it and move on!"; char b[64]; my_strcpy(a, b); printf("original: %s", a); printf("copyed: %s", b); return 0; } 在此例子中C语言和汇编之间的值传递是用C语言的指针来实现的,因为指针对应的是地址,所以汇编中也可以访问。

汇编语言复习题

汇编语言复习题 第2章8086CPU寄存器的结构及使用 1.8086CPU由指令执行部件EU和总线接口部件BIU两部分组成。其中EU的功能是控制和执行指令,主要由算术逻辑部件ALU、EU控制部件、8个16位寄存器和一个标志寄存器FLAGS组成。BIU的功能是从存储器预取指令和数据,以及所有EU需要的总线操作,实现CPU与存储器和外设间信息传递。BIU由指令队列、指令指针寄存器、段寄存器、地址加器组成。 2.Intel 8086CPU共有14个16位寄存器,它们分别是通用寄存器8个即AX、BX、CX、DX、SP、BP、SI、DI,其中能用作寄存器间接寻址的寄存有BX、BP、SI和DI,控制寄存器2个即IP、PSW,段寄存器4个即DS、SS、CS和ES它们的含义分别是: 其中在编程过程中程序的段基值由汇编程序装入的段寄存器是SS和CS ,由编程者用汇编指令将段基值装入的段寄存器是DS和ES,其具体指令是MOV AX,数据段段/附加数据段名,MOV DS/ES,AX,编程人员不能用指令去取其值或给其设置给定值的寄存器是 IP ,但是可以通过某些指令的执行而自动修改其内容,如JMP NEXT指令的功能是将目的地址的偏移量送入IP。 3.PSW是程序状态字寄存器又称为标志寄存器,用来反映微处理器在程序运行时的某些状态,其中的6个状态标志位分别是OF、SF、ZF、AF、PF和CF,反映了刚执行完算术或逻辑运算指令后的某些特征。三个控制标志位是DF即方向标志、IF即中断标志位和TF陷阱标志。如两个8位的二进制数相加其状态标志位中各标志的值是多少?10110101+10011011。 4.8086CPU数据总线16根地址总线是20根能访问的最大存储空间是1MB。 第3章存储器的分段 1.在8086CPU中存储器的编址原则是按字节编址即每一个字节单元是一个存储器地址,在源程序中用常用十六进制数或符号来表示一个存储单元的地址。任何相邻的两个字节地址可以构成一个字地址,约定用较小的那个地址来表示字地址。程序员在编程时所用的地址称为逻辑地址,CPU访问的地址称为物理地址。物理地址与逻辑地址的关系是:物理地址=段基值*16+偏移地址。如有下列存储器的结构请按要求回答问题: ① 0002H的字节地址的内容是多少? ② 0002H的字地址的内容是多少? ③若该存储地址所在的数据段的段基值是0F3BH,则逻辑地址 为0004H的物理地址是多少?该物理地址的字单元内容是多少? ④物理地址是0F3B1H的字节单元内容是多少?

浅谈对C语言的认识

浅谈对C语言的认识 摘要:C语言作为一种通用的命令式计算机编程语言,提供了有效利用汇编语言的途径,使低级的机器指令能以简易的方式进行编译。随着C语言的国际标准化,它已经成为有史以来使用最广泛的编程语言之一,对计算机编程领域产生了不可估量的影响。计算机编程爱好者和专业人士都应当学习C语言,为学习高级编程语言奠定坚实的编程基础。本文从C语言的语法特点、数据结构、应用以及衍生等方面进行简要介绍,旨在提供入门知识的浅显参考。 关键字:C语言;语法特点;数据结构 一、C语言的语法特点 1. 字符集 C语言的基本字符集包括基本拉丁字母小写和大写字母(a-z,A-Z)、十进制数字(0-9)、特殊图形字符(!@#$%^&*()[]{};:’”,<.>/?`~\|)以及空白字符(空格、水平制表符、垂直制表符、换页符、换行符)。虽然换行符只是表示文本行的结尾,实际并不需要与某个字符对应,但是为了方便,C语言中它仍然被认为是一个字符。字符串文字使得C语言可以进行多字节字符编码,并且C标准库中自带字符串操作函数。C语言的可执行字符集包含相同的字符,以及警报、退格和回车等。随着C语言标准的不断修订,对扩展字符集的支持逐渐在增加。

2. 关键字 C语言中定义了一些特殊的关键字,只能用于C语言编译本身使用,而不能用于如命名之类的操作。在C语言标准C89中有32个常见关键字,如double、int、Char等数据型关键字,以及if、else、break、Continue等控制型关键字。后来的C99和C11标准又分别提出了5个和7个关键字,如_Bool、_Alignas等。大多数最新的关键字都是以下划线开头,后面跟着一个大写字母。当C开始支持这些扩展关键字时,以前留存的C程序代码没有使用过这些关键字,因此不会受到任何影响,在无需任何改动的情况下仍可继续使用。 3. 运算符 运算符是语句表达式中,用于指定执行该表达式时要执行的具体操作。C语言支持相当多的运算符,如加(+)、减(-)、乘(*)、除(/)、余(%)等算术符,赋值符(=)、大于(>)、小于(<)、不大于(<=)、不小于(>=)等关系符。C语言遵循Fortran和PL/I的语言习惯,用等于号(=)来表示赋值,但与ALGOL 等语言不同,C使用(==)来检验是否相等。如果混淆这两个运算符(=和==),很容易导致意外的错误,并且在很多情况下不会产生错误信息,例如条件表达式if (a==b+1)和if (a=b+1)都可以编译通过,但运行结果是截然不同的。 二、C语言的数据结构 C语言中的数据是静态的,有各种大小的整数类型(有符号和无符号)、浮点数和枚举类型,以及派生类型,包括数组、指针等。 1. 指针 C语言支持使用指针,这是一种在内存中记录对象或函数的地址或地址引用的数据类型。指针可以被间接用于访问存储在指向地址的数据,或调用指向函数,通过赋值或指针算术即可操作指针。指针在C语言中用途繁多,例如文本字符串通常使用指针指向字符数组,动态内存分配使用指针执行,许多如树这样的数据类型通常采用指针链接在一起的方式进行动态分配结构对象。指针的使用需格外小心,因为它们通常是未选中的,可以使指针变量指向任意位置,这可能会导致意外的错误。所幸的是,C语言允许指针类型之间进行操作和转换,能够有效地将指针指向安全的地方。 2. 数组

汇编语言实现文本编辑器

汇编语言课程设计 题目文本方式下字处理程序的设计与实现 学院计算机科学与技术学院 专业计算机科学与技术 班级计算机科学与技术0705 课程设计任务书 题目: 文本方式下字处理程序的设计与实现 初始条件: 理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。 实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等 具体要求) 理解键盘和显示器接口的工作原理,掌握BIOS键盘和显示器中断调用的使用方法,掌握复杂内存数据结构的定义和管理方法。具体的设计任务及要求: 1)清晰且易于操作的用户界面;动态显示光标的当前位置; 2)在文本编辑区接受并保存输入信息; 3)光标上移,下移,左移,右移; 4)允许删除当前光标前的字符; 5)将编辑文本存盘,读出并显示硬盘中的指定文件。(任选) 在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。 阅读资料:

1)《IBM—PC汇编语言程序设计实验教程》3.3节 2)《IBM—PC汇编语言程序设计(第2版)》9.1节 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试,和验收。 周5:撰写课程设计报告。 指导教师签名:年月日 系主任(或责任教师)签名:年月日 一、系统描述 1、目的 (1)掌握计算机汇编语言的使用。学完汇编课程,理解和掌握键盘和显示器接口的工作原理,掌握BIOS键盘和显示器中断调用的使用方法,掌握复杂内存数据结构 的定义和管理方法。 (2)通过设计、编制、调试一个文本方式下字处理程序。实现一个简单的文本编辑器的基本功能 2、设计内容 1)清晰且易于操作的用户界面; 2)动态显示光标的当前位置; 3)在文本编辑区可以输入字符信息; 4)光标上移,下移,左移,右移,还可以回车,使用home键、end键退格键; 5)允许删除当前光标前的字符; 6)将编辑文本存盘,读出并显示硬盘中的指定文件。 3、开发平台 所使用的系统:Windows XP 程序开发工具:Masn for Windows 6.0 集成实验开发环境 序设计语言:IBM-PC 汇编语言 二、文本编辑译系统的概要设计 文本编辑程序要实现简单的文本编辑器基本功能。 1.设计一个友好,易于操作的界面,界面可仿照windows记事本,但windows记事本 的菜单项不好制作,所以将主要功能说明制作到边框,方便使用即可。并且实现在

汇编语言,led点亮

《单片机应用设计》课程设计 专业:自动化 姓名: 学号: 同组人员: 指导教师: 日期:

单片机应用设计课程设计 设计题目 1个按键:无按键时,8个LED全亮,按下1次,8个Led依次点亮,持续1S。连续按两次,8个Led以相反的次序依次点亮。

单片机应用设计课程设计 第一部分系统设计分析 硬件分析 1.LED灯采用共阳极接法,本题中则将P1口对应各位赋低电平即可点亮LED灯。 2.p 3.5接按键。 软件分析 第二部分硬件电路设计及实现

单片机应用设计课程设计 第三部分软件设计 ORG 0000H LJMP MAIN ;中断入口 ORG 000BH LJMP DIER KEY BIT P3^4 LED EQU P1 MAIN: MOV R2,#0 ;R2清零 MOV LED,#0 ;八个二极管全亮 MOV R3,#10 MOV TMOD,#01H;选择定时器0的定时器方式1 ;赋初值3CB0H即15536 MOV TL0,#0B0H MOV TH0,#3CH SETB EA ;打开总中断 SETB ET0 ;允许定时器0中断 ;第一次按键检测 KEY_SCAN:JNB KEY, YN1 ;为零则转移,即为按下 AJMP KEY_SCAN YN1:LCALL DEL1MS JNB KEY,Y1 ;判断是否真的按下,真的按下了,则转移 AJMP KEY_SCAN Y1:LCAL L DEL1MS JB KEY,SSH ;检测是否松手,松手转移 AJMP Y1 SSH:SETB TR0 ;打开定时器0 CJNE R2,#1,$ ;检测R2是否为一,不为一则等待 CLR TR0 ;关闭定时器 AJMP MAIN ;跳回主程序 ;第二次键盘检测,每50ms检测一次,检测10次,即为500ms DIER:JNB KEY, LED_2 ;检测键盘是否按下,按下则转移 DJNZ R3,CZ ;R3减一是否为零,不为零则转移 AJMP LED_1 ;延迟500ms后没有第二次按下,跳到LED_1 LED_1:MOV R4,#8 MOV A,#0FEH ;LED顺序循环程序 LOOP1:MOV LED,A LCALL DEL1S

汇编语言上机操作及程序调试的方法

汇编语言上机操作及程序调试的方法第一节在IBM-PC机上运行汇编源程序所必备的软件 为了在IBM-PC机上运行汇编源程序,机器上必须有DOS操作系统环境,DOS系统盘上应有下列文件: EDIT 文件编辑程序 MASM 宏汇编程序 LINK 链接程序 DEBUG 调试程序 第二节在IBM-PC机上运行汇编源程序的步骤 当用户编制好汇编语言源程序之后,要在机器上运行,必须经过以下几个步骤: 1.用EDIT命令建立与修改汇编源程序文件(ASM文件) 源程序就是用汇编语言的语句编写的程序,必须以ASM为附加文件名。2.用MASM命令汇编源文件以产生相应的目标文件(OBJ文件) 3.用LINK命令连接目标文件以产生可执行文件(EXE文件) 4.调试、运行可执行文件

上机过程示意图如下: 汇编语言程序 编辑程序 汇编程序 连接程序 调试程序 有错吗? 运行程序 Y N 图2-1 汇编语言程序上机过程流程 第三节 DEBUG 程序调用及汇编语言程序调试方法 调试程序DEBUG 是DOS 支持的又一种系统软件,主要用于汇编语言程序的调试。汇编和连接过程只能查出源程序的语法错误,不能查出功能上的错误和程序不完善的地方。 一、DEBUG 程序的启动 DEBUG 程序有两种启动方法。 第一种启动方法:只要打入DEBUG 和回车键,就可以把它装入内存。但是这样启动只把DEBUG 程序本身装入内存并进入等待DEBUG 命令状态,还没有把要调试的程序装入内存。 第二种启动DEBUG 的程序的方法是一次相继装入DEBUG 程序和要调试的程序。打入的命令格式如下: DEBUG[d :][path]filename[.ext][parml]Lparm2] 其中的Filename 是要调试程序的文件名,可选项[d:][path]和[.ext]分别是要调试程序的所在盘符、路径和扩展名。可选项[parml]和[parm2]是DEBUG 程序为要调试程序准备的参数(一般不用)。 例 进入DEBUG 程序并装入要调试程序,要调试程序在A 驱动器中。其操

汇编语言实现冒泡排序(一)

;用汇编语言实现实现冒泡排序,并将排序后的数输出 DATAS SEGMENT A dw 100,344,3435,43433,3438,343,134,80,8,1000,65535,54,45 N=$-A ;计算数字所占的字节数 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START:MOV AX,DATAS MOV DS,AX MOV SI,0 ;SI遍历数字;前一个数的地址 MOV CX,N/2-1 ;设置循环次数,M(M=N/2)个数需要,循环M-1次 CALL BUBBLE ;调用BUBBLE将原来的数排序 ;输出排序后的数 MOV CX,N/2 ;循环M次输出排序后的M个数 MOV SI,0 ;SI遍历排序后的数 MOV DI,0 ;用DI记录数字的位数 MOV BP,N+5 ;BP用于遍历存储的转化后的字符的位置 SHOW: PUSH CX ;循环次数入栈 MOV DX,0 ;由于将要进行16位除需要置高16位为0 MOV AX,[SI] ;低16位为排序后的数 CALL DTOC ;调用DTOC将十进制数转换为字符串 CALL SHOW_STR ;调用SHOW_STR将一个数转化得到的字符串输出ADD SI,2 ;下一个数 POP CX ;循环次数出栈栈 LOOP SHOW MOV AH,4CH INT 21H ;冒泡排序 BUBBLE PROC L1: PUSH CX ;将循环次数入栈 LEA SI,A ;SI遍历DATAS数据段的数字 L2: MOV AX,A[SI] ;将前一个数存于AX CMP AX,A[SI+2] ;比较前后两个数 JBE NEXT ;如果前一个数小于或等于后一个数则继续本轮的比较XCHG AX,A[SI+2] ;否则,交换前后两个数的位置 MOV A[SI],AX NEXT:ADD SI,2 ;下一个数 LOOP L2 ;注意内层循环的次数已经确定了 POP CX ;将循环次数出栈 LOOP L1 ;下一轮比较 RET BUBBLE ENDP

汇编语言小程序

16进制转化为10进制STACK SEGMENT STACK'STACK' DW100H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT KEYBUFFER DB100 ;DB ? ;DB 100 DUP(?) DECIMAL DB 5 DUP(?) STRING1 DB'PLEASE INPUT DECIMAL DATA:$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,CS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SS,AX LEA SP,TOP LEA DX,STRING1 MOV AH,09H INT 21H MOV AH,0AH LEA DX,KEYBUFFER ;MOV AX,23456 INT 21H ;LEA SI,KEYBUFFER MOV AX,DX LEA DI,DECIMAL CALL DISPAX MOV AH,4CH MOV AL,0 INT 21H DISPAX PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI LEA DI,DECIMAL

CALL TRANS16TO10 MOV CX,5 LEA DI,DECIMAL+4 MOV AH,2 DISPAXD: MOV DL,[DI] ADD DL,30H DEC DI INT 21H LOOP DISPAXD POP DI POP DX POP CX POP BX POP AX RET DISPAX ENDP TRANS16TO10 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV BX,10 MOV CX,5 LOOP1: XOR DX,DX DIV BX MOV[DI],DX INC DI LOOP LOOP1 LEA DX,DECIMAL MOV AH,09H INT 21H POP DI POP DX POP CX POP BX POP AX RET TRANS16TO10 ENDP

浅析汇编语言中寻址方式的区别

浅析汇编语言中寻址方式的区别 浅析汇编语言中寻址方式的区别 浅析汇编语言中寻址方式的区别王传俊寻址方式是汇编语言中的一个重要内容,是学习编程的基础,同时也是该门课程的一个学习难点。本文通过以Inte18086CPU为例,使用分析比较的方法阐述了各寻址方式间的区别。汇编语言寻址方式有效地址物理地址在计算机应用技术的发展过程中,汇编语言是一座连接软件和硬件的桥梁,也是计算机能够提供给用户最快而又最有效的语言。汇编语言不同于用O,1数字表示的机器语言,它是用人们熟悉的英文缩写字符表示相应的操作码,用符号或数值表示地址和操作数。因此,汇编语言为程序的编写、阅读和修改提供了方便。但由于汇编语言仍是一种面向机器的语言,所以在进行程序设计时必须考虑到机器的指令系统、寻址方式及存储设备的设置和功能,而熟悉并灵活地应用机器所采用的各种寻址方式,是运用汇编语言进行程序设计的根本。而一个指令系统具有哪几种寻址方式,是否为编写程序提供方便,是指令系统设计的关键,同时也是初学者学习汇编语言的难点。在教学过程中,通常选用Inte18086CPU的PC机为基础机型来组织教学。Inte18086提供了九类寻址方式,它们分别是立即寻址、寄存器寻址、寄存器间接寻址、直接寻址、变址寻址、基址变址寻址、串寻址、端口寻址和隐含寻址。由于Inte18086中的寻址方式有相似之处,极易混淆。在教学过程中,应使学生抓住各种寻址方式的特点,找出它们之间的区别和联系,从而形成正确的概念。什么是寻址方式呢?这是首先要明确的概念。一个指令是由操作码和操作数两部分组成的。操作数在存储器中存放的位置,称为操作数地址。获得操作数地址的方式,就称为操作数地址的寻址方式,简称寻址方式。在寻址过程中,操作数的存放位置决定着寻址的方式。在汇编语言的学习过程中,区分“存放位置”是理解寻址方式的’前提。因此,在学习之前应使学生理解寄存器和存储器的不同。寄存器位于CPU内部,它的存取速度比存储器要快得多。在计算机的运算过程中寄存器主要用来存放运算过程中的各种信息,包括操作数地址,操作数和运算的中间结果。存储器是由许多存储单元组成的,每个单元有唯一确定的地址。它是计算机的记忆场所,能把计算和处理的数据及程序存入计算机,使计算机自主工作,免受其

相关文档
最新文档