搜档网
当前位置:搜档网 › 汇编语言学习笔记

汇编语言学习笔记

汇编语言学习笔记
汇编语言学习笔记

汇编语言学习笔记

《汇编语言》--王爽

前言

学习汇编目的:充分获得底层编程体验;深刻理解机器运行程序的机理。

原则:没有通过监测点不要向下学习;没有完成当前实验不要向下学习。

第一章基础知识

有三类指令组成汇编语言:汇编指令;伪指令;其他符号。8bit = 1byte = 一个存储单元有n根地址线,则可以寻址2的n次方个内存单元。

1.1节--1.10节小结

(1)汇编指令是机器指令的助记符,同机器指令一一对应。

(2)每一种cpu都有自己的汇编指令集。

(3)cpu可以直接使用的信息在存储器中存放。

(4)在存储器中指令和数据没有任何区别,都是二进制信息。

(5)存储单元从零开始顺序编号。

(6)一个存储单元可以存储8个bit,即八位二进制数。

(7)每一个cpu芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个cpu可以引出的三种总线的宽度标志了这个cpu不同方面的性能。地址总线的宽度决定了cpu的寻址能力;数据总线的宽度决定了cpu与其他器件进行数据传送时的一次数据传送量;控制总线的宽度决定了cpu对系统中其他器件的控制能力。

监测点:1KB的存储器有1024个存储单元?存储单元的编号从0到1023.

内存地址空间:

最终运行程序的是cpu,我们用汇编编程时,必须要从cpu的角度思考问题。对cpu来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受cpu

寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。

第二章寄存器(cpu的工作原理)

mov ax, 2

add ax, ax

add ax, ax

add ax, ax

(1)cpu中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;

(2)段地址和偏移地址通过内部总线送人一个称为地址加法器的部件;

(3)地址加法器将两个16位地址合成为一个20位的物理地址;

(4)地址加法器通过内部总线将20位物理地址送人输入输出控制电路;

(5)输入输出控制电路将20位物理地址送上地址总线;

(6)20位物理地址被地址总线传送到存储器;

段地址*16+偏移地址= 物理地址的本质含义

内存并没有分段,段的划分来自cpu。

以后编程时可以根据需要,将若干地址连续的内存单元看做一个段,用段地址*16定位段的起始地址,用偏移地址定位段的内存单元。

一个段的起始地址一定是16的倍数,一个段的最大长度为64kB。当然也没有办法定义一个起始地址不是16的倍数的段。

cpu可以用不同的段地址和偏移地址形成同一物理地址。

在8086cpu加电启动或复位后cs和ip被设置为cs = f000h,ip = ffffh,即ffff0h单元中的指令是8086pc机开机后执行的第一条指令。(??应该是fffffh吧??)

cpu将cs:ip指向的内存单元看做指令。

在cpu中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对cpu的控制。

mov指令称为传送指令,cpu中大部分寄存器的值都可以通过mov指令改变。

除了cs:ip 8086没给他这样的功能。

cs:ip可以用转移指令来改变。jmp

jmp cs:ip 用指令给出的段地址修改cs,偏移地址修改ip

jmp 某一寄存器的功能为:用寄存器中的值修改ip

jmp ax 含义类似于mov ip,ax

段地址在8086pc机的段寄存器存放。当8086cpu要访问内存时,由段寄存器提供内存单元的段地址。8086cpu有四个段寄存器,其中cs用来存放指令的段地址。

cs存放指令的段地址,ip存放指令的偏移地址。

8086机中,任意时刻,cpu将cs:ip指向的内容当作指令执行。

8086cpu的工作过程:

1.从cs:ip指向内存单元读取指令,读取的指令进入指令缓冲器;

2.ip指向下一条指令

3.执行

8086提供转移指令修改cs:ip的内容

debug的使用

查看,修改cpu中寄存器的内容:r命令

查看内存中的命令:d命令

修改内存中的内容:e命令(可以写入数据,指令,在内存中,它们实际上没有区别)

将内存中的命令解释为机器指令和相应的汇编指令:u命令

执行cs:ip指向的内存单元处的命令:t命令

以汇编指令的形式向内存中写入指令:a命令

第三章寄存器(内存访问)

3.1内存中字的存储

高八位存放在高字节中,低八位存放在低字节中

3.2DS和【address】

3.3字传送

3.4MOV ADD SUB

3.5数据段

3.6栈

栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。

栈有两个基本的操作:入栈和出栈。

栈的这种操作规则被称为:lifo(last in first out,后进先出)。

cpu如何知道10000H--1000fH这段空间被当作栈使用?

push pop指令在执行时必须知道哪个单元是栈顶单元,可是如何知道呢?

栈顶的段地址存放在ss中,偏移地址存放在sp中。任意时刻,ss:sp指向栈顶单元。push和pop指令执行时,cpu从ss和sp中得到栈顶的地址。

入栈时,栈顶从高地址向低地址方向增长。

如何定义一个栈的大小?

mov ax, 1000h

mov ss, ax

mov sp, 0010h ;则栈顶为1000f 栈底为10000

******************************************

mov ax, 1000h

mov ds, ax

mov ax, 2266h

mov [0], ax

************************

mov ax,1000h

mov ss, ax

mov sp, 0002h

mov ax, 2266h

push ax

栈顶的变化范围最大为:0--ffffh

栈的综述

(1)8086cpu提供了栈操作机制,方案如下:

在ss、sp中存放栈顶的段地址和偏移地址;

提供入栈和出栈指令,他们根据ss、sp指示的地址,按照栈的方式访问内存单元。

(2)push指令的执行步骤:1)sp=sp-2;2)向ss:sp指向的字单元送人数据;

(3)pop指令的执行步骤:1)从ss:sp指向的字单元中读取数据;2)sp=sp+2

(4)任意时刻,ss:sp指向栈顶元素。

(5)8086cpu只记录栈顶,栈空间的大小我们要自己管理。

(6)用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。(7)push、pop指令实质上是一种内存传送指令,注意他们的灵活运用。

一个栈段最大可以设为64k

段的综述

我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们的安排。

用一个段存放代码,即代码段

用一个段存放数据,即数据段

用一个段当栈,即栈段

对于数据段,把段地址放在ds中,用mov,add,sub等访问内存单元的指令时,cpu就将我们定义的数据段内容当做数据来访问;

对于代码段,把段地址放在cs:ip中,用mov,add,sub等访问内存单元的指令时,cpu 就将执行我们定义的代码段的指令;

对于栈段,把段地址放在ss:sp中,用push pop 等访问内存单元的指令时,cpu就将其当作堆栈来访问;

debug的t命令在执行修改器ss的指令时,下一条指令也紧接着被执行了。

