文档库 最新最全的文档下载
当前位置:文档库 › 汇编语言练习

汇编语言练习

汇编语言练习
汇编语言练习

前言:

由于近期太忙!所以想到做这个,一面强迫自己学习,一面希望能给大家一点帮助!我以后会把汇编语言的各章重点以及详细的课后解答写出来,供大家学习参考!由于本人水平有限,制作仓促,不能保证解析完全正确。望批评指正!

——By小生我怕怕

第一章重点:

汇编指令和机器指令一一对应,有编译器翻译识别,计算机无法直接识别

一个存储单元等于1字节1字节等于8位

1KB=1024Byte(字节)

1Byte=8bit(位)

CPU中,指令和数据都是二进制形式存在

磁盘的数据,CPU无法直接使用,只能读到内存中,才能被CPU使用

CPU可以使用的数据,是在存储器中存储器被划分为很多存储单元,以0开始编号,

一个单元存储一字节,即8位

寄存器是一种比内存和二级缓存更低一层,更接近CPU的存储器

CPU进行数据读写时,必须和外部芯片进行3类信息交换:

1.地址信息即地址总线

2.控制信息即控制总线

3.数据信息即数据总线

CPU多少根地址总线,就代表这个CPU地址总线的宽度为多少

就是说cpu寻址范围是2的N次方个存储单元

数据总线N根,即一次可传送N位二进制数即N位,例:

16位数据总线,可传输16位二进制,即2个字节

控制总线决定CPU对外部器件的控制能力

存储器分为:随即存储器RAM和只读存储器ROM

随即存储器,断电后数据丢失,如内存,显存

只读存储器,关机后内存不消失,如主板,网卡的BIOS

CPU对各类存储器只看做一个逻辑的存储器,每个物理上的存储器在逻辑上占有一段地址段,

CPU对其段进行操作,就是对物理存储进行操作

8086 CPU的内存地址分配:

00000—9FFFF为主存储器

A0000—BFFFF为显存地址空间

C0000—FFFFF为各类ROM地址空间

第一章检测点:

1.

寻址能力为8kb,即为8,反向推论,8kb=8192字节,CPU寻址公式:

N=地址总线宽度

M=寻址大小(单位字节)

M=2的N次方

这里M=8192,所以开平方,N就是13,2的13次方为8192字节

2.

1kb=1024b,因为1个存储单元大小为1B,所以1kb存储器可以为1024个存储单元

编号从零开始,即编号为0——1023

3.

1kb的存储器为1024个存储单元,每个存储单元1Byte,1Byte=8bit,即1024*8=8192bit位即1024byte字节

4.

1GB=1024MB

1MB=1024KB

1KB=1024Byte

5.

地址总线宽度为16,那么寻址能力就是2的16次方,65536个存储单元,即65536Byte,即64kb

6.

1Byte=8bit 8根数据总线,一次传输8bit,即1Byte

7.

8086为16根数据总线,每次读取16bit,即2字节,1024字节,需读取512次

8.

存储器中,数据和指令都是二进制形式存在

第二章:

CPU主要有有运算器,控制器,寄存器,三部分组成

8086 CPU有14个寄存器,如AX,BX,CX,DX,SI。。。。

8086所有寄存器都是16位的,可以存放2个Byte即字节,16位二进制数

通用寄存器为4个,是:AX,BX,CX,DX

为了兼容8088 CPU,所有通用寄存器,可以单独分为两个寄存器使用,即高地址和低地址,如AX可分,AH,AL

一个字节,即8bit,可以存在8位寄存器中

一个字word 等于2个字节,即16bit

在写一条汇编指令或寄存器时不区分大小写

mov ax,10和MOV,AX,10 一样

mov ax,18 意思是把18送入寄存器ax

mov ah,18 意思是把18送入寄存器ah

mov ax,bx 意思是把bx的值输入寄存器ax中

add ax,5 意思是将寄存器ax的值加上5

add ax,bx 意思是吧bx和ax相加,值存入ax中

H为16进制的意思

ax=0000H

bx=0000H

8086 16位一个寄存器能存储16个2进制数

例如:al和ah没有关系,当ah的值超出8位时,CPU就会丢弃数据,当al的值超出8位时,CPU不会丢弃数据

但不会进位到ah寄存器中

汇编指令进行操作时,要注意双方位数和数据大小溢出问题

检测点2.1详解:

mov ax,62627 ax=F4A3H

记住,这里的62627是十进制,转换为十六进制后,就是F4A3

mov ah,31h ax=31A3H

意思,是把31值送入ah中,并覆盖,即31A3H

mov al,23h ax=3123h

意思,是把23值送入al中,并覆盖,即3123H

add,ax,ax ax=6246H

意思就是把AX加上AX在送入AX中,和C语言的a+=a;一个意思

mox bx,826ch bx=826ch

意思就是把826ch的值送入bx中

mov cx,ax cx=6246h

意思就是把ax的值覆盖cx中

mov ax,bx ax=826ch

意思就是把bx的值覆盖ax中

add ax,bx ax=04d8h

意思是把bx和ax的值相加,并送入ax中,结果为104d8,

超过8086 CPU的十六位存储大小,所以抛弃1,即得04d8h

mov al,bh ax=0482h

意思是把bh的值覆盖al中,bh为82,ax为04d8,覆盖得0482h

mov ah,bl ax=6c82H

意思是把bl的值覆盖ah中,bl为6c,ax为0482,覆盖得6c82h

add ah,ah ax=d882h

意思是把ah加上ah,值放入ah中,即6c+6c=d8,即得d882h

add al,6 ax=d888h

意思把6加入al中,al值为82,82+6即得88,当然是十六进制算法,最后得d888h

add al,al ax=d810h

意思是把al加上al的值放入al中,值为110,超出al8位寄存器的大小,故只留10

结果为d810h

mov ax,cx ax=6246h

此题作者怎么想得,最后问个最简单的,呵呵

对CPU而言,所有内存单元构成的存储空间是一个一维线性空间

CPU物理地址送入寄存器的只能是一个物理地址,如:0010

8086为16位CPU,16为CPU有以下特性

运算器一次最多处理16位数据

寄存器的宽度为16位

寄存器和运算器的通路为16位

8086有20位地址总线,即可传送20位数据,寻址能力为:2的20次方字节,即1MB

但8086为16位结构,每次处理,存储,传送都为16位,即寻址能力为2的16次方个字节,即64kb

为了不浪费使用吧,8086采用内部2个16位寄存器合成一个20位物理地址就行传输

具体为:

物理地址=段地址*16+偏移地址,注意,这里*16是16进制,和10进制*10的意义一样

例如:

段地址为1230,偏移地址为00c8 那经过运算就是123c8的20位物理地址

具体:1230*16=12300

然后:12300+00c8=123c8

十进制理解就是:

例如:12812这个数由

1000和2812组成

1000*10=10000

任何10000+2812=12812

自己慢慢理解理解就可以了!

段地址的概念,是来自CPU,来分段管理内存!

10000H——100FFH组成一个段

基础地址为10000H

段地址为1000H

大小为:

100H

这里的段地址大小,很多人都晕,确实难理解,想通就好

100H的来源:

100FFH—10000H=FFH

这个FFH,转换为10进制就255,而计算机是从零开始,那么就有0—255,256个数

再把256转换为16进制,那就是100,即大小为100H,这是最笨的方法,但初学者好理解些,呵呵

一个段地址必然是16的倍数

偏移地址为16位,16位寻址能力为64kb,一个段的最大为64kb

监测点2.2:

1.

00010H—1000FH

0010H-1000FH 有答案是这个,不知道0010H行不行,大家研究!

2.

20000H

sa*16+0000=20000

sa*16+ffff=20000

最大2000

最小1001 1000不行,最后只能1001,大家测试

8086 CPU通过段地址和偏移合成物理地址来寻址,所以段地址肯定有寄存器,

那就是:CS DS,SS,ES 4个,和前面我们说的4个通用寄存器:AX,BX,CX,DX一样

CS和IP这两个寄存器,CS为代码段寄存器,IP为指令指针寄存器,8086会从

CS*16+IP单元开始读取指令

关键要理解8086CPU的工作过程:

1.从CS:IP指向德内存单元读取指令,指令进入缓冲器

2.IP=IP+所读指令的长度,从而指向下一条指令

3.执行指令,转到步骤一,重复这个过程

记住:8086CPU加电复位后,CS和IP的设置为CS=FFFFH,IP=0000H

即CPU从内存FFFF0H单元中读取执行,也是8086CPU的第一条执行指令

debug进入方式:开始—运行——debug XP系统下

r查看当前寄存器值,修改

d查看内存地址段的内容

e修改内存地址中的内容

u将内存地址段的内容翻译为指令

t执行开始CS:IP处的指令

a输入汇编指令

实验任务,根据各自电脑不同,初始值可能不同!大家自己测试,很简单!

第三章:

CPU用16位寄存器存储一个字

1字=2字节

一个内存单元为1字节,所以一个字要用两个连续的内存单元

存放,高地址存放高字节,低地址存放低字节

DS寄存器用来存储访问数据的段地址

8086CPU位16位结构,即一次传送16位数据,也就是1个字

在编程时,我们可以将一组内存单元定义为一个段,这个完全取决于我们

