首页 > 编程知识 正文

汇编语言程序设计pdf,汇编语言程序设计第五版钱晓捷

时间:2023-05-05 21:11:00 阅读:116096 作者:3928

本文的主要开发环境实验1 :汇编程序设计开发调试环境实验目的实验的主要内容和步骤实验2 :序贯编程实验目的实验的主要内容和步骤实验3 :循环编程实验目的实验的主要内容和步骤实验4 :子程序设计实验目的实验的主要内容和步骤

主要开发环境DOSBox 0.74-3

以下为本文正文内容,以下案例可供参考

实验1 )熟悉汇编程序设计开发调试环境的实验目的了解汇编语言机载调试的过程;

了解调试程序在调试器中的作用

了解使用Debug命令调试程序的基本方法

掌握动态调试器的调试

理解各寄存器的功能和存储器单元,理解机器地址方式

理解基础汇编指令的含义和用法

实验的主要内容和步骤如下所示为几个汇编器。 在Debug环境下,请用-a指令输入各个程序,用-t指令单步执行,注意观察各指令的执行结果。

1、数据传输命令

代码段1 :

MOV SP,00B0; SP=?

MOV AX,8057

MOV BX,0F79

推式Ax; SP=? [SS:SP]=? [ss:(sp1 ) ]=?

PUSH BX; SP=? [SS:SP]=? [ss:(sp1 ) ]=?

推式Ax; AX=?

代码段2 :

MOV DX,4652

ADD DX,F0F0

MOV BX,1000

MOV WORD PTR [BX],A988

添加word ptr [ bx ],97F6; [1000H]=? [1001H]=?

2、算术命令

代码段1 :

MOV BX,9548

MOV CX,28A7

SUB BX,CX; (BX )=? (CX )=? CF=? ZF=? OF=? 科幻=?

代码段2 :

MOV BX,6780

NEG BX

代码段3:(无符号数乘法) ) ) )。

MOV AL,B4

MOV BL,11

MUL BL; (AX )=? CF=? OF=?

代码段4:(有符号数乘法)

MOV AL,B4

MOV BL,11

IMUL BL; (AX )=? CF=? OF=?

代码段5:(无符号数相除) ) )。

MOV AX,400

MOV BL,B4

DIV BL; (AL )=? (AH )=?

代码段6:(有符号数相除) )。

MOV AX,400

MOV BL,B4

IDIV BL; (AL )=? (AH )=?

代码段7:(DAA指令,完成十进制28 68=96 ) ) ) ) )。

MOV AL,28

ADD AL,68; (AL )=?

DAA; (AL )=?

3、逻辑运算指令

代码段1 )下一个汇编代码段清除寄存器AL内容的0、2、4、6位,剩下的位保持不变,寄存器BL的前4位保持1,后4位保持不变。 请观察执行结果

MOV AL,48

AND AL,AA; (AL )=?

MOV BL,39

OR BL、F0; (BL )=?

4、换挡指令

代码段1 )在Debug环境下输入以下段并执行,观察执行结束后的AX寄存器的内容

MOV AX,1234

MOV CL,4

SHL AX,CL

实验2 )顺控程序设计实验目的掌握顺控程序编程和机载调试的过程;

继续学习调试命令;

理解并验证基础汇编指令的含义和用法

实验的主要内容和步骤1,补充以下步骤,使10000H ~ 1000FH中的8个字符可以逆序复制到20000H ~ 2000FH。

2、验证并跟踪下一个程序的执行过程。

; * * * * * * * * * * * * * * * * *

assume cs :代码

代码段; 定义代码段

start: mov ax,2000h; 加载ss段寄存器

mov ss,ax

mov sp,0

add sp,10

pop ax

pop bx

推式Ax

push bx

pop ax

pop bx

mov ax,4c00h

int 21h

代码结尾

结束开始; 整个程序结束

; * * * * * * * * * * * * * * * * *

(1)用文本编辑程序创建asm源文件

(2)调用汇编器masm在源文件的汇编中生成目标文件

(3)调用连接程序link,在与目标文件的连接中生成可执行文件

(4)调用调试器debug调试并运行可执行文件

br> (5) 查看程序的运行结果

3、 验证并跟踪求平均数程序的执行过程。汇编程序要求:在数据段中定义一个5字节数据的数组array,把它们看做有符号数并求它们的平均数,结果保存在avg内存单元。
参考源程序如下:
;***************************************************************
assume ds:data, cs:code
data segment ;定义数据段
array db 1,2,3,4,5
avg db ?
data ends
code segment ;定义代码段
start:
mov ax, data ;装载ds段寄存器
mov ds, ax

leasi, array;设置数组的指针simovcx, 5;装载循环计数器cxmov al, 0;累加器al清零next:

mov dl, [si]
add al, dl
inc si
loop next
cbw ;将al中的累加和扩展到ax
mov bl, 5
idiv bl ;商在al中,余数在ah中
mov avg, al
mov ax, 4c00h ;返回DOS系统
int 21h
code ends
end start ;整个程序结束
;***************************************************************
(1) 利用文本编辑程序建立asm源文件
(2) 调用汇编程序masm对源文件汇编产生目标文件
(3) 调用连接程序link对目标文件连接产生可执行文件
(4) 调用调试程序debug对可执行文件调试、运行
(5) 查看程序的运行结果