3.7栈超界问题

8086cpu不保证我们对栈的操作不会超界。也就是说,8086cpu只知道栈顶在何处而不知道我们安排的栈空间有多大,这点就好像,cpu只知道当前要执行的指令在何处,而不知道要执行的指令有多少。从这两点我们可以看出cpu的工作机理,它只考虑当前情况:当前的栈在何处,当前要执行的指令是哪一条。

对于超界问题我们可以做到就是小心。

第五章【bx】和loop指令

我们完整的描述一个内存单元,需要两种信息:

(1)内存单元的地址;(2)内存单元存放数据的类型;

inc bx的含义是bx中的内容加一

[bx]寄存器bx中所包含的地址中存放的内容

[bx]表示一个内存单元,他的偏移地址在bx中。

loop指令执行的时候,要进行两步操作:

1;(cx)=(cx)- 1;

2;判断cx中的值,不为零则转至标号处执行。

“通常”我们用loop实现循环功能,cx中存放循环次数。

用cx和loop指令相配合实现循环功能的三个要点:

(1)再cx中存放循环次数;

(2)loop指令中的标号所标识地址要在前面;

(3)要循环执行的程序段,要写在标号和loop指令的中间。

在汇编源程序中,数据不能以字母开头。

所以对于大于9fffh的数,均在前面加上0。

mov cx,11

s: add ax,ax

loop s

assume cs:code

code segment

..

mov ax,4c00h

int 21h

code ends

end

ffff:6单元是一个字节单元,ax是一个十六位寄存器,数据长度不一样,如何赋值?

注意我们说的是“赋值”,就是说,让ax中的数据的值(数据的大小)和ffff:0006单元中的数据的值(数据的大小)相等。八位数据01h和16位数据0001h的数据长度不一样,但他们的值是相等的。

设ffff:0006单元中的的数据是xxh,若要ax中的值和ffff:0006单元中的值相等,ax中的数据应为00xxh。所以,若实现ffff:0006单元向ax赋值,我们应该令(ah)=0,(al)=(ffff6H).

若希望程序能从cs:0012处执行,可以用g命令。“g 0012”。他表示程序执行到0012处。若希望程序能跳出循环,用p命令

5.4 debug和汇编编译器masm对指令的不同处理。

在汇编源程序中,mov al,[0]会被编译器解释成为:mov al,0

所以要这样表达:mov bx,0

mov al,[bx]

或者 mov al,ds:[0]

第一,我们在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用[...]来表示内存单元,如果在[]里用一个常量idata直接给出内存单元的偏移地址,就要在[]的前面显示地给出段地址所在的段寄存器。

第二,如果在[]里用寄存器,比如bx,间接给出内存单元的偏移地址,则段寄存器默认在ds中。

第六章包含多个段的程序

程序取得所需段的方法有两种:

一是在加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请。

dw的含义是定义字型数据即define word 字型数据间以逗号隔开。

程序运行的时候cs存放代码段的段地址,所以我们可以从cs中得到它们的段地址。

dw定义的数据处于代码段的最开始,所以偏移地址为零。

dw 0123h,5604h,1234h

start :指令

end start

我们在程序的第一条指令的前面加了一个标号start:并在end的后面再次加入。

end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。在单任务系统中,可执行文件中的程序执行如下:

(1)由其他的程序(debug、command或其他程序)将可执行文件中的程序加载入内存;(2)设置cs:ip指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运行;(3)程序运行结束后,返回到加载者;

描述信息

可执行文件由描述信息和程序组成,程序来源于源程序中的汇编指令和定义的数据;描述信息则主要是编译连接程序对原程序中相关伪指令进行处理所得到的信息。

6.2 在代码中使用栈

在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来使用。

例如将cs:16 -- cs:31的内存空间当作栈来用,初始状态下栈为空,所以ss:sp要指向栈底,则设置ss:sp指向cs:32.

6.3将数据代码栈放入不同的段

用assume将定义的具有一定用途的段跟寄存器联系起来

第七章更灵活的定位内存地址的方法

7.1 and 和or 指令

(1)and指令:逻辑与指令,按位进行与运算。

mov al ,01100011B

and al ,00111011B

执行后:al=00100011B

通过该运算可将操作对象的相应位设为0,其他位不变。

(2)or指令:逻辑或指令,按位进行或运算。

通过该运算可将操作对象的相应位设为1,其他位不变。

7.2 关于ASCII码

所谓编码方案,就是一套规则,它约定了用什么样的信息来表示现实对象。

小写字母的ASCII码值,比大写字母的ASCII码值大20H。

就ASCII码的二进制形式来看,除第五位外,大写字母和小写字母的ASCII码值都一样。大写字母第五位为0,小写字母第五位为1.

运用and和or指令的给特定位赋值功能即可实现大小写字母之间的转换。

7.5 [bx+idata]

类似于[bx]的一种更灵活的指明内存单元的方式。