但段的长度必须<=64kb的连续地址,且起始地址为16的倍数

如:123B0H—123B9H

这个段内存的段地址就是1230H,长度就是10个字节了,5个字

栈的定义,入栈PUSH 出栈POP

入栈就是将一个新的数据放入栈顶,出栈就是从栈顶取出一个数据

规律是:后进先出

如:POP ax 就是将栈顶部的数据读取到AX中

相反,PUSH AX 就是将AX的数据读取到栈顶

CPU是通过段寄存器SS和寄存器SP来确定栈的位置和栈顶得位置

SP里面就是栈顶的地址,CPU执行就是从SS:IP处执行

栈的溢出问题,我们要根据字节的需求,进了用到最大的栈空间以

防止入栈超界,和出栈超界

我们可以将一段内存定义为一个段,这个段可以我们字节安排

如:

定义一个段存放数据,那就是数据段就是通过DS寄存器控制段地址

如果存放代码,那就是代码段就是通过CS寄存器控制段地址,IP寄存器

控制偏移地址

同样如果当做栈,那就是栈段就是通过SS寄存器控制段地址,用SP寄存器

控制栈顶的单元地址

第三章概念性东西很少,很多都是上级实验的所有课后题我就不写了,大家按照课后要求,一步一步来,肯定都能做出来!

第四章:

呵呵,本章还是比较简单的,主要介绍下程序的运行步骤

一个汇编语言写的程序要经过以下的步骤

第一步:编写汇编源程序

我喜欢用记事本,方便些,新手可以用支持高亮显示的编辑器,会更好

第二步:是对生成的源程度,.ASM的文件进行编译,产生目标文件

第三步:就是连接,对目标文件进行连接,生成可执行程序,如:.EXE的

这个过程主要完成对源程序的汇编指令到机器码的转变,以后相关描述等

汇编指令分为:伪指令和汇编指令,和标号,其实标号和伪指令和划分一起

例如:

assume cs:qq

qq segment

MOV,AX,1111H

MOV BX,2222H

ADD AX,BX

MOV AX,4C00H

INT 21H

qq ends

end

这里面的伪指令如:qq segment.... qq ends 如同C语言的{}一样,代表一段汇编语言的开始和结束,伪指令对CPU来说是不认识的,他只是由编译器认识和执行的

qq segment 代表定义一个段qq,这个段开始

而qq ends 就是结束这个段

如:上面的assume 和end 拿end来说,就是说明这个程序的结束,如果不加,

那么程序将找不到结束点,后果自己试验

标号的话,如上面的qq,他代表一个地址,做为一个段的名称

如果写一个1+1的程序,那就是

assume cs:qq

qq segment

MOV,AX,1

ADD AX,ax

MOV AX,4C00H

INT 21H

qq ends

end

注意H代表十六进制,大小写不区分,程序最后的

mov ax,4c00H

int 21H

他就是固定的意思,就是实现程序运行完成后,返回,注意,他是汇编指令

一个汇编语言的编写,编译,连接,执行,这个的话,大家建议先勇masm这个完成

前期很简单,不要开始就用集成环境,这样能更深入了解程序的整个过程,具体过程,大家看书,有图,一步一步来

说下汇编语言从写道执行的过程

1.首先先写一段汇编指令,工具不限,确保正确

2.生成.asm文件

3.然后拿masm进行编译,得到目标文件.obj

4.然后用link进行连接,得到.exe可执行文件

5.然后加载,加载到内存以后,CPU进行读写执行,然后返回到相应的设备上

有时为了解决问题,可以使用debug来跟踪程序的执行,看到每一步执行后,CPU的结果好了,重点就是这么多,具体对某一点仔细理解,都是日后的重点

第五章:

首先大家一定要分清,debug命令和编译指令,具体看第四章debug命令,进行对比

开始:

mov [0],ax

意思是把ax的内容送入段地址为ds,偏移地址为0的地址中

送入单元长度,由对象寄存器确定,如ax就是16位,2字节

al就是8位,1字节

[bx] 和上面基本一样,不同点就是他得地址的偏移地址在bx寄存器中

loop指令,循环命令,大致步骤

首先进行loop循环标记

然后根据cx的值判断循环次数,每次-1,cx为0时,则向下执行

如:计算2的10次方:

assume cs:qq

qq segment

mov ax,2

mov cx,9

q:add ax,ax

loop q

mov ax,4c00h

int 21h

qq ends

end

上面例子中,标号就是q,cx=9,就是循环10次执行add,AX,AX

汇编原程序中,数据不能以字母开头,如FFFFH,要写为:0FFFFH

段前缀的意思:

例如:

mov ax,ds:[bx]

就是把一个单元地址的内容送人ax中,长度为2字节

地址的段地址在ds中,偏移地址在bx中

这个ds可以换成其他寄存器,如ss,cs

mov ax,ds:[0]

和上面一样,唯一不同的就是偏移地址是0

上述的ds,就段的前缀,简称段前缀

一段安全的空间:意思就是在一个一维性的内存空间中,有一些地址是系统或其他

重要程序使用的,这些地方我们如果不小心修改将会引起很多错误,所以我们要使用一段安全的地址空间

在dos方式下,一般:0:200——0:2ff这个256个地址是安全的地址空间。

其实从第五章开始,以后的课程就很少概念性的东西了,大部分需要大家亲自反复的操作实验,熟练掌握

第六章:

一般来说,在操作系统环境下,程序所获得的空间都是安全的

包含多段的程度中,

dw 即定义8个字型数据,即8*2=16个字节

db 就是定义字节喽

程序中在结尾处,end 后门的标号,对应在程序中的标号位置,就是

程序的入口,也就是第一条执行的命令

将多数据,代码,栈,放入不同的段,是为了为了理清思路,便于理解

其次为了解决8086一个段最大64kb的问题

定义一个段:

如:assume cs:ps,ds:pp,ss o

其实第六章的内容,就是包含了前面几章的内容,也就是一个混合应用,

具体的细节不多说,拿一个实例来说,我将对实例进行剖析:

assume cs:qq, ds:ww,ss,ee (把qq与cs扯上关系,其他两个一样,不多说)ww segment

dw 1111h,2222h,3333h,4444h,5555h

ww ends (上面一段声明了数据内容,参照dw的意思,大家都明白了吧)ee segment

dw 0,0,0,0,0,0

ee ends(上面就是定义出多个栈地址空间)

qq segment

link:mov ax,ee

mov ss,ax

mov sp,20h(上面是把ee段当做栈空间,设置ss:sp为:ee:20) mov ax,ww

mov ds,ax(希望用ds:bx访问ww中的数据,ds指向ww段)

mov bx,0(设置第一个ds:bx的访问ww段单元)

mov cx,5(设置循环次数)

s:push[bx]

add bx,2

loop s(将ww段数据依次入栈)

mov bx,0

mov cx,5

s1:pop[]

add bx,2

loop s1(和上面相反,依次出栈)

mov ax,4c00H

int 21h

qq ends

end link (设置程序的入口)

(注意:

1.8086 CPU不允许直接将数据直接送入一个段寄存器

2.上述的,qq,ww,ee,s,s1,link,都是自己定义的

3.上面注释方式不对,是为了说明问题而写,大家注意

4.所以的代码段,栈,数据段,都是我们人为定义的)

由于水平有限,其中难免存在纰漏,敬请指出改正,谢谢!

下面的章节我会写完以后更新出来!待续....

第七章:

学过C语言的都知道,在C语言中,也有逻辑与运算和逻辑或运算。汇编语言当然也有and 和or就是

我是这么理解and和or

and的是逻辑与运算,相当于两人谈感情,0代表假,1代表真,那么必须两人同时为

真也就是1的时间,结果才能为真,如果一个人为假就是零,那么结果也就是0

如:

mov al,11111111b

and al,00000000b

那么结果就是:00000000

or是逻辑或运算,就是一厢情愿,只要有一方愿意付出,愿意为真,那么结果就能为真如:

mov al,11111111b

or al,00000000b

那么结果就是:11111111b

ASCLL码:

呵呵,这个和摩斯电码很像,喜欢无线电技术的朋友会有所体感,一个指定的值代表一个英文字母,就想电视中,嘀嘀嘀滴滴滴滴呵呵!这个是无线电台相互交流时所采用的一种编码,电脑也有,我们常用的如ASCLL码,当然还有其他很多。

ASCLL表。百度一下,有很大这种表,不需要大家死记,但最好能记得其中的规律。

当你打开一个win下得文本编辑器时,按下键盘的A键,屏幕上就会显示出A,具体是

怎么实现的呢?如下:

1.电脑开机,打开编辑器,按下键盘的A

2.按下以后,键盘会把这个信息传送给计算机,计算机内部通过ASCLL码进行编码,将对应值61H存储在内存空间中,

3.编辑器,从相应的内存空间取出这个值61H,送入显卡的显存当中,此事工作在文本模式下得显卡,就会利用ASCLL码进行解码,就会把61H转换为字符A

4.此时显卡驱动显示器,将A的图像显示在屏幕上,我们也就能看到

结论:大写A在ASCLL码中对应的是61H,注意这是十六进制的61.

关于其他ASCLL码值,请大家自行下载ASCLL表进行查看

以字符形式给出数据

