当前位置:文档之家› 汇编语言入门教程

汇编语言入门教程

汇编语言入门教程
汇编语言入门教程

汇编语言入门教程

一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括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):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放数值的储存位置,叫“地址”。8086地址总线有20位,所以CPU 拥有达1M的寻址空间,这也是DOS的有效控制范围,而8086能做的运算仅限于处理16位数据,即只有0到64K,所以,必须用分段寻址才能控制整个内存地址。完整的20位地址可分成两部份:1.段基址(Segment):16位二进制数后面加上四个二进制0,即一个16进制0,变成20位二进制数,可设定1M中任何一个64K段,通常记做16位二进制数;2.偏移量(Offset):直接使用16位二进制数,指向段基址中的任何一个地址。如:2222(段基址):3333(偏移量),其实际的20位地址值为:25553。除了上述营养要充分吸收外,你还要知道什么是DOS、BIOS功能调用,简单的说,功能调用类似于WIN95 API,相当于子程序。汇编写程序已经够要命了,如果不用MS、IBM的子程序,这日子真是没法过了(关于功能调用详见《电脑爱好者》98年11期)。

编写汇编语言有两种主要的方法:1.使用MASM或TASM等编译器;2.使用除错程序https://www.doczj.com/doc/91553733.html,。DEBUG其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG 更是最佳的入门工具。因为DEBUG操作容易:只要键入DEBUG回车,A回车即可进行汇编,过程简单,而使用编译器时,必须用到文本编辑器、编译器本身、LINK以及EXE2BIN等程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序,必须加入许多与指令语句无关的指示性语句,以供编译器识别,使用 DEBUG 可以避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外,还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG是为了让我们接触硬件而设计的。(8086常用指令用法将在每个汇编程序中讲解,限于篇幅,不可能将所有指令列出)。

DEBUG的的A命令可以汇编出简单的COM文件,所以DEBUG编写的程序一定要由地址 100h(COM文件要求)开始才合法。FOLLOW ME,SETP BY SETP(步步回车):

输入 A100 ;从DS:100开始汇编

2.输入 MOV DL,1 ;将数值 01h 装入 DL 寄存器

3.输入 MOV AH,2 ;将数值 02h 装入 DL 寄存器

4.输入 INT 21 ;调用DOS 21号中断2号功能,用来逐个显示装入DL

的字符

5.输入 INT 20 ;调用DOS 20号中断,终止程序,将控制权交回给 DEBUG

6.请按 Enter 键

7.现在已将汇编语言程序放入内存中了,输入 G(运行)

8.出现结果:输出一个符号。

ㄖ←输出结果其实不是它,因WORD97无法显示原结果,故找一赝品将就着。

Program terminated normally

我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就是以机器码来执行程序。

1.输入 U100,106

1FED:0100 B201 MOV DL,01

1FED:0102 B402 MOV AH,02

1FED:0104 CD21 INT 21

1FED:0106 CD20 INT 20

DEBUG可以用R命令来查看、改变寄存器内容。CS:IP寄存器,保存了将执行指令地址。

1.输入R

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC 1FED:0100 B201 MOV DL,01

当程序由DS:100开始执行,那么终止程序时,DEBUG会自动将IP内容重

新设定为100。当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。但一定要为COM文件,否则无法以DEBUG载入。

输入N https://www.doczj.com/doc/91553733.html, ;我们得告诉DEBUG程序长度:程序从100开始到106,故占用7

;字节。我们利用BX存放长度值高位部分,而以CX存放低位部分。

2.输入RBX ;查看 BX 寄存器的内容,本程序只有7个字节,故本步可省略

3.输入 RCX ;查看 CX 寄存器的内容

4.输入 7 ;程序的字节数

5.输入 W ;用W命令将该程序写入(Write)磁盘中

修行至此,我们便可以真正接触8086汇编指令了。当我们写汇编语言程序的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符号,告诉CPU应执行何种运算。也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计的。

现在,我们再来剖析一个可以将所有ASCII码显示出来的程序。

1. 输入 DEBUG

2. 输入 A100

3.输入 MOV CX,0100 ;装入循环次数

MOV DL,00 ;装入第一个ASCII码,随后每次循环装入新码

MOV AH,02

INT 21

INC DL ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1

LOOP 0105 ;LOOP:循环指令,每执行一次LOOP,CX值减1,并跳

;到循环的起始地址105,直到CX为0,循环停止

INT 20

4.输入 G即可显示所有ASCII码

当我们想任意显示字符串,如:UNDERSTAND?,则可以使用DOS21H号中断9H号功能。输入下行程序,存盘并执行看看:

1.输入 A100

MOV DX,109 ;DS:DX =字符串的起始地址

MOV AH,9 ;DOS的09h功能调用

INT 21 ;字符串输出

INT 20

DB 'UNDERSTAND?$';定义字符串