[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata (bx中的数值加上idata。

也可以写成

mov ax,[200+bx]

mov ax,200[bx]

mov ax,[bx].200

7.6 用[bx+idata]的方式进行数组的处理

7.7 SI和DI

SI和DI是8086cpu中和bx功能相近的寄存器。区别是SI和DI不能够分成两个八位寄存器来使用。

codesg segment

start:mov ax,datasg

mov ds,ax

mov si,0

mov di,16

mov cx,8 ;di si 为16位寄存器只需循环

s: mov ax,[si]

mov [di],ax ;八次即可将16个字节传送完毕

add si,2

add di,2

loop s

mov ax,4c00h

int 21h

codesg ends

end start

si = di - 16

[di] = 16[si] = [si +16] = [si].16

7.8【bx+si】和【bx+di】

[bx+si]表示一个内存单元,偏移地址为bx中的数值加上si中的数值,是一种更加灵活的寻址方式。

7.9【bx+si+idata】和【bx+di+idata】

mov ax,【bx+di+idata】

7.10不同的寻址方式的灵活运用

(1)【idata】用一个常量来表示地址,可用于直接定位一个内存单元;

(2)【bx】用一个变量来表示内存地址,可用于间接定位一个内存单元

(3)【bx+idata】用一个变量加一个常量来表示内存地址,可在一个起始地址的基础上用变量间接定位一个内存单元

(4)【bx+si】用两个变量表示地址

(5)【bx+si+idata】用两个变量和一个常量来表示地址

第八章数据处理的两个基本问题

(1)处理的数据在什么地方?

(2)要处理的数据有多长?

我们定义的描述性符号:reg和sreg 分别表示寄存器和段寄存器

reg:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di;

sreg:cs,ds,ss,es;

8.1 bx,si,di,bp

(1)这四个寄存器可以用在[...]中来进行内存单元的寻址。

而下面的指令是错误的

mov ax,[cx]

mov ax,[ax]

mov ax,[dx]

mov ax,[ds]

(2)可单个出现,或只能以四种组合出现:bx和si;bx和di;bp和si,bp和di。

(3)只要在[]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中。

8.2

机器中数据处理的指令大致可分为三类:读取,写入,运算。

所要处理的数据可以在三个地方:cpu内部,内存,端口。

8.3汇编语言中数据位置的表达

1.立即数

直接包含在机器指令中的数据(执行前在cpu的指令缓冲器中)

mov ax,1

add bx,2000h

or bx,00010000b

mov al,…a?

2.寄存器

3.段地址(SA)和偏移地址(EA)

mov ax,[0]

mov ax,[di]

mov ax,[bx+8]

mov ax,[bx+si]

mov ax,[bx+si+8]

段地址默认在ds中

mov ax,[bp]

mov ax,[bp+8]

mov ax,[bp+si]

mov ax,[bp+si+8]

段地址默认在ss中

8.4 寻址方式

直接寻址

寄存器间接寻址

寄存器相对寻址

基址变址寻址

相对基址变址寻址

8.5 指令要处理的数据有多长

指令可以处理两种尺寸的数据,byte和word。

汇编语言中数据处理方法

(1)通过寄存器名指明指令进行的是字操作

(2)在没有寄存器名存在的情况下用操作符X ptr指明内存单元的长度X在汇编指令中为word或byte

mov word ptr ds:[0],1

inc byte ptr ds:[0],1

(3)有些指令默认了访问的是字单元还是字节单元如push [1000H] 只进行字操作。

8.6 寻址方式的综合应用

8.7 div指令

div 是除法指令

(1)除数:有八位和十六位两种,在一个寄存器或内存单元中。

(2)被除数:默认存放在ax或ax和dx中,如果除数是八位,被除数则为十六位,默认在ax中存放;如果除数是十六位,被除数则为三十二位,默认dx中存放高十六位,ax中存放低十六位。

(3)结果:除数是八位,则al存放除法的商,ah存放除法操作的余数。除数是十六位,则ax存放除数的商,dx存放除法操作的余数。

div byte ptr ds:[0] 被除数在ax中。商在al中,余数在ah中。

div word ptr es:[0] 被除数高十六位在dx中,低十六位在ax中;商在ax中,余数在dx 中。

8.8 伪指令dd

db == define byte 占一个字节

dw == define word 占一个字

dd == define double word 占两个字

8.9 dup

操作符由编译器识别处理的符号。

与db dw dd 配合使用,来进行数据的重复。

db 3 dup(0) = db 0,0,0

db 3 dup(0,1,2) = db 0,1,2,0,1,2,0,1,2

dx 重复的次数dup (重复的数据)

第九章转移指令

可以修改ip,或同时修改cs和ip的指令统称为转移指令。

可以控制cpu执行内存中某处代码的指令。

段内转移:只修改ip时jmp ax 修改范围-128 127

段间转移:同时修改cs:ip时jmp 1000:0 修改范围-32768 32767

无条件转移指令jmp

条件转移指令

循环指令

过程

中断

9.1操作符offset

offset 作用取得标号的偏移地址

start:mov ax,offset start ;相当于mov ax,0

s:mov ax,offset s

9.2jmp指令

9.3依据位移进行转移的jmp指令

jmp short 标号

实现段内短转移,对ip的修改范围是-128 127

cpu在执行jmp指令的时候并不需要转移的目的地址

需要的是所需偏移的数值

指令“jmp short 标号”的功能为:(ip)=(ip)+8位位移

(1)八位位移= “标号”处的地址- jmp指令后的第一个字节的地址

(2)short指明此处的位移为八位位移。

(3)八位位移的范围为-128 127,用补码表示;

(4)八位位移由编译程序在编译时算出。

还有一种jmp near ptr 标号实现段内近转移(ip)= (ip)+16位位移

(1)16位位移= “标号”处的地址- jmp指令后的第一个字节的地址

(2)near ptr 指明此处的位移为16位位移,进行的是段内近转移;

(3)16位位移的范围为-32768 32767,用补码表示。

(4)16位位移由编译程序在编译时算出。

9.4 转移的目的地址在指令中的jmp指令

jmp far ptr标号实现的是段间转移,又称为远转移。

(cs)=标号所在段的段地址;(ip)=标号在段中的偏移地址

9.5转移地址在寄存器中的jmp指令

jmp 16位寄存器(ip)=(16位寄存器)

9.6转移地址在内存中的jmp指令

分为两种格式:1,jmp word ptr 内存单元的地址(段内转移)

功能:内存单元地址开始存放着的一个字是转移的目的偏移地址

2,jmp dword ptr 内存单元地址(段间转移)

功能:内存单元开始处存放两个字,高地址的字是转移的目的段地址,地地址处是转移的目的偏移地址。

9.7 jcxz指令

有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,

而不是目的地址。

指令格式:j cx z 标号(如果(cx)=0,转移到标号处执行)

9.8 loop指令

loop指令为循环指令,所有的循环指令都是短转移。

9.9 根据位移进行转移的意义

9.10 编译器对转移位移超界的检测

jmp 2000:0100 的转移指令,是在debug中使用的汇编指令,汇编编译器并不认识。如果在源程序中使用,编译时也会报错。

10.1 ret和retf

ret指令用栈中的数据,修改ip的内容,从而实现近转移;

retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移。

10.2 call

两步操作:

(1)将当前的ip或cs和ip压入栈中

(2)转移

不能进行短转移

10.3 依据位移进行转移的call指令

call 标号(将当前的ip压栈后,转到标号处执行)

call 标号相当于

push ip

jmp near ptr 标号

10.4 转移的目的地址在指令中的call指令

call far ptr 标号实现的是段间转移

call far ptr 标号

相当于

push cs

push ip

jmp far ptr 标号

10.5 转移地址在寄存器中的call指令

call 16位寄存器

push ip

jmp 16位寄存器

10.7 call和ret的配合使用

配合使用实现子程序的机制

call指令执行以后,ip已指向下一指令,然后call指令将此ip存入栈中,再jmp

call指令转去执行子程序前,call指令后面的指令的地址将存储在栈中,所以可以在子程序的后面使用ret指令,用栈中的数据设置ip的值,从而转到call指令后面的代码处继续执行。

10.8 mul指令

mul是乘法指令

(1)两个相乘的数:要么都是八位,要么都是十六位。

如果都是八位,一个存放在AH中,另一个放在八位寄存器或内存字节单元中;如果是16位,一个默认在AX中,另一个放在十六位寄存器或内存单元中。

(2)结果:如果是八位乘法,结果默认放在Ax中;如果是十六位乘法,结果高位默认在DX中存放,低位默认在Ax 中存放。

mul reg mul 内存单元

内存单元可以用不同的寻址方式给出,比如:

mul byte ptr ds:[0]

(ax) = (al)*((ds)*16+0)

mul word ptr [bx+si+8]

含义: (ax) = (ax)*((ds)*16+(bx)+(si)+8)结果的低十六位

(dx) = (ax)*((ds)*16+(bx)+(si)+8)结果的高十六位

10.9模块化程序设计

10.10参数和结果传递的问题

10.11批量数据的传递

capital:and byte ptr[si],11011111b

inc si

loop capital

ret

10.12 寄存器冲突的问题

主程序要使用cx记录循环次数,可是子程序也使用了cx,在执行子程序的时候,cx中保存的循环计数值被改变,使得主程序的循环出错。

子程序中使用的寄存器,很可能在主程序中也要使用,造成了寄存器使用上的冲突。

以后编写子程序的标准框架是:

子程序开始:子程序中使用的寄存器入栈

子程序内容

子程序中使用的寄存器出栈

ret、retf

第十一章标志寄存器

(1)用来存储相关指令的某些执行结果;

(2)用来为cpu执行相关指令提供行为依据;

(3)用来控制cpu的相关工作方式。

8086cpu中标志寄存器有十六位其中存储的信息被称为程序状态字(psw)。

flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义。

11.1 zf标志

第六位,零标志位。执行相关指令后,如果结果为零,那么zf为1.

add、sub、mul、div、inc、or、and等,大都是运算指令执行后对标志寄存器有影响。mov、push、pop等对标志寄存器没有影响。

11.2 pf标志

第二位,奇偶标志位。指令执行后其结果中的所有二进制中一的个数是否为偶数。如果1

的个数为偶数,pf = 1,如果为奇数,那么pf = 0。

11.3 sf标志

第七位,符号标志位。指令执行后,结果为负,sf=1,如果非负,sf=0.

计算机中通常用补码来表示有符号数据。计算机中一个数可以看做有符号数也可以看做无符号数。

10000001B,可以看做无符号数129,也可以看做有符号数-127.

对于同一个二进制数据,计算机可以将他看做无符号数来运算,也可以看做有符号数来运算。补码就是反码加一。

不管我们如何看待cpu在执行add等指令时,就已经包含了两种含义,也将得到同一种信息来记录的两种结果。关键在于我们的程序需要哪一种结果。

sf标志,就是cpu对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号数来运算的时候,可以通过他来得知结果的正负。如果我们将结果当作无符号数来计算,sf的值将没有意义。

11.4 cf标志

第零位,进位标志位。,它记录了运算结果有效位向更高位的进位。

11.5 of标志

第十一位,溢出标志位。在进行有符号数运算的时候,如果结果超出了机器所能表示的范围称为溢出。

cf是对无符号数运算有意义的标志位,of是对有符号数运算有意义的标志位。

两者之间没有关系。

11.6 adc指令

adc是带进位加法指令,它利用了cf位上记录的进位值。

ADC AX,BX (ax)= (ax)+(bx)+ cf

11.7 sbb指令

sbb是带借位减法指令,它利用了cf位上记录的借位值。

11.8 cmp指令

cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。

在进行无符号数比较时,cmp ax,bx

ZF = 1 ;(AX) = (BX)

ZF = 0 ;(AX) != (BX)

CF = 1 ;(AX) < (BX)

CF = 0 ;(AX) >=(BX)

CF = 0 && ZF = 0;(AX) > (BX)

CF = 1 || ZF = 1;(AX) <=(BX)

在进行有符号数比较时:cmp ah,bh

(1)SF = 1 && OF = 0

说明没有溢出,逻辑上真正的结果的正负= 实际结果的正负

因为SF = 1,实际结果为负,所以逻辑上真正的结果为负,所以(AH)< (BH)

(2)SF = 1 && OF = 1

说明有溢出,逻辑上真正的结果的正负!= 实际结果的正负;

因为SF = 1,实际结果为负,而又有溢出,这说明是由于溢出导致了实际结果为负,如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。

所以SF = 1 && OF = 1说明(AH)>(BH)

(3)SF = 0 && OF = 1

因为溢出导致实际结果为正,则逻辑结果必然为负;

所以(AH)<(BH)

(4)SF = 0 && OF = 0

没有溢出逻辑结果= 实际结果所以(AH) >= (BH)

11.9 检测比较结果的条件转移指令

“条件转移指令”根据条件决定是否修改IP

jcxz即为一条条件转移指令,jmp cx zero 如果cx=0就修改ip否则什么也不做。所有条件转移指令的转移位移都是【-128,127】。

如call和ret配合使用一般,系统提供了一些转移指令与cmp配合使用。

je = jmp equal 等于则转移检查标志位zf = 1

jne = jmp not equal 不等于则转移zf = 0

jb = jmp below 低于则转移cf = 1

jnb = jmp not below 不低于则转移cf = 0

ja = jmp above 高于则转移cf = 0 && zf = 0

jna = jmp not above 不高于则转移cf = 1 || zf = 1

11.10 DF标志和串传送指令

第十位,方向标志位。在串处理指令中,控制每次操作后SI,DI的增减。

DF = 0;每次操作后SI,DI递增

DF = 1;每次操作后SI,SI递减

串传送指令:MOVSB

相当于:

(1)((ES)*16 + (DI)) = ((DS)*16 + (SI))

(2)如果DF = 0 则:(SI) = (SI) + 1

(DI) = (DI) + 1

如果DF = 1 则:(SI) = (SI) - 1

(DI) = (DI) - 1

MOVSW 可以传送一个字

MOVSB和MOVSW进行的是串传送操作中的一个步骤,一般都要和rep配合使用,格式如下:

rep movsb

相当于:

s:movsb

loop s

rep的作用是根据cx的值,重复执行后面的串传送指令。

8086cpu提供了下面两条指令对DF位进行设置:

CLD:将DF位置0

STD:将DF位置1

1.传送的原始地址

2.传送的目的地址

3.传送的长度

4.传送的方向

11.11 pushf和popf

压入/弹出标志寄存器中的数据

为访问标志寄存器提供了一种方法。

11.12 标志寄存器在DEBUG中的表示

第十二章内中断

12.1 内中断的产生

cpu内部发生下面情况时,将产生相应的中断信息:

(1)除法错误(2)单步执行(3)执行int0命令(4)执行int命令

中断类型码0 1 4 n 为一个字节型数据

12.2 中断处理程序

cpu如何通过八位的中断类型码得到中断处理程序的段地址和偏移地址?

12.3 中断向量表

答:通过中断向量表

中断向量表就是中断处理程序入口地址的列表。保存在内存中。

cpu如何找到中断向量表?

对于8086中断向量表指定存在内存地址0处。从0000:0000到0000:03e8单元。共1000个字节。中断向量表中一个表项存放一个中断向量,占两个字。分别存放段地址和偏移地址。

12.4 中断过程

(1)从中断信息中取得中断类型码

(2)标志寄存器的值入栈

(3)设置标志寄存器的第八位TF和第九位IF的值为0

(4)CS的内容入栈

(5)IP的值入栈

(6)从内存地址为中断类型码*4和中断类型码*4 + 2 的两个字单元中读取中断处理程序的入口地址设置IP和CS

12.5 中断处理程序

(1)保存用到的寄存器

(2)处理中断。

(3)恢复用到的寄存器

(4)用IRET指令返回。

12.6 除法错误中断的处理

12.7 编程处理0号中断

12.8 安装

第十三章int指令

13.1 int指令

int指令的最终功能和call指令相似,都是调用一段程序。

13.2 编写供应用程序调用的中断例程

编写、安装中断7ch的中断例程,功能:求一word型数据的平方。

(AX) = 要计算的数据。

DX,AX存放结果的高十六位和低十六位。

MOV WORD PTR ES:[7CH*4],200H

MOV WORD PTR ES:[7CH*4+2],0

MOV CX,OFFSET SQREND-OFFSET SQR

CLD

REP MOVSB

int指令和iret指令配合使用与call指令和ret指令配合使用具有相似的思路。

13.3 对int、iret和栈的深入理解

*********************************

13.4 BIOS和DOS所提供的中断例程

BIOS主要包含以下内容:

1、硬件系统的检测和初始化程序

2、外部中断和内部中断的中断例程

3、用于对硬件设备进行I/O操作的中断例程

4、其他和硬件系统相关的中断例程

13.5 BIOS和DOS中断例程的安装过程

1.开机后,cpu一加点,初始化(cs)= 0FFFFH,(IP)= 0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条跳转指令,cpu执行该程序后,转去执行BIOS中的硬件检测和初始化程序。

2.初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的内容,一直在内存中存在。

3.硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交给操作系统控制。

4.DOS启动后,除完成其他工作外,还将它提供的中断例程装入内存,并建立相应的中断向量。

13.6 BIOS中断例程应用

int 10h 中断例程是BIOS提供的中断例程,其中包含多个和屏幕输出有关的子程序。

一个供程序员调用的中断例程往往包含多个子程序,中断例程内部用传递进来的参数来决定执行那一个子程序。BIOS和DOS提供的中断例程,都用AH来传递内部参数

13.7 DOS中断例程应用

例如我们一直在使用的4ch号子程序,即程序返回功能。

mov ah 4ch

mov al 0

int 21h

=================================================================== =====

DOS功能调用int 21h

(1)键盘输入

1) 1号调用——从键盘输入单个字符

调用格式:MOV AH,1

INT 21H

功能:等待从键盘输入一个字符并送入AL。

执行时系统将扫描键盘,等待有健按下,一旦有健按下,就将其字符的ASCII码读入,先检查是否Ctrl-Break,若是,退出命令执行;否则将ASCII码送AL,同时将该字符送显示器显示。

2) 10号调用——从键盘输入字符串