形式为:‘...’单引号,注意是英文的单引号

如:db‘ABCD’

还不懂存储单元转换的,看日志揭秘系列的单讲。

打下这个程序:

assume cs:qq,ds:ww (把qq,ww分别和寄存器CS,DS扯上关系)

ww segment (ww段开始)

db'abcd' (定义数据,把abcd对应的ASCLL码放入地址空间)

db'ABCD' (同上)

ww ends (ww段结束)

qq segment (qq段开始)

start: mov al,'a' (start定义程序入口,mov...意思把a的ASCLL值值放入寄存器al中)mov bl,'b' (同上)

mov ax,4c00h(和一面一句,以后解释)

int 21h

qq ends (qq段结束)

end start (程序结束,这个start和前面的staet对应)

大家可以载入debug中查看寄存器变化和相应地址空间的值。

待续...

[bx+idata]

我们之前学过[bx]这个用法,他得段寄存器是ds,[bx]是他得偏移地址

例如:

mov cx,[bx+100]

意思就是:把段地址为ds,偏移地址为bx+100的这个内存单元的数据送人cx中

逻辑表达就是ds*16+[bx]+100

运用这种方法,处理大小写转换的问题:

程序如下:

assume cs:qq,ds:ee

ee segment

db 'FisHc'

db 'LiNuX'

ee ends

qq segment

start:mov ax,ee

mov ds,ax

mov bx,0

mov cx,5

s:mov al,[bx]

and al,11011111b

mov [bx],al

mov al,[bx+5]

or al,00100000b

mov [bx+5],al

inc bx

loop s

mov ax,4c00h

int 21h

qq ends

end start

si和di这两个寄存器,和bx寄存器功能相近,作为偏移地址时,他们的段地址都默认在ds 中存放

如:mov bx,1

mov al,[bx+100]

mov si,1

mov al,[si+100]

功能一样!

唯一不同的是,bx可以分为bl和bh两个8位寄存器,而si和di不能分成两个8位寄存器书上7.2,把wlcome to masm 复制到他后面的数据区中,

我们先用[bx+idata]的方法来写,一次复制1字节

assume cs:qq,ds:ee

ee segment

db 'welcome to masm!'

db '...............'

ee ends

qq segment

start:mov ax,ee

mov ds,ax

mov bx,0

mov cx,16

s:mov al,[bx]

mov [bx+16],al

inc bx

loop s

mov ax,4c00h

int 21h

qq ends

end start

一次复制2字节:

assume cs:qq,ds:ee

ee segment

db 'welcome to masm!'

db '...............'

ee ends

qq segment

start:mov ax,ee

mov ds,ax

mov bx,0

mov cx,8

s:mov ax,[bx]

mov [bx+16],ax

add bx,2

loop s

mov ax,4c00h

int 21h

qq ends

end start

用si和di一次复制两个字:

assume cs:qq,ds:ee

ee segment

db 'welcome to masm!'

db '...............'

ee ends

qq segment

start:mov ax,ee

mov ds,ax

mov cx,8

mov di,0

mov si,16

s:mov ax,[di]

mov [si],ax

add di,2

add si,2

loop s

mov ax,4c00h

int 21h

qq ends

end start

用si和di一次性复制一个字节:assume cs:qq,ds:ee

ee segment

db 'welcome to masm!'

db '...............'

ee ends

qq segment

start:mov ax,ee

mov ds,ax

mov cx,16

mov di,0

mov si,16

s:mov al,[di]

mov [si],al

inc di

inc si

loop s

mov ax,4c00h

int 21h

qq ends

end start

其实第七章注重一个灵活

如:

[bx]

[bx+idata]

[bx+si]

[si+bx+idata]

db '1.fishc..'

db '2.linux..'

db '3.unix...'

db '4.windows'

首字母设置为大写:代码如下:

assume cs:qq,ds:ee

ee segment

db '1.fishc..'

db '2.linux..'

db '3.unix...'

db '4.windows'

ee ends

qq segment

start:mov ax,ee

mov ds,ax

mov bx,0

mov cx,4

s:mov al,[bx+2]

and al,11011111b

mov [bx+2],al

add bx,9

loop s

mov ax,4c00h

int 21h

qq ends

end start

db '1.fishc..'

db '2.linux..'

db '3.unix...'

db '4.windows'

所有字母设置为大写:代码如下:

assume cs:qq,ds:ee,ss:tt ee segment

db 'dll'

db 'exe'

db 'dos'

ee ends

tt segment

db '......'

tt ends

qq segment

start:mov ax,ee

mov ds,ax

mov ax,tt

mov ss,ax

mov sp,12

mov bx,0

mov cx,4

s1:

push cx

mov si,0

mov cx,3

s:mov al,[bx+si]

and al,11011111b

mov [bx+si],al

inc si

loop s

add bx,4

pop cx

loop s1

mov ax,4c00h

int 21h

qq ends

end start

双层循环,多想想就明白了最后一例:

db '1.fishc..'

db '2.linux..'

db '3.hacker...'

db '4.windows'

把前四个字母设置为大写:代码如下:

assume cs:qq,ds:ee,ss:tt

ee segment

db '1.linux..'

db '2.hacker.'

db '3.windows'

ee ends

db '..........'

tt ends

qq segment

start:

mov ax,tt

mov ss,ax

mov sp,20

mov ax,ee

mov ds,ax

mov bx,0

mov cx,3

s:

push cx

mov si,0

mov cx,4

s1:mov al,[bx+si+2]

and al,11011111b

mov [bx+si+2],al

inc si

loop s1

add bx,9

pop cx

loop s

mov ax,4c00h

int 21h

qq ends

end start

(第七章完)第八章开始

首先是寄存器了,这里我们统计下之前所学的寄存器首先四个:ax,bx,cx,dx,

si,di,sp,ip,(bp),(pws)

cs,ds,ss,(es)

其中:ax,bx,cx,dx,这四个可分为高低8位寄存器如ah,al....

其中cx 用来计算循环次数

bx一般当做偏移地址来说时,段地址在ds中

其中cs,ds,ss,es这四个为段寄存器

cs和ip为组合,定义指令指针

ss和sp为组合,定义栈

ds和bx,si,di组合,定义数据

关于es以后再说

bp下面说

pws以后再说

其中si,di与bx功能相似,作为偏移地址时,段地址都在ds中

不一样的是不能向bx一样可以划分为单独的两个8位寄存器

十四个寄存器中,唯一没有接触过的是:es段寄存器,pws寄存器

bp寄存器

说了这么说,就介绍下bp寄存器

bp寄存器,实际上和sp很相似,默认段地址都在ss中,BP可以间

接寻址寄存器而SP不能以外,其余的功能基本相同

如:

mov ax,[bp]

就等于:

ax=ss*16+(bp)

关于,bx,bp,si,di四个寄存器的配合

很多人晕,我是这样记的:

假设:

bx和bp是两个男人,像我一样帅!呵呵,bx是我本人,bp就是你

了,他们名字的姓分别是bx姓ds bp姓ss

si和di是两个女孩很漂亮是亲姐妹,比如si是丁丁(人名),di是斜阳(人名),等下封ID了...

idata呢,就是小三了,像谁呢?你猜

一共5个人哈!记好!

根据我多年对易术天圆地方的研究!以及我多年的物理学经验,终

于得出一个结论:正负相吸,相同排斥的原理!

男女搭配的常规的四种搭配方式:

[bx+si] [bx+di] 分别是:我和丁丁,我和斜阳

[bp+si] [bp+di] 分别是:你和丁丁,你和斜阳

当然,如果想搞小三的话,那可以加上idata,甲鱼(人名)常常

[bp+si+idata...]

多少个idata,谁知道呢???

如:

[bx+si+idata] 那这样就是,我和丁丁,外加小三.... 这种三人关

系还是可以的,我喜欢....

你有钱的话,还可以多找几个小三,像甲鱼一样:

[bx+si+idata+idata+...]

注意:绝不允许两个男人娶一个老婆,如:

[bx+bp+si] 如,我和甲鱼和丁丁,这样甲鱼是肯定不会愿意的

,所以甲鱼只好走了,就剩我和丁丁,如:[bx+di] 当然这个时间

我还可以找个小三,如[bx+si+idata]

但是不能找斜阳了,不然就乱伦了...那就是[bx+si+di] 这样绝对不

还有就是连同小三我们五个人都单身一辈子,都单身一辈可以5个

单独出现,所以说:

亲!你是不是经常男女搭配啊!

亲!你是不是经常乱伦啊!

亲!你是不是经常同性恋啊!

亲!你是不是经常包小三啊!

亲!你是不是经常单身啊!

有木有???

还有就是si和di不能一起,因为乱伦了!

注意:si可以单独和idata在一起,哎!这个关系怎么可以?设计CPU的人啊!伤不起...

最后讨论下生出孩子的问题,主要是孩子姓什么?

注意一点:

[bp+idata]

[bp+di+idata]

[bp+si]

很多人认为,bp段地址在ss,di或者si段地址在ds

这样是错误的!

只要bp出现,那就是统一段地址在ss中

这样理解:

bp和bx说了是男人,si和di是女人,

夫唱妇随,孩子出生肯定跟随bp的姓了,那就是段地址在ss idata是小三!