在汇编语言中,有两种不同的指令:1.正规指令:如 MOV 等,是属于CPU 的指令,用来告诉CPU在程序执行时应做些什么,所以它会以运算码(OP-code)的方式存入内存中;2.伪指令:如DB等,是属于DEBUG等编译器的指令,用来告诉编译器在编译时应做些什么。DB(Define Byte)指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。使用 9H 功能的字符串必须以$结尾。用D命令可用来查看DB伪指令将那些内容放入内存。

6.输入 D100

1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 ......!. underst

1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19

and$.F..E..F4.d.

1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57

56 .E.3.^_.......WV

1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.....S.....2...

1975:0140 74 05 33 C0 99 EB 17 8B-45 0C E8 D4 97 8B F0 89

t.3.....E.......

1975:0150 56 FE 0B D0 74 EC 8B 45-08 03 C6 8B 56 FE 5E 5F V...t..E....V.^_

1975:0160 C9 C3 C8 02 00 00 6B D8-0E 81 C3 FE 53 89 5E

FE ......k.....S.^.

1975:0170 8B C2 E8 FB FD 0B C0 75-09 8B 5E FE 8B 47 0C

E8 .......u..^..G..

现在,我们来剖析另一个程序:由键盘输入任意字符串,然后显示出来。db 20指示DEBUG保留20h个未用的内存空间供缓冲区使用。

输入A100

MOV DX,0116 ;DS:DX =缓冲区地址,由DB伪指令确定缓冲区地址

MOV AH,0A ;0Ah 号功能调用

INT 21 ;键盘输入缓冲区

MOV DL,0A ;由于功能Ah在每个字符串最后加一个归位码(0Dh由 Enter MOV AH,02 ;产生),使光标自动回到输入行的最前端,为了使新输出的 INT 21 ;字符串不会盖掉原来输入的字符串,所以利用功能2h加一

;个换行码(OAh),使得光标移到下一行的的最前端。

MOV DX,0118 ;装入字符串的起始位置

MOV AH,09 ;9h功能遇到$符号才会停止输出,故字符串最后必须加上

INT 21 ;$,否则9h功能会继续将内存中的无用数据胡乱显示出来

INT 20

DB 20 ;定义缓冲区

送你一句话:学汇编切忌心浮气燥。

客套话就不讲了。工欲善其事,必先利其器。与其说DEBUG 是编译器,倒

不如说它是“直译器”,DEBUG的A命令只可将一行汇编指令转成机器语言,且立刻执行。真正编译器(MASM)的运作是利用文本编辑器(EDIT等)将汇编指

令建成一个独立且附加名为.ASM的文本文件,称源程序。它是MASM 程序的输入部分。MASM将输入的ASM文件,编译成.OBJ文件,称为目标程序。OBJ文件仅

包含有关程序各部份要载入何处及如何与其他程序合并的信息,无法直接载入内存执行。链结程序LINK则可将OBJ文件转换成可载入内存执行(EXEcute)的EXE文件。还可以用EXE2BIN,将符合条件的EXE文件转成COM文件(COM 文件不但占用的内存最少,而且运行速度最快)。

下面我们用MASM写一个与用DEBUG写的第一个程序功能一样的程序。

用EDIT编辑一个SMILE.ASM的源程序文件。

源程序 DEBUG 程序

prognam segment

assume cs:prognam

org 100h A100

mov dl,1 mov dl,1

mov ah,2 mov ah,2

int 21h int 21

int 20h int 20

prognam ends

end

比较一下:1.因为MASM会将所有的数值假设为十进制,而DEBUG则只使用十六进制,所以在源程序中,我们必须在有关数字后加上代表进制的字母,如H 代表十六进制,D代表十进制。若是以字母开头的十六进制数字,还必须在字母

前加个0,以表示它是数,如0AH。2.源程序增加五行叙述:prognam segment 与prognam ends 是成对的,用来告诉 MASM 及LINK,此程序将放在一个称为PROGNAM(PROGram NAMe)的程序段内,其中段名(PROGNAM)可以任取,但其位置必须固定。assume cs:prognam 必须在程序的开头,用来告诉编译器此程序所在段的位置放在CS寄存器中。end用来告诉MASM,程序到此结束, ORG 100H作用相当于DEBUG的A100,从偏移量100开始汇编。COM 文件的所有源程序都必须

包含这五行,且必须依相同的次序及位置出现,这点东西记下就行,千篇一律。接着,我们用MASM编译SMILE.ASM。

输入MASM SMILE ←不用打入附加名.ASM。

Microsoft (R) Macro Assembler Version 5.10

Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.

Object filename [SMILE.OBJ]: ←是否改动输出OBJ文件名,如不改就ENTER

Source listing [NUL.LST]: ← 是否需要列表文件(LST),不需要就ENTER Cross-reference [NUL.CRF]: ←是否需要对照文件(CRF),不需要则ENTER 50162 + 403867 Bytes symbol space free

0 Warni ng Errors ←警告错误,表示编译器对某些语句不理解,通常是输入错误。

0 Severe Errors ←严重错误,会造成程序无法执行,通常是语法结构错误。