功能:从键盘接收字符串送入内存的输入缓冲区,同时送显示器显示。

调用前要求:先定义一个输入缓冲区

MAXLEN DB 100 ;第1个字节指出缓冲区能容纳的字符个数,即缓冲区长度,不能为0

ACLEN DB ? ;第2个字节保留,以存放实际输入的字符个数

STRING DB 100 DUP(?) ;第3个字节开始存放从键盘输入的字符串。

调用格式:LEA DX,MAXLEN(缓冲区首偏移地址)

MOV AH,10

INT 21H

(2)显示输出

1) 2号调用——在显示器上显示输出单个字符

调用格式:MOV DL,待显示字符的ASCII码

MOV AH,2

INT 21H

功能:将DL中的字符送显示器显示。

【例】显示输出大写字母A

MOV DL,41H ;或写为MOV DL,'A'

MOV AH,2

INT 21H

2) 9号调用——在显示器上显示输出字符串

调用格式:LEA DX,字符串首偏移地址

MOV AH,9

INT 21H

功能:将当前数据区中DS:DX所指向的以'$'结尾的字符串送显示器显示。

【例】在显示器上显示字符串“YOU ARE SUCESSFUL!”

DATA SEGMENT

STRING DB ' YOU ARE SUCESSFUL! $ '