呵呵,肯定也是男的是bp就跟ss,是dx就跟ds

如果小三和si与di在一起了,那就跟si和di的姓,也是ds

说下数据处理和数据有关的方面

首先cpu处理数据,一般不关心数据值是多少,而是关心数据所在位置,一般有三种操作,读,写,运行

一般数据在三个位置:

内存地址如:mov ax,[bx]或mov ax,[bx+2]

cpu内部,如寄存器中,指令缓冲器... mov ax,bx或者mov ax,1

端口暂时不说

数据进行运算时,一般不需要指定数据运算的单位,如字还是字节那是因为很多运算使用了寄存器

如:mov ax,bx 默认就是字运算如mov ax,1122h

注意:mov ax,12h 也是字运算,不要看只有12h就以为是字节运算其实编译器当0012h

mov al,bl 默认是字节运算如mov al,22h

push和pop默认是字运算

如果在没有指定寄存器的情况下,不指定运算单位,就是要出错的程序如下:

假设数据:

ds:0 11 22 00 00....

我们修改11为33,就是33 22 00 00...

原来程序如下:

assume cs:qq,ds:ee

ee segment

db 11h,22h

ee ends

qq segment

start:

mov ax,ee

mov ds,ax

mov bx,0

mov [bx],33h

mov ax,4c00h

int 21h

qq ends

end start

这样的话,结果是

ds:0 33 00 00 00

我们虽然修改了11,但同时也把22给修改了

因为此时没有出现寄存器,所以cpu就认为是字运算了

,如果我们要单独修改11的话,那就用一条新指定

XX ptr

解析:xx可以是word或者byte...

如字运算:mov word ptr[bx],33h

如字节运算:mov byte ptr[bx],33h

这样的话,我们改进上面的程序,把mov [bx],33h

这一句修改为:mov byte ptr[bx],33h

程序结果如下:

ds:0 33 22 00 00

这样就做到没有修改到22这个数据!

关于寻址方式加定义处理数据单位的综合因为:

我就写了个最简单的例子,没有用到循环和别的,就是让大家更明了

assume cs:qq,ds:ee

ee segment

db'IBM'

db'100'

db'PDF'

db'in'

ee ends

qq segment

start:

mov ax,ee

mov ds,ax

mov bx,0

mov byte ptr[bx+03h],'0'

mov byte ptr[bx+04h],'1'

mov byte ptr[bx+05h],'0'

mov byte ptr[bx+06h],'d'

mov byte ptr[bx+07h],'o'

mov byte ptr[bx+08h],'c' 只修改一个字节

mov word ptr[bx+09h],'hh' 同时修改1个字

mov ax,4c00h

int 21h

qq ends

end start

好了,第八章上半部分就说的这里!

第八章:

DIV命令

除法命令

说下我们之前学过的运算

add 加sub减inc自加1div除

了解基本除法运算

9/2=4 (1)

9是被除数

2是除数

4是商

1是余数

在8086汇编中,除数可能有8位与16位两种

除数为8位时,被除数为16位,默认放在ax寄存器中

商则放在al中,余数放在ah中

例:

div byte ptr [bx]

商al=(ax)/(ds*16+bx)

余ah=(ax)/(ds*16+bx)

如果除数为16位时,被除数为32位,默认放在ax和dx中,其中bx存放高16位,ax存放低16位

商则放在ax中,余数则放在dx中

例:

div word ptr [bx+si+6]

商ax=(dx*10000H+ax)/(ds*16+bx+si+6)

余dx=(dx*10000H+ax)/(ds*16+bx+si+6)

这里的10000H解析下:

如果32位数据为:

AABBCCDD

那么AABB放在bx寄存器中

CCDD放在ax寄存器中

那么AABB*10000H时,也就是等于AABB0000

这个时间加上ax的值,那就是AABBCCDD

注意,一定要拿word ptr或者byte ptr指明是字节

还是字操作,也就是8位还是16位

举个例子

1000/101=9 (101)

程序如下:

assume cs:qq,ds:ee

ee segment

db 65h ;65h即等于十进制101

ee ends

qq segment

start:

mov ax,ee

mov ds,ax

mov ax,3E8h ;3E8h即等于十进制1000

mov bx,0

div byte ptr [bx]

mov ax,4c00h

int 21h

qq ends

end start

结果:ax=5B09

其中al=09即是商,十进制也是9

ah=5B即是余数5Bh即十进制101

伪指令dd

其实前面我们说过了,

db定义字节8位

dw定义字 16位

dd定义双字 32位

dup这个命令很有用,大家在使用一段干净内存空间时

可以用它来定义

dup功能:

XX y dup(a,b,c)

其中XX可以是dd,dw,db...

y即是重复的次数

括号内部的a,b,c即是要重复的内容

db 3 dup(11,22)

执行后,相当于

db 11,22,11,22,11,22

关于实验7,我用了一个笨方法下了出来,虽然笨,但是几乎用到了前面的所有的知识

我把代码写下来

assume cs:qq,ds:ee

ee segment

db '1991','1992','1993','1994','1995','1996'

dd 16,22,382,1356,8000,5937000

dw 3,7,9,13,38,30000,17800

ee ends

;qq段开始

汇编语言基础练习题目