如果没有一个错误存在,即可生成OBJ文件。OBJ中包含的是编译后的二进制结果,它还无法被 DOS载入内存中加以执行,必须加以链结(Linking)。以LINK将OBJ文件(SMILE.OBJ)链结成 EXE 文件(SMILE.EXE)时,。

1.输入LINK SMILE ←不用附加名OBJ

Microsoft (R) Overlay Linker Version 3.64

Copyright (C) Microsoft Corp 1981, 1988. All rights reserved.

Run File [SMILE.EXE]: ← 是否改动输出EXE文件名,如不改就ENTER List File [NUL.MAP]: ← 是否需要列表文件(MAP),不需要则ENTER Libraries [.LIB]: ←是否需要库文件,要就键入文件名,不要则ENTER LINK : warning L4021: no stack segment← 由于COM文件不使用堆栈段,所以错误信息

←"no stack segment"并不影响程序正常执行

至此已经生成EXE文件,我们还须使用EXE2BIN 将EXE文件(SMILE.EXE),转换成COM文件(https://www.doczj.com/doc/91553733.html,)。输入EXE2BIN SMILE产生 BIN 文件(SMILE.BIN)。其实 BIN 文件与 COM 文件是完全相同的,但由于DOS只认COM、EXE及BAT文件,所以BIN文件无法被正确执行,改名或直接输入 EXE2BIN SMILE https://www.doczj.com/doc/91553733.html, 即可。现在,磁盘上应该有 https://www.doczj.com/doc/91553733.html, 文件了,你只要在提示符号C:>下,直接输入文件名称 SMILE ,就可以执行这个程序了。

你是否觉得用编译器产生程序的方法,比 DEBUG 麻烦多了!以小程序而言,的确是如此,但对于较大的程序,你就会发现其优点了。我们再将ASCII程序以

编译器方式再做一次,看看有无差异。首先,用https://www.doczj.com/doc/91553733.html,建立 ASCII.ASM 文件。

prognam segment ;定义段

assume cs:prognam ;把上面定义段的段基址放入 CS

mov cx,100h ; 装入循环次数

mov dl,0 ; 装入第一个ASCII码,随后每次循环装入新码

next: mov ah,2

int 21h

inc dl ;INC:递增指令,每次将数据寄存器 DL 内的数值加 1

loop next ; 循环指令,执行一次,CX减1,直到CX为0,循环停止

int 20h

prognam ends ;段终止

end ;汇编终止

在汇编语言的源程序中,每一个程序行都包含三项元素:

start: mov dl,1 ;装入第一个ASCII码,随后每次循环装入新码

标识符表达式注解

在原始文件中加上注解可使程序更易理解,便于以后参考。每行注解以“;”与程序行分离。编译器对注解不予理会,注解的数据不会出现在OBJ、EXE或COM 文件中。由于我们在写源程序时,并不知道每一程序行的地址,所以必须以符号名称来代表相对地址,称为“标识符”。我们通常在适当行的适当位置上,键入标识符。标识符(label)最长可达31 个字节,因此我们在程序中,尽量以简洁的文字做为标识符。现在,你可以将此ASCII.ASM 文件编译成 https://www.doczj.com/doc/91553733.html, 了。

1.MASM ASCII,

2.LINK ASCII,

3.EXE2BIN ASCII https://www.doczj.com/doc/91553733.html,。

注意:当你以编译器汇编你设计的程序时,常会发生打字错误、标识符名称拼错、十六进制数少了h、逻辑错误等。汇编老手常给新人的忠告是:最好料到自己所写的程序一定会有些错误(别人告诉我的);如果第一次执行程序后,就得到期望的结果,你最好还是在检查一遍,因为它可能是错的。原则上,只要大体的逻辑架构正确,查找程序中错误的过程,与写程序本身相比甚至更有意思。写大程序时,最好能分成许多模块,如此可使程序本身的目的较单纯,易于撰写与查错,另外也可让程序中不同部份之间的界限较清楚,节省编译的时间。如果读程序有读不懂的地方最好用纸笔记下有关寄存器、内存等内容,在纸上慢慢比划,就豁然开朗了。下面我们将写一个能从键盘取得一个十进制的数值,并将其转换成十六进制数值而显示于屏幕上的“大程序”。前言:要让8086执行这样的功能,我们必须先将此问题分解成一连串的步骤,称为程序规划。首先,以流程图的方式,来确保整个程序在逻辑上没有问题(不用说了吧!什么语言都要有此步骤)。这种模块化的规划方式,称之为“由上而下的程序规划”。而在真正写程序时,却是从最小的单位模块(子程序)开始,当每个模块都完成之后,再合并成大程序;这种大处著眼,小处著手的方式称为“由下而上的程序设计”。

我们的第一个模块是BINIHEX,其主要用途是从8086的BX寄存器中取出二进制数,并以十六进制方式显示在屏幕上。注意:子程序如不能独立运行,实属正常。

binihex segment

assume cs:binihex

mov ch,4 ;记录转换后的十六进制位数(四位)

rotate: mov cl,4 ;利用CL当计数器,记录寄存器数位移动次数

rol bx,cl ;循环寄存器BX的内容,以便依序处理4个十六进制数

mov al,bl ;把bx低八位bl内数据转移至al

and al,0fh ;把无用位清零

add al,30h ;把AL内数据加30H,并存入al

cmp al,3ah ;与3ah比较

jl printit ;小于3ah则转移

add al,7h ;把AL内数据加30H,并存入al

printit:mov dl,al ;把ASCII码装入DL

mov ah,2

int 21h

dec ch ;ch减一,减到零时,零标志置1

jnz rotate ;JNZ:当零标志未置1,则跳到指定地址。即:不等,则转移 int 20h ;从子程序退回主程序

binihex ends

end

利用循环左移指令ROL循环寄存器BX(BX内容将由第二个子程序提供)的内容,以便依序处理4个十六进制数:1. 利用CL当计数器,记录寄存器移位的次数。2.将BX的第一个十六进制值移到最右边。利用 AND (逻辑“与”运算:对应位都为1时,其结果为1,其余情况为零)把不要的部份清零,得到结果:先将BL值存入AL中,再利用AND以0Fh(00001111)将AL的左边四位清零。由于0到9的ASCII码为30h到39h,而A到F之ASCII码为41h到46h,间断了7h,所以得到结果:若AL之内容小于3Ah,则AL值只加30h,否则AL再加7h。ADD指令会将两个表达式相加,其结果存于左边表达式内。标志寄存器(Flag Register)是一个单独的十六位寄存器,有9个标志位,某些汇编指令(大部份是涉及比较、算术或逻辑运算的指令)执行时,会将相关标志位置1或清0,常碰到的标志位有零标志(ZF)、符号标志(SF)、溢出标志(OF)和进位标志(CF)。标志位保存了某个指令执行后对它的影响,可用其他相关指令,查出标志的状态,根据状态产生动作。CMP指令很像减法,是将两个表达式的值相减,但寄存器或内存的内容并未改变,只是相对的标志位发生改变而已:若 AL 值小于 3Ah,则正负号标志位会置0,反之则置1。 JL指令可解释为:小于就转移到指定位置,大于、等于则向下执行。CMP和JG 、JL等条件转移指令一起使用,可以形成程序的分支结构,是写汇编程序常用技巧。

第二个模块DECIBIN 用来接收键盘打入的十进制数,并将它转换成二进制数放于BX 寄存器中,供模块1 BINIHEX使用。

decibin segment

assume cs:decibin

mov bx,0 ;BX清零

newchar:mov ah,1 ;

int 21h ;读一个键盘输入符号入al,并显示

sub al,30h ;al减去30H,结果存于al中,完成ASCII码转二进制码

jl exit ;小于零则转移

cmp al,9d

jg exit ;左>右则转移

cbw ;8位al转换成16位ax

xchg ax,bx ;互换ax和bx内数据

mov cx,10d ;十进制数10入cx

mul cx ;表达式的值与ax内容相乘,并将结果存于ax

xchg ax,bx

add bx,ax

jmp newchar ;无条件转移

exit: int 20 ;回主程序

decibin ends

end

CBW 实际结果是:若AL中的值为正,则AH填入00h;反之,则AH填入FFh。XCHG常用于需要暂时保留某个寄存器中的内容时。

当然,还得一个子程序(CRLF)使后显示的十六进制数不会盖掉先输入的十进制数。

crlf segment

assume cs:crlf

mov dl,0dh ;回车的ASCII码0DH入DL

mov ah,2

int 21h

mov dl,0ah ;换行的ASSII码0AH入AH

mov ah,2

int 21h

int 20 ;回主程序

crlf ends

end

现在我们就可以将BINIHEX、DECIBIN及CRLF等模块合并成一个大程序了。首先,我们要将这三个模块子程序略加改动。然后,再写一段程序来调用每一个子程序。

crlf proc near;

mov dl,0dh

mov ah,2

int 21h

mov dl,0ah

mov ah,2

int 21h

ret

crlf endp

类似SEGMENT与ENDS的伪指令,PROC与ENDP也是成对出现,用来识别并定义一个程序。其实,PROC 真正的作用只是告诉编译器:所调用的程序是属于

近程(NEAR)或远程(FAR)。一般的程序是由 DEBUG 直接调用的,所以用 INT 20 返回,用 CALL 指令所调用的程序则改用返回指令RET,RET会把控制权转移到栈顶所指的地址,而该地址是由调用此程序的 CALL指令所放入的。

各模块都搞定了,然后我们把子程序组合起来就大功告成

decihex segment ;主程序

assume cs:decihex

org 100h

mov cx,4 ;循环次数入cx;由于子程序要用到cx,故子程序要将cx入栈 repeat: call decibin;调用十进制转二进制子程序

call crlf ;调用添加回、换行符子程序

call binihex ;调用二进制转十六进制并显示子程序

call crlf

loop repeat ;循环4次,可连续运算4次

mov ah,4ch ; 调用DOS21号中断4c号功能,退出程序,作用跟INT 20H int 21H ; 一样,但适用面更广,INT20H退不出时,试一下它

decibin proc near push cx ;将cx压入堆栈,;

┇ exit: pop cx ;将cx还原; retdecibin endp binihex proc near push cx

┇ pop cx retbinihex endp crlf proc near

push cx

┇ pop cx retcrlf endpdecihex ends end

CALL指令用来调用子程序,并将控制权转移到子程序地址,同时将CALL的下行一指令地址定为返回地址,并压入堆栈中。CALL 可分为近程(NEAR)及远程(FAR)两种:1.NEAR:IP的内容被压入堆栈中,用于程序与程序在同一段中。

2.FAR:CS 、IP寄存器的内容依次压入堆栈中,用于程序与程序在不同段中。PUSH、POP又是一对指令用于将寄存器内容压入、弹出,用来保护寄存器数据,子程序调用中运用较多。堆栈指针有个“后进先出”原则,像PUSH AX,PUSH BX…POP BX,POP AX这样才能作到保护数据丝毫不差。

汇编语言超浓缩教程到这要告一段落了,希望能奠定你独立设计的基础。而更多更好的技巧则全依赖你平时的积累了。祝你成功!

汇编语言 快速入门

“哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用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

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

汇编学习从入门到精通Step By Step 2007年12月15日星期六00:34 信息来源:https://www.doczj.com/doc/91553733.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:

计算机组成原理与汇编语言(课后习题).

《计算机组成原理与汇编语言》习题 第一章 1. 计算机中为什么都采用二进制数而不采用十进制数? 2. 写出下列用原码或补码表示的机器数的真值: a (1 01101101 (2 10001101 (3 01011001 (4 11001110 3. 填空: a (1 (123410=(2=(16 b (2 (34.687510=(2=(16 c (3 (271.33 10 = ( 2= ( 16 d (4 (101011001001 2 = ( 10 = ( 16 e (5 (1AB.E 16 = ( 10 = ( 2 f (6 (10101010.0111 2= ( 10 = ( 16 4. 已知X=36,Y=-136,Z=-1250,请写出X、Y、Z的16位原码、反码、和补码。 5. 已知[X]补=01010101B,[Y]补=10101010B,[Z]补=1000111111111111B,求X、Y、Z及X+Y,Y-Z的十进制值为多少? 6. 用8位补码进行下列运算,并说明运算结果的进位和溢出: a (1 33+114 (233-114 (3(-33+114 (4(-33 -114 7. 将下列十进制数表示为8421BCD码: (18609 (25254 (32730 (42998

8. 将下列8421BCD码表示为十进制数和二进制数: a (101111001 (2001010000101 (3022********* (4 010********* 9. 将下列数值或字符串表示为相应的ASCII码: (151 (27FH (3C6H (4Computer (5 how are you? 10. 定点数和浮点数表示方法各有什么特点? 11. 微处理器、微型计算机和微型计算机系统三者之间有什么不同? 12. 微型计算机由哪几部分组成,各部分功能是什么? 13. CPU在内部结构上由哪几部分组成,CPU应具备什么功能? 14. 简述计算机执行指令和执行程序的过程。以书中的例子为例,说明在此三条指令执行中,哪些信号属于数据流,哪些信号属于控制流? 15. 微型计算机外部为什么采用三总线结构? 16. 数据总线和地址总线在结构和作用上有什么不同? 17. 如果某几种CPU的地址总线分别有8、16、20、32条,它们各自能寻址的存储器的容量是多少? 18. 什么是硬件,什么是软件,硬件和软件的关系如何? 19. 说明位、字节、字长的概念及它们之间的关系。 20. 计算机的发展趋势有哪些?你如何看待冯?诺依曼计算机体系结构理论? 21. 说出几种型号的CPU,它们各有什么特点? 22. 说出目前流行的几种主机板的类型以及它们的性能特点。

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上安装了

计算机组成原理与汇编语言综合练习题

计算机组成原理与汇编语言综合练习题 一、填空题 1.表示一个数值数据的基本要素是、、。 2.8位二进制补码所能表示的十进制整数范围是至,前者的二进 制补码表示为,后者的二进制补码表示为。 3.某机定点整数格式字长8位(包括1位符号位),用二进制表示最小负数的反 码为,最大正数的反码为。 4.在数的表示范围方面,浮点比定点。在运算规则方面,浮点比定 点。在运算精度方面,浮点比定点。 5.浮点数表示中,数据的范围由的位数据决定,数的精度由决 定。 6.已知0和9的ASCII码分别为0110000和0111001,则3的ASCII码 为,5的ASCII码为。 7.已知字符A的ASCII码为1000001,则字符B的ASCII码为,字符D 的ASCII码为。 8.15的8421码为。 9.每条指令由两部分组成,即部分和部分。 10.有一机器字16位,其中操作码占4位。若采用三地址寻址,则每个地址位为 位,可直接寻址空间为字节;若采用单地址寻址,则每个地址位为位, 可直接寻址空间为字节。 11.零地址指令是不带的机器指令,其操作数是由提供 的。 12.存储器堆栈中,需要一个,用它来指明的变化。 13.运算器的主要功能是进行。 14.SN74181 ALU是一个位运算单元,由它组成16位ALU需使用片 SNN74182 ,其目的是为了实现并行操作。 15.在微程序控制器中,微操作是由控制实现的最基本操作。一条机器指 令是由若干组成的微程序来解释执行的。 16.微程序顺序控制常用的两种方式是方式和方式。 17.控制器的控制方式有、和三种形式,其中方 式最节省时间,方式最浪费时间,而方式介于两者之间。 18.在控制器中,指令寄存器(IR)的作用是,它的位数与有 关。 19.使用Intel 2114(1K×4位)芯片32片可组成容量为 KB内存,每片片 内地址线有位。 20.若有一个512K字的存储器,它由四个存储体组成,每个存储体为16K,则该 存储体的字长是位。 21.计算机的I/O系统由、、和组成。 22.通常外部设备寻址方式有、和等三种方式。 23.中断请求是中断源向发出的申请中断要求,发出中断请求的条件 是。和。 24.中断返回时要恢复和,才能返回主程序继续执 行。 25.发向量地址和执行中断隐指令在程序中断处理过程的阶段,执 行中断服务程序在阶段,自动恢复程序断点地址在阶段。 26.中断隐指令的功能是:在响应中断之后立即中止现行程序,保护 . 和。内容,取出新的送入程序状态字寄存器,取出相应的送程序计 数器。 27.一个完整的程序中断处理过程应包括、、、 和▁五个阶段。

汇编语言入门

汇编语言入门教程 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩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),有九个有意义的标志,将在下文用到时详细说明。 内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放

汇编语言与计算机系统组成单选题

题干A B C D答案难度[1]电子计算机技术在半个世纪中虽有很大的进步,但至今其运行 仍遵循着一位科学家提出的基本原理。他就是( )。 牛顿爱因斯坦爱迪生冯·诺依曼D中 目前我们所说的个人台式商用计算机属于( )。巨型机中型机小型机微型机D中 冯·诺依曼机工作方式的基本特点是( )。多指令流单数据流按地址访问并顺序执行指令堆栈操作存储器按内容选择地址B中 至今为止,计算机中的所有信息仍以二进制方式表示,其理由 是( )。 节约元件运算速度快物理器件性能决定信息处理方便C中 对计算机的软、硬件资源进行管理,是( )的功能。操作系统数据库管理系统语言处理程序用户程序A中 CPU的组成中不包含( )。存储器寄存器控制器运算器A中 主机中能对指令进行译码的器件是( )。ALU运算器控制器存储器C中 许多企事业单位现在都使用计算机计算、管理职工工资,这属 于计算机的( )应用领域。 科学计算数据处理过程控制辅助工程B中 微型计算机的发展以( )技术为标志。操作系统微处理器磁盘软件B中 邮局对信件进行自动分拣,使用的计算机技术是( )。机器翻译自然语言理解机器证明模式识别D中 电子邮件是指( )。用计算机管理邮政信件通过计算机网络收发消息用计算机管理电话系统用计算机处理收发报业务B中 微型计算机的工作环境要求室温一般在15~35度,室温过低容 易造成( )。 磁盘读写出错静电干扰机内元器件受潮变质散热不好,烧毁电源A中 下列关于微处理器的描述中,( )是正确的。微处理器就是一台微机微处理器是微机系统微处理器就是主机微处理器可以用作微机的CPU D中 下列的四个叙述中,只有一个是正确的,它是( )。系统软件就是买来的软件,应用软 件就是自己编写的软件 外存上的信息可以直接进入CPU被 处理 用机器语言编写的程序可由计算机 直接执行 说一台计算机配置了FORTRAN语 言,就是说它一开机就可以用 FORTRAN语言编写和执行程序 C中 将有关数据加以分类、统计、分析,以取得有利用价值的信 息,我们称其为( )。 数值计算辅助设计数据处理实时控制C中微型计算机的分类通常以微处理器的( )来划分 。规格芯片名字长寄存器数目A中下列( )型号计算机标志了计算机时代的真正开始。ENIAC EDVAC EDSAC UNIVAC-I D中地址是内存储器各存储单元的编号,现有一个32KB的存储器, 用十六进制数表示它的地址码,则地址码应从0000H到( ) H。 3276780007FFF8EEE C中 Intel的创始人高登·摩尔总结的摩尔定律说:单片集成电路 所包含的晶体管数目大约每( )个月增加一倍。 12152418D中 在计算机未来发展展望中,计算机科学家们提出的最有可能取 代电子计算机的计算机探索方案是( )计算机。 光子计算机DNA计算机分子计算机量子计算机D中 The fundamental conceptual unit in a computer is: ( ) CPU Hard Drive Operating System Transistor D中 Virtually all computer designs are based on the von Neumann architecture. A high level view of this architecture has the following three components:( )Buses, memory, input/output controllers Hard disks, floppy disks, and the CPU memory, the CPU, and printers memory, input/output modules, and the CPU D中 Which of the following programming languages has an instruction set closest to the machine language of a computer? ( ) BASIC Fortran Assembly Language C++C中 Program that manages the resources of a computer for the benefit of the programs that run on that machine is ( ). Compiler Operating System ALU Control Unit B中 Program that translates from a high-level notation to assembly language is ( ). Compiler Instruction Set CPU Operating System A中计算机中表示地址时使用( )。无符号数原码反码补码A中对于二进制码10000000,若其值为-0,则它是用( )表示 的。 原码反码补码阶码A中对于二进制码10000000,若其值为-128,则它是用( )表 示的。 原码反码补码阶码C中对于二进制码10000000,若其值为-127,则它是用( )表 示的。 原码反码补码阶码B中字长16位,用定点补码小数表示时,一个字所能表示的范围是 ( )。 0~(1-2^-15)-(1-2^-15)~(1-2^-15)-1~+1-1~(1-2^-15)D中某机字长32位,其中1位符号位,31位尾数。若用定点整数补 码表示,则最小正整数为( )。 +1+2^31-2^32-1A中 某机字长32位,其中1位符号位,31位尾数。若用定点整数补 +1+2^31-2^32-1C中

汇编语言基础知识

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

计算机组成原理与汇编语言

计算机组成原理及汇编语言试卷10 一、选择题(共20道题) 1.计算机硬件能直接执行的只有()。 A 符号语言 B 机器语言 C 机器语言和汇编语言 D 汇编语言 2.中央处理机(CPU)是指()。 A 运算器 B 控制器 C 运算器和控制器 D 运算器、控制器和主存贮器 3.MOV AX,ES:COUNT[DI] 源操作数的寻址方式是:()。 A 基址寻址 B 立即寻址 C 变址寻址 D 基址变址寻址 4.所谓第二代计算机是以()为主要元器件。 A 超大规模集成电路 B 集成电路 C 晶体管 D 电子管 5.大部分计算机内的减法是用( )来实现的。 A 将被减数加到减数中 B 从被减数中减去减数 C 补数的相加 D 从减数中减去被减数

6.个人计算机是属于()。 A 大型计算机 B 小型机 C 微型计算机 D 超级计算机 7.运算器的主要功能是进行()。 A 逻辑运算 B 算术运算 C 逻辑运算与算术运算 D 初等函数运算 8.计算机中()负责指令译码。 A 算术逻辑单元 B 控制单元 C 存储器译码电路 D 输入输出译码电路 9.如果要处理速度、温度、电压等连续性数据可以使用()。 A 数字计算机 B 模拟计算机 C 混合型计算机 D 特殊用途计算机 10.有些计算机将部分软件永恒地存于只读存储器中,称之为()。 A 硬件 B 软件 C 固件 D 辅助存储 E 以上都不对 11.下列()不属于系统程序。 A 数据库系统 B 操作系统 C 编译程序 D 编辑程序 12.一个完整的计算机系统应包括()。 A 运算器、存贮器、控制器 B 主机和外部设备 C 主机与应用程序 D 配套的硬件设备和软件系统

快速入门单片机汇编语言

快速入门单片机汇编语 言 文档编制序号:[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位立即数。

汇编语言入门教程

汇编语言入门教程 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),有九个有意义的标志,将在下文用到时详细说明。

计算机组成原理及汇编语言.

计算机组成原理及汇编语言试卷 10 一、选择题(共20道题) 1.计算机硬件能直接执行的只有()。 A 符号语言 B 机器语言 C 机器语言和汇编语言 D 汇编语言 2.中央处理机(CPU)是指()。 A 运算器 B 控制器 C 运算器和控制器 D 运算器、控制器和主存贮器 3.MOV AX,ES:COUNT[DI] 源操作数的寻址方式是:()。 A 基址寻址 B 立即寻址 C 变址寻址 D 基址变址寻址 4.所谓第二代计算机是以()为主要元器件。 A 超大规模集成电路 B 集成电路 C 晶体管 D 电子管 5.大部分计算机内的减法是用( )来实现的。 A 将被减数加到减数中 B 从被减数中减去减数 C 补数的相加 D 从减数中减去被减数 6.个人计算机是属于()。 A 大型计算机 B 小型机 C 微型计算机 D 超级计算机 7.运算器的主要功能是进行()。 A 逻辑运算 B 算术运算 C 逻辑运算与算术运算 D 初等函数运算 8.计算机中()负责指令译码。 A 算术逻辑单元 B 控制单元 C 存储器译码电路 D 输入输出译码电路 9.如果要处理速度、温度、电压等连续性数据可以使用()。 A 数字计算机 B 模拟计算机 C 混合型计算机 D 特殊用途计算机 10.有些计算机将部分软件永恒地存于只读存储器中,称之为()。 A 硬件 B 软件 C 固件 D 辅助存储 E 以上都不对 11.下列()不属于系统程序。 A 数据库系统 B 操作系统 C 编译程序 D 编辑程序

12.一个完整的计算机系统应包括()。 A 运算器、存贮器、控制器 B 主机和外部设备 C 主机与应用程序 D 配套的硬件设备和软件系统 13.下列()不是输入设备。 A 磁盘驱动器 B 键盘 C 鼠标器 D 打印机 14.以真空管为主要零件的是()。 A 第一代计算机 B 第二代计算机 C 第三代计算机 D 第四代计算机 15.MOV AX,ES:[1000H] 源操作数的寻址方式是:()。 A 立即寻址 B 直接寻址 C 变址寻址 D 基址寻址 16.计算机经历了从器件角度划分的四代发展历程,但从系统结构来看,至今为止绝大多数计算机仍是()式计算机。 A 实时处理 B 智能化 C 并行 D 冯·诺依曼 17.将有关数据加以分类、统计、分析,以取有利用价值的信息,我们称其为()。 A 数值计算 B 辅助设计 C 数据处理 D 实时控制 18.下列()为计算机辅助教学的英文缩写。 A CAD B CAM C CAE D CAI 19.下列描述()是正确的。 A 控制器能理解、解释并执行所有的指令及存储结果 B 一台计算机包括输入、输出、控制、存储及运算五个单元 C 所有的数据运算都在CPU的控制器中完成 D 以上答案都正确 20.第三代计算机采用()。 A 晶体管 B 电子管 C 集成电路 D 超大规模集成电路 二、填空题(共20道题) 1.(D4E5)H ∨()H=(152345)H 2.主存储器的读取规则:“高高低低”规则,即____地址对应高字节,低地址对应____字节。 3.在浮点补码二进制加减运算中,当尾数部分出现_____和_____形式时,需进行左规,此时尾数______移一位,阶码_____,直到______为止。 4.设操作数字长16位(不包括符号位),机器作原码两位乘运算,共需作__次___操作,最多需做___次____操作,才能得到最后的乘积,乘积的符号位需_______。

《计算机组成原理与汇编语言程序设计》—一汇编语言程序设计实验

《计算机组成原理与汇编语言程序设计》 ——汇编语言程序设计实验说明 一;准备:将程序拷贝。主要是汇编程序MASM,其中包括: (1)MASM:宏汇编程序;(2)LINK:连接程序;(3)CREF:索引程序;(4)LIB:库管理程序 备注:要求学生从教学平台上下载MASM文件夹,并将其中的四个文件拷贝到D:\123\。本节实验为汇编语言第一次上机操作,请先按如下操作,学习MASM宏汇编语言的整个操作过程。 二、上机操作过程:(阅读《实验教材》P41的汇编语言程序设计实验有关内容。) 1、编辑源文件:(P42) 将实验一中的源程序以 sy1-1.asm文件名保存在D:\123\。 形成*.ASM文件(*为通配符)可以有多种方法,—是可以有行编辑EDlT或QE中编辑程序并以*.ASM文件保存,具体内容参加《实验教材》P43。二是在“写字板”、“记事本”或“word”文档输入源程序,并以*.asm文件保存。 教材中要求运用编辑程序(QE),该程序较麻烦,同学们可采用“记事本”录入程序,因为通过“记事本”保存的文件是纯文本文件(*.txt,例如:sy-1.txt),不含有任何格式。再重命名为sy-1.asm。有时计算机可能看不到后缀名,可取查看-文件夹选项-查看-显示所有文件,就可显示每个文件的后缀名,重命名即可。 2、汇编源程序文件:(P53) (1)转换到MS—DOS状态下;最好在纯DOS状态下,即开始——关闭系统——重新启动并切换到MS-DOS方式,退出DOS可输入EXIT回车; (2)第二步:将已经编辑好的源文件(如:sy-1.asm)拷贝到文件夹123中;切换到D:\123中,操作如下:(红字为同学们输入的内容,输完回车即可) C:\WINDOWS>D:\ D:>CD 123 D:\123>masm 以下步骤参见<实验>教材P53的(四.操作过程),产生目标文件sy-1.obj。最后,如出现0 Warning Errors 和0 Severs Errors,即源程序中无错误,汇编成功。以上操作完成后,可用目录显示命令显示文件123下的文件。如果出现错误就不能产生目标文件sy-1.obj,就不能完成下面的操作,可采用DEBUG调试程序调试。 (3)D:\123>dir(查看123的文件,可以看到源程序文件sy-1.asm和目标文件sy-1.obj) 3、连接目标文件:(P57,产生可执行文件sy-1.exe) D:\hbsy>link 参见P58页LINK的使用与操作 4、运行可执行文件: D:\hbsy>sy-1.exe 即可看到程序的运行结果,有程序需要输入数据才能看到结果。 5、利用调试程序(DEBUG)来调试:(P62―80) 源程序出现错误可利用DEBUG查找错误。 以上内容为学习汇编语言程序最基本的操作,学习如何“汇编”一个源程序。后面还涉及调试程序DEBUG的内容请同学按实验教材的要求去学习。

相关主题
文本预览
相关文档 最新文档