DATA ENDS

CODE SEGMENT

… …

MOV AX,DATA

MOV DS,AX

LEA DX,STRING

MOV AH,9

INT 21H

… …

CODE ENDS

说明:若希望显示字符串后,光标可自动回车换行,可在定义字符串时作如下更改:STRING DB ' YOU ARE SUCESSFUL! ' ,0AH,0DH,' $ ' ;在字符串结束前加回车换行的ASCII码0AH,0DH

汇编语言 快速入门

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

8086 汇编例程

汇编语言(应用)程序(80X86/Pentium) 设计:乐金松 广东工业大学电子与信息工程学院

;This program for:R0R1-R2R3=R4R5 ;---------------------------------------------------------------- ;define stack segment STACK SEGMENT STACK 'STACK' DB 1024 DUP (0) STACK ENDS ;define data segment DATA SEGMENT R0 DW (?) R1 DW (?) R2 DW (?) R3 DW (?) R4 DW (?) R5 DW (?) R6 DW (?) R7 DW (?) DATA ENDS ;define code segment NDWSUB SEGMENT ; MAIN PROC FAR ASSUME CS:NDWSUB,DS:DATA,SS:STACK ; START: PUSH DS ;return DOS standard program MOV AX,0 PUSH AX MOV AX,DATA ;set DS MOV DS,AX MOV AX,R1 SUB AX,R3 MOV R5,AX MOV AX,R0 SBB AX,R2 MOV R4,AX RET MAIN ENDP NDWSUB ENDS END START

;This program for:R0R1+R2R3=R4R5 ;---------------------------------------------------------------- ;define stack segment STACK SEGMENT STACK 'STACK' DB 1024 DUP (0) STACK ENDS ;define data segment DATA SEGMENT R0 DW (?) R1 DW (?) R2 DW (?) R3 DW (?) R4 DW (?) R5 DW (?) R6 DW (?) R7 DW (?) DATA ENDS ;define code segment NDWADD SEGMENT ; MAIN PROC FAR ASSUME CS:NDWADD,DS:DATA,SS:STACK ; START: PUSH DS ;return DOS standard program MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AX,R1 ADD AX,R3 MOV R5,AX MOV AX,R0 ADC AX,R2 MOV R4,AX RET MAIN ENDP ;end process NDWADD ENDS ;end segment END START