、填空 1. 在8086/8088的计算机中,存储单元的20位物理地址由两部分组成,即16 位的 段地址 和16位的 偏移地址,物理地址=段地址X 10H+偏移量。 2. 段的起始地址必须是某小段的首地址,它能被 10H 整除。 3. 已知01020H 字单元的内容为6A58H 请分别写出它的两个字节单元的地址和 内容: (01020H =58H, ( 01021H =6AH 4. 指令执行后,若标志寄存器的ZF=0,则表示结果不为0;若SF=0,则表示结 果的符号是正号,即结果为正数。 5. 控制器从存储器取出一条指令后,指令指针寄存器IP 的内容是 将要执行的下 一条指令开始的偏移地址。 6. 段地址和偏移地址为1000: 127B 的存储单元的物理地址是1127BH 解:由物理地址=段地址X 10H+偏移量的公式可得 物理地址=1000HX 10H+127BH=10000H+127BH=1127BH 、选择 1. 与CS 寄存器组合才能形成代码段的物理地址的寄存器是 解:16K 个字单元,即为32K 个字节单元。由于2的15次方为32K,因此至 少需要15位二进制数才能表示16K 个字单元。 3. 已知一数据段的段地址是0100H,这个段的第6个字单元的物理地址是(B ) o 解:由于一个字单元占用两个字节,第一个字单元的偏移地址为 0000H,因 此第一个字单元的物理地址为 01000H 。以后每一个字单元的地址在前一个的基 C )。 A. SP 寄存器 B. BP 寄存器 C. IP 寄存器 D. BX 寄存器 2.如果存储器分段时, 的二进制数至少是( 一个段最多允许16K 个字单元,那么表示该段内偏移地址 A )o A.15 位 位 B.16 位 C.17 位 D.18 A. 01010H B. 0100AH C.01012H D.01006H

汇编语言程序设计练习题

汇编语言程序设计练习题 一、字符与串处理类 1.逆序输出字符串“BASED ADDRESSING”。 2.试编写一段程序,要求对键盘输入的小写字母用大写字母显示出来。 3.编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。 4.从键盘上输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果。 5.从键盘上输入一串字符(用回车键结束,使用0A号功能调用。)放在STRING中,试编制一个程序测试字符串中是否存在数字。如有,则把CL的第5位置1,否则将该位置置0。 6.从键盘上输入一串字符(用回车键结束,使用0A号功能调用。),将其中的小写英文字母变换为大写英文字母,其他字符保持不变。然后将变换后的字符串显示出来。 7.试编制一个程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为buffer的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序。 8.试编写一段程序,要求比较两个字符串string1和string2所含字符是否相等,如相等则显示“MATCH”, 若不相同则显示“NO MATCH”。 9.试编写一段程序,要求输入两个字符串,如两个字符串相等则显示“MATCH”, 否则显示“NO MATCH”。 10.试编写一段程序,要求在长度为100H字节的数组中,找出大于61H的无符号数的个数并存入字节单元UP中,找出小于2FH的无符号数的个数并存入字节单元DOWN中。 11.在内存区域0B800:0000-0B800:0FFFF(都是16进制数)内查找首地址为SOURCE的串(SOURCE的首字节为串长度),如果找到,则把AL的第0位置0,否则将该位置置1。 12.已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一个程序,把既在A中又在B中出现的整数存放于数组C中。 13.在附加段中,有一个首地址为LIST和未经排序的字数组。在数组的第一个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器中存放着一个数。要求编制一个程序:在数组中查找该数,如果找到此数,则把它从数组中删除。 二、数字输入输出类 1. 试编制一个程序,把BX寄存器内的二进制数以十六进制数的形式在屏幕上显示出来。 2. 试编制一个程序,把BX寄存器内的二进制数以八进制数的形式在屏幕上显示出来。 3. 试编制一个程序,把BX寄存器内的二进制数以十进制数的形式在屏幕上显示出来。 4.从键盘上输入2个一位数,求出它们的和(假设和不超过1位)。 5.试编写一段程序,从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数。 6.试编写一段程序,从键盘接收一个0-65535间的十进制无符号数,并在终端上显示与它等值的二进制数。 7.试编写一段程序,从键盘接收一个-32768-32767间的十进制有符号数,并在终端上显示与它等值的二进制数。 8.编写一个程序,从键盘输入一个0~65535之间的10进制无符号数,然后以16进制

汇编语言试题及参考答案

汇编语言试题及参考答案 一,填空题 1.ZF标志位是标志结果是否为零的,若结果,ZF为( 1 ),否则ZF为( 0 ).当ZF为1时,SF为( 0 ) 2.标号可以有两种类型属性.它们是( )和( ) 3.8位无符号整数的表示范围为0--255,写成16进制形式为( ),8位有符号整数的表示范围为-128--+127,写成16进制形式为( ) 4.伪指令DB,GROUP 和NAME 三个标号名字域必须有名字的是( ),不得有名字的是( ),可有可无名字的是( ). 5.循环程序通常由( )( )( )和循环结果外理四部分构成 6.在数值不达式中,各种运算符可可混合使用,其优先次序规则*,/( )于+,-;XOR,OR( )于AND,LT( )于GT 7. 宏指令定义必须由伪指令( )开始,伪指令( )结束,两者之间的语句称为( ) 8.调用程序与子程序之间的参数传递方法有四种,即堆栈法( )( )( ) 9.分别用一条语句实现下述指明的功能 (1)栈顶内容弹出送字变量AYW( ) (2)双字变量AYD存放的地址指针送ES和SI( ) (3)变量AY2类型属性送AH( ) (4)不允许中断即关中断( ) (5)将字符串'HOW ARE YOU!'存入变量AYB( ) (6)子程序返回调用程序( ) (7)地址表达式AYY[4]的偏移地址送字变量ADDR( ) (8)AX的内容加1,要求不影响CF( ) (9)BX的内容加1,要求影响所有标志位( ) (10)若操作结果为零转向短号GOON( ) 二,单选题 1.IBM PC微机中,有符号数是用( )表示的 1.原码 2.补码 3.反码 4.BCD码 2.把汇编源程序变成代码程序的过程是( ) 1.编译 2.汇编 3.编辑 4.链接

汇编语言复习题(带答案)

汇编语言复习题(带答案) 汇编语言期末复习题 第1章:基础知识 1、在汇编语言程序的开发过程中使用宏功能的顺序是(C)。DX A、宏定义,宏调用 B、宏定义,宏展开 C、宏定义,宏调用,宏展开 D、宏定义,宏展开,宏调用 2、汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句 中不可省略的项是(B)。DX A、名字项 B、操作项 C、操作数项 D、注释项 3、可屏蔽中断就是它的请求是否被CPU响应要受(IF)的控制。DX 4、使用LINK连接命令,执行后可生成文件的扩展名为(EXE)。DX 5、在寄存器间接寻址中,如果指令中指定的寄存器为BP,则操作数在段中,段地址 在SS寄存器中。TK 6、注释项用于说明程序段或是一条和几条指令的功能,一般用;(或分号)表示注释 的开始。TK 7、DOS系统功能调用方式为:(1)置入口参数;(2)中断程序编号送AH寄存器后执行INT21H。TK 8、通常主程序和子程序间参数传送的方法有三种:用寄存器传递、用存储单元传递、用堆栈传递(顺序可调换)。TK 9、CPU暂停当前程序的执行,转而执行处理紧急事务的程序,并在该事务处理完后能自动恢复执行原先程序的过程。在此,称引起紧急事务的事件为中断源。TK 10、在字符串操作指令中,DS∶SI指向源串,ES∶DI指向目的串。TK 11、计算机系统通过接口与外围设备通信。TK 12、键盘I/O、显示I/O和打印I/O分别对应、和号中断。TK 13、字符显示模式缓冲区中的一个字对应于屏幕上的一个字符。每个字的第一个字节 为显示字符的ASCII码,第二个字节为显示字符的属性。TK 14、简述上机运行汇编语言程序的过程。JD

汇编语言程序设计练习题及答案

一、单项选择题(在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。) 1.为在一连续的存储单元中,依次存放数据41H,42H,43H,44H,45H,46H,可选用的数据定义语句是(D) A.DB 41,42,43,44,45,46 B.DW 4142H,4344H,4546H C.DW ‘AB’,‘CD’,‘EF’D.DW ‘BA’,‘DC’,‘FE’ 2.DA2 DB‘AB’,‘CD’ ┇ MOV AX,WORD PTR DA2+1 上述语句执行后AX中的值是(D) A.‘AD’B.‘BC’ C.‘DA’D.‘CB’ 3.下列数据定义语句中可实现留空20H个字节存储单元的是(D) A.DB 20 DUP(?) B.DW 20H DUP(?) C.DB 10H DUP(4 DUP(?)) D.DD 08H DUP(?) 4.如某存储器分段时,表示偏移地址是17位二进制代码,那么一个段最多的存储单元数是(D) A.32K字节B.32K字 C.64K字节D.64K字 5.下列寄存器中用来指示堆栈中任意数据区的偏移地址的是(B)A.BX B.BP C.SI D.DI 6.下列指令中有语法错误的是(C) A.PUSH AX B.PUSH [20H+SI+BX] C.POP CS D.PUSH CS 7.执行PUSH BP指令时,目的操作数的物理地址表达式是(D) A.16*SS+BP B.16*DS+BP C.16*CS+IP D.16*SS+SP 8.把BL中的数据输出到端口8CH中正确指令是(C) A.OUT 8CH,BL B.IN 8CH,BL C.MOV AL,BL D.MOV AL,BL OUT 8CH,AL IN 8CH,AL 9.结果为零的条件转移指令,其测试条件是(A) A.ZF=1 B.ZF=0 C.SF=l D.SF=0 10.下面程序段完成测试DA-BYTE字节单元中数是否为负数,若是则将全l送DH中,否则全0送DH中,那么程序段中方框里应填的语句是 MOV CH,0 MOV CH,0FFH ZERO:MOV DH,CH(C) A.JNZ ZERO B.JS ZERO

汇编语言习题答案-(3)

第3章自测练习 一、选择题(四选一) 1.表示一条处理器指令所在存储单元的符号地址是 C 。 A 变量 B 常量 C 标号 D 偏移量 2.汇编语言中的变量有多种类型属性,但错误的类型是 B 。 A 字节型byte B 字符型char C 字型word D 双字型dword 3.执行mov bx,seg var指令,BX得到变量var的 B 。 A 物理地址 B 段地址 C 偏移地址 D 内容 4.MASM语句中,采用 C 分隔标号和指令。 A 逗号 B 分号 C 冒号 D 空格 5.欲设定从偏移地址100H开始安排程序,可使用 A 伪指令。 A org 100h B start=100h C start db 100h D start equ 100h 6.与“mov bx,offset var”指令等效的指令是 D 。 A mov bx,var B 1ds bx,var C les bx,var D 1ea bx,var. 7.下条语句 buf db l0 dup(3 dup(?,10),3,10) 汇编后,变量buf占有的存储单元字节数是 B 。 A 100 B 80 C 40 D 20 8.数据定义语句“numl dw(12 or 6 and 2) ge 0eh”,定义的num1单元的内容是 B 。 A 0 B 0FFFFH C 1 D 0FFH 9.要求将A、B两个字符的ASCII码41H和42H顺序存放在连续两个字节存储单元中,可选用的语句是 A 。 A db`AB' B dw `AB' C db 0ABH D dw 0ABH 10.在汇编语言程序中,对END语句叙述正确的是 C 。 A END语句是一可执行语句 B END语句表示程序执行到此结束 C END语句表示源程序到此结束 D END语句在汇编后要产生机器码 11.下面的数据传送指令中,错误的操作是 D 。 A mov ss:[bx+di],byte ptr 10h B mov dx,l000h C mov word ptr[bx],1000h D mov ds,2000h 12.下面指令执行后,变量dab中的内容是 C 。 daw dw 2A05h dab db 0Fah … mov al,byte ptr daw sub dab,al A 0DAH B 0FAH C 0F5H D 0D0H

汇编语言题库

汇编语言题库 一、单项选择题 1、在下列的选项中,能够组成计算机系统的是()。 A.硬件系统和软件系统 B.CPU、存储器、输入/输出设备 C.操作系统、各种语言 D.系统软件和应用软件2、汇编语言属于()。 A.用户软件 B.系统软件 C.高级语言 D.机器语言3、汇编语言源程序经汇编程序汇编后产生的文件的扩展名是()。 A.EXE B.OBJ C.ASM D.LST 4、汇编语言的什么文件经链接(LINK)后产生可执行文件? A.ASM B.EXE C.LST D.OBJ 5、中央处理器CPU是由()组成的。 A.运算器 B.控制器 C.寄存器组 D.前三者6、IBM PC机的DOS是属于()。 A.用户软件B.系统软件C.系统硬件 D.一种语言7、汇编语言源程序是()程序。 A.不可直接执行的B.可直接执行的 C.经汇编程序汇编后就可执行的D.经连接后就可直接执行的8、8086/8088 CPU的寄存器组中,8位的寄存器共有()个。 A.4B.6C.8D.109、8086/8088 CPU的寄存器组中,16位的寄存器共有()个。 A.10B.12C.13D.1410、8086/8088 CPU执行算术运算时PSW共有()个标志位会受影响。 A.4B.5C.6D.711、在程序执行过程中,IP寄存器始终保存的是()。 A.上一条指令的首地址B.本条指令的首地址。 C.下一条指令的首地址D.需计算有效地址后才能确定地址。 12、IBM PC机的存储器可分()个段。 A.4B.256C.512D.65536 13、当使用BP作编程地址时,此时使用的是()段。 A.CSB.DSC.ESD.SS

汇编语言练习题

一、单项选择题(共20题) 1.对于有符号的数来说,下列哪个值最大() A:0F8H B:11010011B C:82 D:123Q 2.下列有关汇编语言中标号的命名规则中,错误的是()A:通常由字母打头的字符、数字串组成 B:标号长度不能超过31个字符 C:?和$不能单独作为标号 D:.号不可位于标号首 3.设A=0.4H,B=0.8H,C=0.4,D=0.4Q,它们之间的关系是( )。 A.C+D=B B.A+D=B C.B=D D.A>C>D 4.下列四个寄存器中,可作为十六位寄存器的是( ) A.DL B.CL C.BP D.EBX 5.8088/8086存储器分段,每个段不超过() A.64K个字 B. 32K个字节 C.1兆个字节 D.64K个字节6.寻址指令MOV CX, [BX + DI + 20]使用的是哪一种寻址方式() A:寄存器寻址B:相对基址变址寻址 C:变址寻址D:基址变址寻址 7.连接程序把汇编语言源程序生成的目标文件(.OBJ文件)转换成( )。 A..OBJ文件B..EXE文件

C..LST文件D..CRF文件 8.在程序运行过程中,确定下一条指令的物理地址的计算表达式是( )。 A. (CS)×16+(IP) B. (DS)×16+(DI) C. (SS)×16+(SP) D.(ES)×16+(SI) 9.若AX= - 15要得到AX=15应执行的指令是(A ) A.NEG AX B.NOT AX C.INC AX D.DEC AX 10.8086/8088系统执行传送指令MOV时() A.不影响标志位 B.影响DF方向标志 C.影响SF符号标志 D.影响CF进位标志 11.执行下列程序后,(AL)=( )H。 DATA SEGMENT TAB DB ‘0123456789’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX, DATA MOV DS, AX MOV BX, OFFSET TAB MOV AL, 04 XLAT TAB …

汇编语言程序设计课后习题解答宋人杰2版

第1章汇编语言基础知识 1.简述汇编语言源程序、汇编程序、和目标程序的关系。 答:用汇编语言编写的程序称为汇编源程序;汇编源程序在汇编程序的翻译下转换成计算机语言变成目标程序。 2. 简述汇编语言的优缺点。 答:(1) 汇编语言的优点: ①可有效地访问、控制计算机各种硬件设备,如磁盘、存储器、CPU、I/O端口等。. ②目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。 ③可与高级语言配合使用,应用十分广泛。 (2) 汇编语言的缺点: ①通用性和可移植性较差 ②相对于高级语言来说较繁锁、易出错、不够直观。 3.CPU的寻址能力为8KB,那么它的地址总线的宽度为多少? 答:13 4. 1KB的存储器有多少个存储单元? 答:1024个字节。 5. 指令中的逻辑地址由哪两部分组成? 答:指令中的逻辑地址由段基址和偏移量组成。 6. 以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。 (1) 12F8:0100 (2) 1A2F:0103 (3) 1A3F:0003 (4) 1A3F:A1FF 答: (1) 13080H (2) 1A3F3H (3) 1A3F3H (4) 245EFH 7. 自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示): 03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据 的值。 答:字节型数据:11H 字型数据:0A311H 双字型数据:0113A311H 8. 内存中某单元的物理地址是19318H,段基地址为1916H,则段内偏移地址为 多少?若段内偏移地址为2228H,则段基地址为多少? 答:若段基地址为1916H,则段内偏移地址为01B8H;若段内偏移地址为2228H,则段基地址为170FH 9. 在实模式环境中,一个段最长不能超过多少字节? 答:64KB 10. 实模式可寻址的内存范围是多少? 答:1MB