4、 编写并调试解密程序,写出运行结果。设0~9数字序列对应的密码表为9、0、8、2、7、4、6、3、1、5。将任意一个两位十进制数转换为对应的两位密码,如94对应的密码是57。请编写相应的解密程序(即:密码->明码)

实验三:循环程序设计 实验目的

掌握循环程序的编程与上机调试的过程;
掌握各种寄存器与寻址方式的使用方法;
了解并验证基础汇编指令的含义与用法

实验主要内容和步骤

Power idea公司从1975年成立一直到1995年的基本情况如下:
年份 收入(千美元) 雇员(人) 人均收入(千美元)
1975 16 3 ?
1976 22 7 ?
1977 382 9 ?
… … … …
1995 5937000 17800 ?
下面的程序中已经定义好了这些数据:
data segment
db ‘1975’,‘1976’,‘1977’,‘1978’,‘1979’,‘1980’,‘1981’,‘1982’,‘1983’
db ‘1984’,‘1985’,‘1986’,‘1987’,‘1988’,‘1989’,‘1990’,‘1991’,‘1992’
db ‘1993’,‘1994’,‘1995’
;以上是表示21年的21个字符串

dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065
dd 97479, 140417, 197514, 345980, 590827, 803530, 1183000, 1843000, 2759000
dd 3753000, 4649000, 5937000
;以上是表示21年公司总收入的21个dword型数据

dw 3, 7, 9, 13, 28, 38, 130, 220, 476
dw 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226, 11542
dw 14430, 15257, 17800
;以上是表示21年公司雇员人数的21个word型数据
data ends

table segment
db 21 dup ('year summ ne ?? ')
table ends

编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中

实验四:子程序设计 实验目的

掌握分支结构的编程与上机调试的过程;
掌握子程序调用与返回的使用方法;
掌握屏幕显示相关的原理与操作;

实验主要内容和步骤

(1)显示字符串
问题:
显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。
子程序描述:
名称:show_str
功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
参数:(dh)=行号(取值范围0~ 240),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址
返回:无
应用举例:在屏幕的8行3列,用绿色显示data段中的字符串

assume cs:code, ds:data
data segment
db ‘Welcome to masm!’,0
data ends

code segment

start: mov dh,8 ;dh装行号(范围:1–25)
mov dl,3 ;dl装列号(范围:1–80)[注:每超过80等于行号自动加1]
mov cl,0cah ;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
mov ax,data
mov ds,ax

mov si,0
call show_str

mov ax,4c00h
int 21h

show_str: …


code ends
end start

提示:
(1) 子程序的入口参数是屏幕上的行号和列号,注意在子程序内部要将它们转换为显存中的地址,首先要分析一下屏幕上的行列位置和显存地址的对应关系;
(2) 注意保存子程序中用到的相关寄存器;
(3) 这个子程序的内部处理和显存的结构密切相关,但是向外提供了与显存结构无关的接口。通过调用这个子程序,进行字符串的显示时可以不必了解显存的结构,为编程提供了方便。在实验中,注意体会这种设计思想。

(2)数值显示
问题:
编程,将data段中的数据以十进制形式显示出来
data
dw 123, 12666, 1, 8, 3, 38
data ends

这些数据在内存中都是二进制信息,标记了数值的大小。要把它们显示到屏幕上,成为我们能够读懂的信息,需要进行信息的转化。比如:数值12666,在机器中存储为二进制信息:0011000101111010B(317AH),计算机可以理解它。而要在显示器上读到可以理解的数值12666,我们看到的应该是一串字符串“12666”。由于显卡遵循的是ASCII编码,为了让我们能在显示器上看到这串字符,它在机器中应以ASCII码的形式存储为:31H、32H、36H、36H、36H(字符“0”~ “9”对应的ASCII码为30H~39H)
因此,要将数据用十进制形式显示到屏幕上,要进行两步工作:
 将用二进制信息存储的数据转变为十进制形式的字符串
 显示十进制形式的字符串
第二步在前一个实验中已经实现,只需调用show_str即可。因此重点需要编写一个将二进制信息转变为十进制形式的通用子程序。

子程序描述:
名称:dtoc
功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
参数:(ax)=word型数据,ds:si指向字符串的首地址
返回:无

资料:
内存地址空间中,B8000H~BFFFFH共32K的空间,为8025彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。
在8025彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色、前景色、闪烁、高亮等组合信息)。
这样,一个字符在显示缓冲区中就要占两个字节,分别存放字符的ASCII码(低位)和属性(高位)。80*25模式下,一屏的内容在显示缓冲区中共占4000个字节。
显示缓冲区分为8页,每页4KB,显示器可以显示任意一页内容。一般情况下,显示第0页内容。也就是通常情况下,B8000~B8F9F中的4000个字节将出现在屏幕上。
属性字节的格式:
7 6 5 4 3 2 1 0
BL(闪烁) R(背景) G(背景) B(背景) I(高亮) R(前景) G(前景) B(前景)


总结

详情可参考以下链接:
链接:冲冲冲~
提取码:d09c
复制这段内容后打开百度网盘手机App,操作更方便哦

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。