第三章 8086汇编语言程序格式

第三章8086汇编语言程序格式 练习题 3.4.1 单项选择题 1.下列选项中不能作为名字项的是()。 A.FH B.A3 C.3B D.FADC 2.下列指令不正确的是()。 A.MOV AL,123 B.MOV AL,123Q C.MOV AL,123D D.MOV AL,123H 3.下列指令不正确的是()。 A.MOV BL,OFFSET A B.LEA BX,A C.MOV BX,OFFSET A D.MOV BX,A 4.若定义“BUF DB 1,2,3,4”,执行MOV AL,TYPE BUF 后AL=()。 A.0 B.1 C.2 D.3 5.若定义“A EQU 100”,执行“MOV AX,A”后,AX=()。 A.A的偏移地址B.A单元中的内容 C.100 D.A的段地址 6.若定义“B DW 1,2,10 DUP(0)”,则该伪指令分配()字节单元。 A.10 B.20 C.22 D.24 7.若定义“C DD 2,4”,则该伪指令分配()个字节单元。 A.2 B.4 C.6 D.8 8、伪指令是()规定的汇编说明符,它在源程序汇编时进行说明。 A、DEBUG B、LINK C、MASM D、EDIT 9.在上机操作过程中,MASM命令执行后,除了生成一个目标文件外,根据选择还可以生成一个()文件。 A..LST B..EXE C..MAP D..ASM 10.LINK命令执行后可以生成一个以()为扩展名的文件。 A.ASM B.EXE C.OBJ D.COM 11.一个段最大可定义()字节。 A.1M B.64K C.32K D.16K 12.若要求一个段的起始位置能被256整除的单元开始,在定位方式选项中应选()。 A.BYTE B.WORD C.PARA D.PAGE 13.宏指令与子程序相比,在多次调用时,宏指令调用的目标程序长度比子程序调用的()。 A.相同B.长C.短D.不定 14.宏指令与子程序相比,子程序调用的执行速度比宏指令的()。 A.相同B.快C.慢D.不定 15.ASSUME伪指令说明了汇编程序所定义段与段寄存器的关系,它只影响()的设定。 A.源程序B.目标程序C.汇编程序D.连接程序

汇编语言程序设计实验报告

微机原理实验报告 实验名称汇编语言程序设计 一、实验目的 1、掌握Lab6000p实验教学系统基本操作; 2、掌握8088/8086汇编语言的基本语法结构; 3、熟悉8088/8086汇编语言程序设计基本方法 二、实验设备 装有emu8086软件的PC机 三、实验内容 1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH, 97H,64H,BBH,7FH,0FH,D8H。编程并显示结果:如果数组是无符号数,求出最大值,并显示; 如果数组是有符号数,求出最大值,并显示。 2、将二进制数500H转换成二-十进制(BCD)码,并显示“500H 的BCD是:” 3、将二-十进制码(BCD)7693转换成ASCII码,并显示“BCD 码7693的ASCII是:” 4、两个长度均为100的内存块,先将内存块1全部写上88H,再 将内存块1的内容移至内存块2。在移动的过程中,显示移动次数1,2 ,3…0AH…64H(16进制-ASCII码并显示子程序) 5、键盘输入一个小写字母(a~z),转换成大写字母 显示:请输入一个小写字母(a~z): 转换后的大写字母是: 6、实现4字节无符号数加法程序,并显示结果,如99223344H + 第1页

99223344H = xxxxxxxxH 四、实验代码及结果 实验代码见代码附录 1.1程序运行结果 图1 无符号最大值结果截图 1.1 程序运行结果

图2 有符号最大值截图2.0 程序运行结果

图3 BCD码显示3.0 程序运行结果

图4 ASCII码显示4.0 程序运行结果

图5 移动次数显示5.0 程序运行结果

汇编语言入门

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

汇编语言知识大全

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

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

汇编语言基本关键字

汇编语言基本关键字 aaa对非压缩BCD码加法之和调整 aas 对非压缩BCD码减法之差调整 aam乘法调整aad被除数调整 add不带进位标志位的加法adc带进位标志位的加法 and逻辑与 assume指定段寄存器 bswap双字单操作数内部交换 bt位测试bts位测试并置一 btr位测试并清零btc位测试并取反 bsf/bsr正,反向位扫描 call调用 cbw字节转换为字cwd字转换为双字cwde字转换为扩展的双字cdq双字转换为四字 cmp比较cmpxchg比较并交换 cmps串比较 code定义简化代码段 const定义简化常数数据段 daa对压缩BCD码加法之和调整das对压缩BCD码减法之差调整 data定义简化数据段 db/dw/dd/dq/dt定义字节/字/双字/四字/十字变量 dec减一

df定义32位便宜地址的远地址指针 div无符号数除法 equ等价textequ文本等价 even取偶偏移地址 fardata,fardata定义简化独立数据段 group定义段组 idiv有符号整数除法 imul有符号整数乘法 in输入 inc加一 ins/outs输入/输出串元素 jcxz/jecxz若cx=0/ecx=0,跳转 jmpdopd无条件跳转到DOPD 处取出指令继续执行 label为$定义符号 Lahf 标志位低八位送AH lea 偏移地址送通用寄存器lda传送进入数据段的地址指针 les传送进入附加数据段的地址指针lfs传送进入FS段的地址指针lgs传送进入GS段的地址指针lss传送进入堆栈段的地址指针 local说明局部变量 lods读出串元素 Loop/loopd无条件循环cx/ecx为循环次数 loopnz/loopnzd非零或不等时循环,cx/ecx为循环次数

汇编语言程序设计实验篇emu

1.汇编语言程序设计实验篇 1.1.汇编系统软件简介 Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug 的模拟器。它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。 1.1.1创建程序 https://www.sodocs.net/doc/4d8405246.html, TEMPLATE程序 本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。 在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。

在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。 输入全部指令后,单击按钮,保存相应的程序段。 2.EXE TEMPLATE程序 本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。 在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。

汇编语言基础知识

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

常用汇编语言8086程序集锦