汇编语言复习题(附答案)

汇编语言复习题 注:蓝色标记的为答案,此答案仅供参考,大家自己做一下或看以一下,认为不对的地方,可以提出来一起讨论一下,另外看一下课后老师布置的相应作业。在此文档最后最后附有课 后四、六章的答案,大家抓紧时间复习哦! 一、选择题 1. 把要执行的程序与库文件连接起来形成可执行文件的系统程序是(B )。 A. 汇编程序 B. 连接程序 C. 机器语言程序 D.源代码程序 2. 在8088/8086的寄存器组中,CPU确定下一条指令的物理地址时需要用到的寄存器对是 (C )。 A..SS 和SP B.DS 和DI C.CS 和IP D.ES 和SI 3. 为了使主机访问外设方便起见,外设中的每个寄存器给予一个(C )。 A.物理地址 B. 逻辑地址 C. 端口地址 D. 段地址 4. MOV AX, 3064H,该指令中源操作数采用的寻址方式是(A )。 A.立即 B. 直接 C. 寄存器相对 D. 寄存器间接 5. 换码指令的助记符是(C )。 A. XCHG B. LEAS C.XLAT D. MOV 6. 如果A> B (A、B有符号数)发生转移,应选择的条件转移指令是(JGE )。 7. 下列符号中,可用作标识符的是(C )。 A.MOV B.AX C.MSG1 D.1ABC 8. X DB 10H DUP (1 , 2)内存变量定义语句拥有了( A )个字节的存储空间。 A.20D B.10D C.20H D.10H 9. 当DF=0时,执行串操作指令MOVSB变址寄存器SI、DI的值将(C )。 A.不变 B. 减1 C. 加1 D. 无法确定 10. 如下指令可将AX寄存器内容改变的是(A )。 A. AND AX , BX B . TEST AX , BX C. CMP AX , BX D . XCHG AX , AX 11.16位CPU支持的I/O 地址范围是(D )。 A. 0~0FFFFFH B. 0~0FFFFH C. 0~0FFFH D. 0~0FFH 12. MUL CL指令实现的功能是(A )。 A.无符号乘法:AX AL X CL B.有符号乘法:AX AL X CL C.无符号乘法:DX AL X CL D .有符号乘法:DX AL X CL 13. DOS系统功能调用(INT 21H )中,显示字符串的功能号是(D )。 A.01H B.02H C.08H D. 09H 14. 在16位CPU读取指令时,需要用到的寄存器对是(C )。 A.SS 和SP B.DS 和DI C.CS 和IP D.ES 和SI 15. 下列指令中,源操作数(既第2操作数)属于基址加变址寻址方式是(B )。 A.MOV AX,23H B. MOV AX,[BX+SI] C.SUB AX,[BX] D. ADD AX,BX 16. 有内存变量定义语句:VAR DW 10 DUP(1 , 2), 1234H, VAR的属性TYPE LENGTH和

汇编题库重点复习题

1.已知X=76,则[X]补=_______。 A.76H B. 4CH C. 0B4H D. 0CCH 2.已知[X]补=80H,则X =_______。 A.80H B.0 C. 0FFH D. -80H 3.已知[X]补=80H,则[X]补/2=_______。 A.0CCH B.4CH C. 49H D. 31H 4.已知X=78,Y=-83,则[X+Y]补=_______。 A.0F5H B.0A1H C. 0FBH D. 65H 5.将124转换成十六进制的结果是_______。 A.7CH B.7DH C. 7EH D. 7BH 6.将93H看成一个压缩的BCD码,其结果是_______。 A.10010101 B.10010011 C. 10000011 D. 10000001 7.45转换成二进制数是_______。 A.10101101 B.00111101 C. 00101101 D. 10011101 8.6CH 转换成十进制数是_______。 A.118 B.108 C. 48 D. 68 9.将93H扩展为字的结果是_______。 A.FF93H B.0093H C. 1193H D. 1093H 10.56的压缩BCD码是_______。 A.38H B. 56H C. 0506H D. 3536H 11.ASCII中的47H表示字符的是_______。 A.“7” B. “G” C. “g” D. “E” 12.十进行数-1的8位二进制数补码是_______。 A.11111110 B. 11110000 C. 11111111 D. 10001111 13.下列为补码表示,其中真值最大的数是_______。 A.10001000 B. 11111111 C. 00000000 D. 00000001 14.十六进制数88H,可表示成下面几种形式,请找出错误的表示_______。 A.无符号十进制数136 B. 1带符号十进制数-120D C. 压缩BCD码十进制数88 D. 8位二进制数-8的补码 15.计算机对字符、符号采用统一的二进制编码。其编码采用的是_______。 A.BCD码 B. 二进制码 C. ASCII D. 十六进制码第二章 16.在微机中分析并控制指令执行的部件是_______。 A.寄存器 B. 数据寄存器 C. CPU D. EU 17.在计算机的CPU中执行算术逻辑运算的部件是_______。 A.ALU B. PC C. AL D. AR 18.执行指令PUSH CX后堆栈指针SP自动_______。 A.+2 B. +1 C. —2 D. —1 19.在标志寄存器中表示溢出的是_______。 A.AF B. CF C. OF D. SF 20.对汇编语言源程序进行翻译的是程序是_______。 A.连接程序 B. 汇编程序 C. 编译程序 D. 目标程序