一、计算X+Y=Z,将结果Z存入某存储单元。 (1). 实验程序如下: STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS DATA SEGMENT XL DW ? ;请在此处给X低位赋值 XH DW ? ;请在此处给X高位赋值 YL DW ? ;请在此处给Y低位赋值 YH DW ? ;请在此处给Y高位赋值 ZL DW ? ZH DW ? DATA E NDS CODE S EGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,XL ;X低位送AX ADD AX,YL ;X低位加Y低位 MOV ZL,AX ;存低位和 MOV AX,XH ;X高位送AX ADC AX,YH ;X高位加Y高位 MOV ZH,AX A1: JMP A1 CODE E NDS END START 二、计算X-Y=Z,其中X、Y、Z为BCD码。实验程序及流程如下:STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS DATA SEGMENT X DW ? ;请在此处给X赋值 Y DW ? ;请在此处给Y赋值 Z DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,00H SAHF MOV CX,0002H LEA SI, X LEA DI, Z A1: MOV AL,[SI] SBB AL,[SI+02H] DAS PUSHF AND AL,0FH

8086汇编语言小结

8086/8088汇编指令小结 一、数据传送指令; 二、算术指令; 三、逻辑指令; 四、串处理指令; 五、控制转移指令; 六、处理机控制指令。 (详情见全文) 一、数据传送指令 1.通用数据传送指令 MOV(Move)传送 PUSH(Push onto the stack)进栈 POP(Pop from the stack)出栈 XCHG(Exchange)交换 .MOV指令 格式为: MOV DST,SRC 执行的操作:(DST)<-(SRC) .PUSH进栈指令 格式为:PUSH SRC 执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) .POP出栈指令 格式为:POP DST 执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 .XCHG 交换指令 格式为:XCHG OPR1,OPR2 执行的操作:(OPR1)<-->(OPR2) 2.累加器专用传送指令 IN(Input) 输入 OUT(Output) 输出 XLAT(Translate) 换码 这组指令只限于使用累加器AX或AL传送信息. .IN 输入指令 长格式为: IN AL,PORT(字节) IN AX,PORT(字) 执行的操作: (AL)<-(PORT)(字节)