51汇编程序练习题1

单片机汇编程序设计练习 一、存储器之间的数据传送 1、编程实现将单片机内部RAM60H开始的连续32个单元置为FFH。 2、编程实现将内部RAM30H开始的连续16个数传送到内部RAM50H开始的连续单元中。 3、编程实现将单片机外部RAM2000H为首地址的数据块传送到单片机内部RAM30H开始的单元中,数据块的长度为32个字节。 4、编程实现将单片机内部RAM30H为首地址的数据块传送到外部RAM2000H 开始的单元中,数据块的长度存放于内部RAM的20H单元。 5、编程实现将单片机外部RAM2000H为首地址的数据块传送到单片机内部RAM30H开始的单元中,直到数据内容为0DH时停止传送。 6、编程实现将ROM1000H地址的内容传送到内部RAM的25H单元。 7、编程实现将ROM2000H开始的连续10个地址的内容传送到内部RAM的25H 开始的单元。 8、编程实现将ROM1000H开始的连续100个地址的内容传送到外部RAM2000H 开始的连续单元中。 二、查表程序设计 1、编写查表程序,要查表的数据存放在R7中,其范围为0~9。编程查其平方值,并存放于40H。 2、编写查表程序,要查表的数据存放在R7中,其范围为0~9。编程查其立方值,并存放于R6。 3、单片机外部ROM TAB1地址开始存放一组ASCII码表,试用查表方法,将R2的内容(范围为0~F)转换为与其对应 的ASCII码,并从P1口输出。 4、使用8051的P1口作为段控驱动共阳 LED数码管,硬件连接如图。 编程实现将8051 R7单元内容(在 00H-09H之间)显示在数码管上。00H-09H 的共阳字形代码如下表所示。 04H 05H 06H 07H 08H 09H

汇编语言程序设计期末考试题

汇编语言程序设计期末考试题 学院(系):学号: 姓名: 计分: 一、项选择题(在每小题的四个备选答案中,选出一个正确答案,并将正确答案的序号填在题干的括号 内。每小题1分,共10分) 1.CPU发出的访问存储器的地址是( ) A.物理地址 B.偏移地址C.逻辑地址D.段地址 2.将高级语言的程序翻译成机器码程序的实用程序是( ) A.编译程序 B.汇编程序 C.解释程序 D.目标程序 3.DEC BYTE PTR[BX]指令中的操作数的数据类型是( ) A.字 B.双字C.字节D.四字 4.在下列语句中,BUFFER称为( ) BUFFER DB 01H,0AH A.符号 B.变量 C.助记符D.标号 5.串操作指令中,源串操作数的段地址一定在( )寄存器中。 A. CS B. SS C. DS D. ES 6.使计算机执行某种操作的命令是( ) A.伪指令B.指令 C.标号D.助记符 7.将数据5618H存放在存储单元中的伪指令是( ) A. DATA1 DW 1856H B. DATA1 DB 18H,56H C. DATA1EQU 5618H D. DATA1 DB 18H,00H,56H,00H 8.若AX=3500H,CX=56B8H,当AND AX,CX指令执行后,AX=( ) A.1400H B. 77F8H C. 0000H D. 0FFFFH 9.计算机处理问题中会碰到大量的字符、符号,对此必须采用统一的二进制编码。目前,微机中普遍 采用的是( )码。 A. BCD码 B.二进制码 C.ASCII码D.十六进制码 10.用指令的助记符、符号地址、标号和伪指令、宏指令以及规定的格式书写程序的语 言称为( ) A.汇编语言 B.高级语言 C.机器语言 D.低级语言 二、填空题(每空1分,共20分) 1.在8086/8088汇编语言中,有五条串操作指令,其中搜索字符串指令的助记符是______。 2.通常所说的计算机系统包括________和________两大部分。 3.8086/8088存储器分四个段,这四个段的段名所对应的段寄存器分别是________、_____ ___、________、________。 4.现有AX=2000H,BX=1200H, DS=3000H, DI=0002H, (31200H)=50H,(31201H)=02H, (31202H)=40H,请写出下列各条指令独立执行完后有关寄存器及存储单元的内容,并指出标 志位ZF、CF的值。 A.ADDAX,1200H;问AX=________H,ZF=________

【汇编语言程序设计】试题及答案合集

《汇编语言程序设计试题及答案》合集 汇编语言程序设计试题及答案 1.对于有符号的数来说,下列哪个值最大(D) A:0F8H B:11010011B C:82 D:123Q 2.下列有关汇编语言中标号的命名规则中,错误的是(D) A:通常由字母打头的字符、数字串组成 B:标号长度不能超过31个字符 C:?和$不能单独作为标号 D:.号不可位于标号首 3.8088/8086存储器分段,每个段不超过(D ) A.64K个字 B.32K个字节 C.1兆个字节 D.64K个字节 4.寻址指令MOV CX, [BX + DI + 20]使用的是哪一种寻址方式(B)A:寄存器寻址B:相对基址变址寻址 C:变址寻址D:基址变址寻址 5.若AX= - 15要得到AX=15应执行的指令是(A ) A.NEG AX B.NOT AX C.INC AX D.DEC AX 6.8086/8088系统执行传送指令MOV时( A) A.不影响标志位 B.影响DF方向标志 C.影响SF符号标志 D.影响CF进位标志 7.若要求一个操作数中的若干位维持不变,若干位置?1?,可以使用(B)A:NOT B:OR C:AND D:XOR 8.下列指令中段默认为堆栈段的是( C) A.MOV AX,[BX+SI+10] B.ADD AX,ES:[SI] C.SUB [BX],[BP][DI] D. MOV DX,[1000H] 9.关于8086/8088微机系列,下列说法哪个是正确的(D) A:一个存储单元由16个二进制位组成,简称字。

B:当存储一个字数据时,低字节放高地址位,高字节放低地址位。 C:在内存空间中,可以无限分配段,且段的大小不受限制。 D:段与段之间可以邻接,也可以重叠。 10.下列关于堆栈的说法,错误的是(D) A:以?先入后出?为原则。 B:栈区最高地址单元的前一个单元为栈底。 C:运行中SP寄存器动态跟踪栈顶位置。 D:压栈和弹出都是以字节为单位。 11.表示过程定义结束的伪指令是( A) A.ENDP B.ENDS C.END D.ENDM 12.BUF1 DB 3 DUP(0,2 DUP (1,2),3) COUNT EQU $-BUF1 符号COUNT等价的值是( B) A.6 B.18 C.16 D.9 13.下列标志位中,可以用来判断计算结果正负的是(B) A:PF B:SF C:DF D:OF 14.下列指令正确的是( CD) A. MOV [100H], [BX] B.MOV DS, ES C. ADD V[BX], CX D.MOV AX, 34H 15.下列哪个寄存器是属于指针寄存器(C) A:SI B:DX C:SP D:ES 二、填空题 (每小题4 分,共 20 分) 1.下列程序段求数组FLD的平均值,结果在AL中。请将程序填写完整(不考虑溢出) FLD DW 10, -20, 30, -60, -71, 80, 79, 56 _LEA SI,FLD______ MOV CX, 8 XOR AX, AX

汇编语言程序设计试题

汇编语言程序设计试题 一、单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.设SS=2050H,SP=0140H,则栈顶存贮单元的物理地址是( A ) A.20640H B.2063EH C.2063FH D.21900H 2.使用DOS功能调用时,子程序编号应放在( B ) A.AL B.AH C.AX D.任意指定 3.没有 ..语法错误的输出指令是( B ) P76 A.OUT AX,30H B.OUT DX,AL C.OUT AL,DX D.OUT 30H,AH 4.用MOV指令将十进制数89以非压缩BCD码格式送入AX,可使用的指令是( B ) A.MOV AX,89 B.MOV AX,0809H C.MOV AX,89H D.MOV AX,0809 5.设AX=8765H,DX=4321H,执行CWD指令后,DX中的内容是( B ) P117 A.4321H B.0FFFFH C.8000H D.0001H 6.设CL=05H,要获得CL=0AH,可选用的指令是( A) A.XOR CL,0FH B.NOT CL C.OR CL,0AH D.AND CL,0FH 7.假设执行ADD指令后AL=8CH,再执行DAA指令,AL中的值是( A ) A.92H B.0104H C.74H D.8CH 8.MOV AL,79H ADD AL,B1H 上面指令执行后,设置的标志位CF和ZF的值是( D ) A.CF=0,ZF=1 B.CF=l,ZF=1 C.CF=0,ZF=0 D.CF=1,ZF=0 9.TEST DL,55H P123 JZ NEXT NEXT:…… … 上述程序段,执行JZ指令时能产生转移的情况是( D ) A.DL>55H B.DL<55H C.DL=55H D.DL中第0、2、4、6位均为0 10.假设AL=28H, 执行ROL AL,1 指令之后的情况是( D ) P125 A.AL=14H, CF=1 B.AL=50H, CF=1 C.AL=14H, CF=0 D.AL=50H, CF=0 11. 98的BCD码是(B) A)10011001 B) 10011000 C) 10011010 D) 10001010 12. –0110110 的补码是(A) A) 11001010 B) 11001001 C) 10110110 D) 00110110