(AX)<-(PORT+1,PORT)(字) 短格式为: IN AL,DX(字节) IN AX,DX(字) 执行的操作: AL<-((DX))(字节) AX<-((DX)+1,DX)(字) .OUT 输出指令 长格式为: OUT PORT,AL(字节) OUT PORT,AX(字) 执行的操作: (PORT)<-(AL)(字节) (PORT+1,PORT)<-(AX)(字) 短格式为: OUT DX,AL(字节) OUT DX,AX(字) 执行的操作: ((DX))<-(AL)(字节) ((DX)+1,(DX))<-AX(字) 在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口 号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息. .XLAT 换码指令 格式为: XLAT OPR 或: XLAT 执行的操作:(AL)<-((BX)+(AL)) 3.有效地址送寄存器指令 LEA(Load effective address)有效地址送寄存器 LDS(Load DS with Pointer)指针送寄存器和DS LES(Load ES with Pointer)指针送寄存器和ES .LEA 有效地址送寄存器 格式为: LEA REG,SRC 执行的操作:(REG)<-SRC 指令把源操作数的有效地址送到指定的寄存器中. .LDS 指针送寄存器和DS指令 格式为: LDS REG,SRC 执行的操作:(REG)<-(SRC) (DS)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器. .LES 指针送寄存器和ES指令 格式为: LES REG,SRC 执行的操作: (REG)<-(SRC) (ES)<-(SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该

8086 汇编语言中断程序设计

汇编语言程序设计实验报告 学院:计算机科学与技术专业:计算机科学与技术班级:计科131

LEA DX,FNAME MOV CX,0 ;语句1 INT 21H JC EXIT MOV FNUM,AX MOV BX,AX ;语句2 MOV CX,100 MOV AH,40H LEA DX ,BUF INT 21H MOV BX,FNUM MOV AH,3EH INT 21H EXIT: MOV AH,4CH INT 21H CODE ENDS END START 使用相应的文本编辑器建立文件LAB7.asm,内容如上所示。 2.汇编并运行此程序后,在当前目录建立的文件名是什么?其内容是什么? 1>汇编: C:\masm> masm lab7; 2>连接: C:\masm> link lab7; 3>运行: C:\masm> lab7 3.若将语句1 改为mov cx,1,则运行情况与前面会有什么区别? 4.若将语句1 改为mov cx,2,则运行结果同上会有什么不同?并简要说明此语句的作用. 5.若将语句2 改为mov bx,1,则运行结果会有什么不同?简要说明则语句的作用. 实验二:编写0 号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串“divide error!”,然后返回到DOS。源程序下: assume cs:code code segment start: mov ax,cs mov ds,ax

mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例程cld rep movsb mov word ptr es:[0],200h mov word ptr es:[2],0 ;设置中断向量表 mov dx,0ffffh mov bx,1 ;测试一下 div bx mov ax,4c00h int 21h do:jmp short dostart db 'divide error!' dostart: mov ax,0 mov ds,ax mov si,202h mov ax,0b800h mov es,ax mov di,160*12+60 mov cx,13 s: mov al,ds:[si] mov ah,15 mov es:[di],ax inc si inc di inc di loop s mov ax,4c00h int 21h doend:nop code ends end start

8086汇编语言习题解答

8086/8088汇编语言习题解答 第一章 、试根据自己使用计算机的经历,列举几个必须使用或最好是使用汇编语言编制程序的事例。 、试完成下列数制间的转换 ⑴、十进制数转换为8位二进制数 十进制:100 对应二进制:01100100B 十进制:56 对应二进制:00111000B 十进制:111 对应二进制:01101111B 十进制: 120 对应二进制:01111000B 十进制: 70 对应二进制:01000110B ⑵、8位二进制数(无符号数)转换为十进制数 二进制:01010101B 对应十进制:85 二进制:B 对应十进制:170 二进制:B 对应十进制:240 二进制:00001111B 对应十进制:15 ⑶、十进制数转换为十六进制数 十进制:40 对应二进制:00101000B 十进制:80 对应二进制:01010000B 十进制:105 对应二进制:01101001B 十进制: 114 对应二进制:01101101B 十进制: 207 对应二进制:B

、试把下面用补码表示的二进制数转换为对应的十进制真值 二进制补码:01111000 对应的十进制值数真值:+120 二进制补码:对应的十进制值数真值:-39 二进制补码:对应的十进制值数真值:-127 二进制补码:对应的十进制值数真值:-120 二进制补码:00100111 对应的十进制值数真值:+39 二进制补码:对应的十进制值数真值:-16 、由键盘输入字符通常都是以该字符的ASCII码形式表示的。若现在从键盘上输入十六进制数0~F,那么应如何处理才能把十六进制转换为4位二进制数0000~1111. 答:将键盘输入的数0~F的ASCII码,每输入一个字符,减去30H后,再存入内存,这样就完成了把从键盘上输入的十六进制ASCII码转换为4位二进制数0000~1111. 、试分别判断下列各组数据中哪个数据最大哪个最小 ①、A= B=0,101D C=0,101H ②、A=1011B B=1011D C=1011H 答:第①组:A=1×21-+1×23-= B= C=1×161-+163-=+= 所以A最大,C最小 第②组,B最大,A=B最小 、现有一个二进制数.若将该数看着是无符号数、原码表示的带符号数、补

8086汇编语言程序设计实验指导书

汇编语言上机实验指导书 一、概述 上机实验总学时为16学时,其中综合性实验为2学时。实验共有6项暂定为8次,每次2学时。 1.实验辅导的主要内容 实验辅导的内容包括每个实验的实验目的;实验内容;对实验的算法及实验方法的必要说明;实验准备;实验步骤;实验报告要求;实验程序及参考框图。开始的实验介绍较细,后面的实验简要介绍。 2.实验的软硬件要求 关于汇编语言程序设计的硬件要求不高,有IBM-PC/XT即可,但应有彩色显示器以便进行图形实验。软件方面应有MASM.EXE5.0版(包括LINK.EXE),与MS-DOS版本配套的DEBUG程序和EDIT.EXE编辑软件(其它编辑软件也可以)。 3.加强实践能力的培养 实验目的不光是为了验证书本理论,更重要的是对实践能力的培养。其中包括: 实际调试程序的能力,例如修改程序参数的能力,查看结果的能力,设置断点调试运行的能力等; 开发汇编语言应用程序的能力,例如应用有关汇编软件的能力,进行系统调用和BIOS功能调用的能力,进行模块程序设计的能力等。 对某一问题用不同的程序实现的能力,例如我们为每个实验提供了参考程序(或程序段),目的是让每个实验者参照样板程序将实验成功地实现,在掌握其方法后,自己改变程序或自己编制程序加以实现。 实验一汇编语言运行环境及方法、简单程序设计(2学时、验证性) 1.实验目的: (1) 熟悉汇编语言运行环境和方法 (2)了解如何使用汇编语言编制程序 (3) 熟悉DEBUG有关命令的使用方法 (4) 利用DEBUG掌握有关指令的功能 (5) 利用DEBUG运行简单的程序段 2.实验内容 (1)学会输入、编辑汇编语言程序 (2)学会对汇编语言程序进行汇编、连接和运行 (3)进入和退出DEBUG程序 (4)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。 3.实验准备 (1)仔细阅读有关汇编语言环境的内容,事先准备好使用的例子。 (2)准备好源程序清单、设计好调试步骤、测试方法、对运行结果的分析。 (3) 编写一个程序:比较2个字符串所含的字符是否相同。若相同则显示’Match.’,否则显示’No match!’;(1)仔细阅读有关DEBUG 命令的内容,对有关命令,都要事先准备好使用的例子。 4.实验步骤 (1)在DOS提示符下,进入MASM目录。 (2)在MASM目录下启动EDIT编辑程序,输入源程序,并对其进行汇编、连接和运行。 ①调用edit输入、编辑源程序并保存在指定的目录中;例:edit abc.asm ②用汇编程序masm对源程序汇编产生目标文件obj。例:masm abc 不断修改错误,直至汇编通过为止。 ③用连接程序link产生执行文件exe.例:link abc ④执行程序 可直接从DOS执行程序,即在DOS环境中,输入文件名即可。 (3)详细记录每一步所用的命令,以及查看结果的方法和具体结果。 5.实验报告要求 (1)源程序清单。 (2) 如何启动和退出EDIT程序。 (3) 如何对源程序进行汇编及编辑。 (4)如何启动和退出DEBUG程序。

汇编语言入门教程

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

8086汇编语言上机调试及基本操作

深 圳 大 学 实 验 报 告 课程名称: 微机原理实验 实验名称: 8086汇编语言上机调试及基本操作 学院: 物理科学与技术学院 组号: 指导教师: 李雄军 报告人:林成业 学号: 2012180073 实验地点: 科技楼302 实验时间:2014年9月24日 实验报告提交时间: 2014年10月15日 得分 教师签名 批改日期 课程编号 题目类型

一、实验目的: (1)掌握常用DEBUG命令: G,D,R,T,U,Q。 (2)掌握工具软件EMU8086。 (3)掌握完整程序设计方法的格式,能正确书写数据段,代码段等。 (4)掌握简单的数值转换算法 二、实验原理 1.实验说明: 计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制之间的转换是一种基本功。 2.程序框图:对于0-999(即000H-3E7H)范围内的二进制数 3.参考程序: ; 将AX中的三位数拆为三个BCD码, 并存入Result 开始的三个单元 DATA SEGMENT; 数据段 RESULT_1 DB 1 RESULT_2 DB 1 RESULT_3 DB 1 DATA ENDS STACK SEGMENT STACK ; 堆栈段 STA DB 64 DUP(0) STACK_TOP DB 0 STACK ENDS CODE SEGMENT; 代码段 ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK

START: MOV AX, DATA MOV DS, AX ; 设置数据段 MOV AX, STACK MOV SS, AX ; 设置堆栈段 LEA SP, STACK_TOP ; 设置栈顶指针 MOV AX, 2afH MOV CL, 100 DIV CL MOV RESULT_1, AL ; 除以100, 得百位数 MOV AL, AH MOV AH, 0 MOV CL, 10 DIV CL MOV RESULT_2, AL ; 余数除以10, 得十位数 MOV RESULT_3, AH ; 余数为个位数 MOV AX,4C00H ; 返回DOS INT 21H ; CODE ENDS END START ; 最后一行要按回车键 三、实验及报告要求: 1)用合适的编辑软件编辑以上源文件并存入合适目录;要求补充注释未注释的 伪指令和指令; 2)分别在DOS和Windows下编译、连接生成可执行文件,比较两个环 境下生成的机器码的长度和内容;试指出第2、5、7、10、14条指令的IP和机器码。 3)分别在debug和emu8086下调试该可执行文件,给出程序运行时的各段 地址(CS=?,DS=?SS=?ES=?)举例说明debug的t,d,g,u等命令操作方法并对寄存器的变化作出解释;试改变被转换的三位数,并解释转换过程中标志寄存器中各标志位的结果;如何观察转换结果的变化?4)写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的 主要依据。 5)实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法 和微机原理学习方法作出总结。 四、实验结果与分析 1.建立汇编源程序ASM文件。 DATA SEGMENT 数据段 RESULT_1 DB 1 结果1是低八位,初始量为’1’ RESULT_2 DB 1 结果1是低八位 RESULT_3 DB 1 结果1是低八位 DATA ENDS 结束数据段 STACK SEGMENT STACK 堆栈段 STA DB 64 DUP(0) 堆栈段初始化

相关主题