汇编语言期末复习题库

一、填空题 1.中央处理器包括运算器、控制器、寄存器组。 2.物理地址是指实际的20 位主存单元地址,每个存储单元对应唯一 的物理地址。 3.用二进制代码书写指令和程序的语言,称为机器语言。 4.计算机中的指令由操作码和操作数两部分组成。 5.把A和B两个寄存器的内容进行异或运算,若运算结果是0 ,那么 A、B寄存器的内容必定相同。 6.AL,BL中存放着压缩的BCD数,(AL)=18H,(BL)=47H,执行如下 两条指令ADD AL,BL 和DAA后,(AL)=65H 。 7.当指令“SUB AX,BX”执行后,CF=1,说明最高有效位有借位; 对有符号数,说明操作结果溢出。 8.FLAG状态标志寄存器中,AF为辅助进位标志,CF为进位标志, SF为符号标志,ZF为零标志,OF为溢出标志,PF为奇 偶性标志。 9.指出下列指令源操作数的寻址方式: MOV AX,ARRAY[SI] 变址寻址 MOV AX,ES:[BX] 寄存器间接寻址 MOV AX,[200H] 直接寻址 MOV AX,[BX+DI] 基址变址寻址 MOV AX,BX 寄存器寻址 MOV AX,1200H 立即数寻址

MOV AX,20[BX+SI]基址变址寻址 MOV AX,[DI+20] 变址寻址 10.现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H, (20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=0B7H,(21023H)=65H,下列指令执行后填入AX寄存器的内容: (1)MOV AX,1200H;(AX)= 1200H (2)MOV AX,BX;(AX)=0100H (3)MOV AX,[1200H];(AX)= 4C2AH (4)MOV AX,[BX];(AX)= 3412H (5)MOV AX,1100[BX];(AX)= 4C2AH (6)MOV AX,[BX][SI];(AX)= 7856H (7)MOV AX,1100[BX][SI];(AX)= 65B7H 11.已知‘A’的ASCII是41H,那么‘E’的ASCII是45H 。 12.Ends 是段定义结束伪指令,与Segment配套使用。 13.逻辑地址由段基值和偏移量组成。将逻辑地址转换为物理地址的公 式是段基值*16+偏移量。其中的段基值是由段寄存器存储。 14.一个有16个字的数据区,它的起始地址为70A0:0100H,那么该数据 区的最后一个字单元的物理地址为70B1E H。 15.DEBUG命令中,显示内存命令 D ,显示寄存器命令R,汇编命令 A ,执行命令G 。

汇编语言试题及答案(1)

一,单项选择题(每小题1分,共20分) 1.指令JMP FAR PTR DONE属于() A.段内转移直接寻址B.段内转移间接寻址C.段间转移直接寻址D.段间转移间接寻址2.下列叙述正确的是() A.对两个无符号数进行比较采用CMP指令,对两个有符号数比较用CMP S指令 B.对两个无符号数进行比较采用CMPS指令,对两个有符号数比较用CM P指令 C.对无符号数条件转移采用JAE/JNB指令,对有符号数条件转移用JGE/J NL指令 D.对无符号数条件转移采用JGE/JNL指令,对有符号数条件转移用JAE/J NB指令 3.一个有128个字的数据区,它的起始地址为12ABH:00ABH,请给出这个数据区最末一个字单元的物理地址是() A.12C5BH B.12B6BH C.12C5AH D.12BFEH 4.在下列指令的表示中,不正确的是() A.MOV AL,[BX+SI] B.JMP SHORT DONI C.DEC [BX] D.MUL CL 5.在进行二重循环程序设计时,下列描述正确的是() A.外循环初值应置外循环之外;内循环初值应置内循环之外,外循环之内 B.外循环初值应置外循环之内;内循环初值应置内循环之内 C.内、外循环初值都应置外循环之外 D.内、外循环初值都应置内循环之外,外循环之内 6.条件转移指令JNE的测试条件为() A.ZF=0 B.CF=0 C.ZF=1 D.CF=1 7.8086CPU在基址加变址的寻址方式中,变址寄存器可以为()A.BX或CX B.CX或SI C.DX或SI D.SI或DI 8.已知BX=2000H,SI=1234H,则指令MOV AX,[BX+SI+2]的源操作在()中。 A.数据段中偏移量为3236H的字节 B.附加段中偏移量为3234H的字节 C.数据段中偏移量为3234H的字节

汇编语言程序设计试题

汇编语言程序设计试题 一、单项选择题(在每小题的四个备选答案中,选出一个正确答案,并将正确答案的序号填在题干的括号内。每小题2分,共50分) 1.CPU发出的访问存储器的地址是( A ) A.物理地址 B.偏移地址 C.逻辑地址 D.段地址 2.使计算机执行某种操作的命令是( B ) A.伪指令 B.指令 C.标号 D.助记符 3.若AX=3500H,CX=56B8H,当AND AX,CX指令执行后,AX=(A) A. 1400H B. 77F8H C. 0000H D. 0FFFFH 4.计算机处理问题中会碰到大量的字符、符号,对此必须采用统一的二进制编码。目前,微机中普遍采用的是( C)码。 A. BCD码 B.二进制码 C.ASCII码 D.十六进制码 5.下列关于8086CPU的工作原理的描述错误的是__C___。 A.汇编程序员可以通过对各种寄存器中内容的修改实现对CPU的控制。B.CPU在访问内存时,采用“段地址*16+偏移地址”的形式给出要访问的内存单元的物理地址。 C.任意时刻,CS:IP指向的内容即是此刻CPU正在执行的指令。 D.传送指令能够更改所有通用寄存器的内容。 6.一个有128个字的数据区,它的起始地址为12ABH:00ABH,请给出这个数据区最末一个字单元的物理地址是(C) A.12CFBH B.12B6BH C.12C5BH D.12BFEH 7. 16位结构的CPU 不一定具备的特性是(D)。 A. 运算器一次最多可以处理16位的数据 B. 寄存器的最大宽度为16位 C. 寄存器和运算器之间的通路为16位 D. 地址总线为16根 8. 下列指令的书写正确的是(C)。 A. push al B. mov cs:[0],ds:[10] C. pop si D. mov ds:[0],2 9.在DEBUG工具中,显示寄存器内容的命令是( D )。 A. G B. D C. T D. R 10. 能够将ax中的内容送到内存0000:0200H处的指令序列是(D)。

汇编语言平时练习(判断题)

假设存储器中从7462H单元开始的四个相邻字节单元中的容依次是32H,46H,52H,0FEH,则存放字数据0FE52H的字地址是7465H。 错误 4.知识点:0303(80x86的指令系统) MOV指令不影响标志位。 正确 5.知识点:0303(80x86的指令系统) 无条件转移指令对标志位无影响,而条件转移指令对标志位有影响。 正确 6.知识点:0303(80x86的指令系统) 指令IN AL,DX是合法的指令。 正确 7.知识点:0303(80x86的指令系统) 当运算结果的低8位中有偶数个1 时, 奇偶标志位PF被置为1。 正确 9.知识点:0301 (80x86的寻址方式) 可以将一个存储器操作数与另一个存储器操作数相加。 错误 10.知识点:0303(80x86的指令系统) 在“IN AL,端口地址”指令中,端口地址指定了某个外部设备接口的I/O地址,它实际上是一个立即数,其围为0~65535。 答案:错误 11.知识点:0401(汇编程序功能) 汇编程序和汇编语言源程序是不同的概念。 答案:正确 12.知识点:0301 (80x86的寻址方式) 相对于某起始地址的偏移量称为偏移地址。 答案:正确 13.知识点:0303(80x86的指令系统) 只能使用PUSH,POP类的指令对堆栈段的容进行操作。 14.知识点:0301 (80x86的寻址方式) 立即数寻址方式不能用于目的操作数字段。 错误 15.知识点:0203(中央处理机) BP是堆栈栈顶指针寄存器。 错误

存中字单元的地址必须是偶数地址。 答案:错误 17.知识点:0303(80x86的指令系统) PUSH AL。 正确 19.知识点:0303(80x86的指令系统) SHR AX,CX。 正确 20.知识点:0401(汇编程序功能) 汇编程序是用汇编语言编写的汇编语言源程序。 答案:错误 22.知识点:0301 (80x86的寻址方式) 不能给段寄存器进行立即数方式赋值。 正确 23.知识点:0303(80x86的指令系统) 串操作指令一般用CX存放长度。 错误 24.知识点:0204(存储器) 因为有段寄存器,所以存储器要分段。 答案:错误 25.知识点:0303(80x86的指令系统) 逻辑右移1位和算术右移1位的效果是一样的。 答案:错误 26.知识点:0402(伪操作) 在变量定义是,可以通过使用ORG伪指令指定变量在段中存储时的偏移量。 正确 27.知识点:0303(80x86的指令系统) 指令SHR AX,4可以将AX的容逻辑右移4位。 答案:错误 28.知识点:0303(80x86的指令系统) CMP AX,BX执行的操作时(AX)-(BX),但结果不保存,只改变标志寄存器中标志位的值。正确 29.知识点:0402(伪操作) ASCII DW ‘ABCD’。 答案:错误 30.知识点:0303(80x86的指令系统) MOV SI,[SI]。

相关文档