东北大学汇编实验
- 格式:doc
- 大小:105.50 KB
- 文档页数:25
汇编语言实验4详细讲解一、引言汇编语言是一种底层的计算机语言,它直接操作计算机的硬件。
在汇编语言实验4中,我们将深入了解汇编语言的一些重要概念和技巧。
本文将详细讲解汇编语言实验4的内容,帮助读者更好地理解和应用汇编语言。
二、实验目的汇编语言实验4的主要目的是学习和掌握在汇编语言中使用条件和循环结构的方法。
通过实验,我们将能够编写能够根据条件执行不同操作的程序,并实现循环执行一定次数的功能。
三、实验内容1. 条件结构条件结构是根据条件的真假来执行不同的操作。
在汇编语言中,我们可以使用条件跳转指令来实现条件结构。
条件跳转指令根据条件寄存器的值来决定是否跳转到指定的地址执行。
常用的条件跳转指令有JZ、JNZ、JC、JNC等。
2. 循环结构循环结构是重复执行一段代码的结构。
在汇编语言中,我们可以使用循环指令来实现循环结构。
循环指令根据计数器的值来判断是否继续执行循环体,并在每次循环结束后更新计数器的值。
常用的循环指令有LOOP、LOOPE、LOOPZ、LOOPNE、LOOPNZ等。
四、实验步骤1. 定义和初始化计数器在循环结构中,我们首先需要定义一个计数器,并对其进行初始化。
计数器可以使用DX寄存器或AX寄存器来保存。
2. 执行循环体在循环结构中,我们需要执行的代码放在循环体中。
循环体的代码将会被重复执行,直到计数器的值为0或满足其他条件。
3. 更新计数器的值在每次循环结束后,我们需要更新计数器的值。
可以使用INC或DEC指令对计数器进行加1或减1操作。
4. 判断是否继续执行循环在每次循环结束后,我们需要判断是否继续执行循环。
可以使用循环指令来实现此功能。
根据计数器的值或其他条件来判断是否继续执行循环。
五、实验示例下面是一个简单的实验示例,演示了如何使用条件和循环结构来实现一个简单的程序:```MOV CX, 10 ; 初始化计数器为10MOV AX, 0 ; 将AX寄存器清零LOOP_START:ADD AX, CX ; 将CX的值加到AX中LOOP LOOP_START ; 循环执行,直到CX的值为0MOV BX, AX ; 将AX的值保存到BX寄存器中```在上面的示例中,我们首先将CX寄存器初始化为10,然后将AX 寄存器清零。
汇编语言程序设计实验报告汇编语言程序设计实验报告引言:汇编语言是计算机中最基本的语言,通常用于处理硬件相关问题。
在这个实验中,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
以下是我们的实验报告。
正文:1. 实验环境我们使用的实验环境是Intel 8086微处理器与高级汇编语言。
微处理器使用的是PCB-512主板,而高级汇编语言是MASM。
2. 实验目的我们的实验目的主要是学习汇编语言的基础知识和编程技巧,包括了汇编语言的寄存器、指令、内存管理等方面的知识。
我们的另一个目的是掌握汇编语言的常用编程技巧,能够独立完成一些简单的汇编程序。
3. 实验内容我们的实验内容主要包括以下几点:(1)学习汇编语言的基础知识,包括寄存器、指令、内存管理等方面的知识。
(2)掌握汇编语言的常用编程技巧,包括数据输入输出、运算、跳转等基本操作。
(3)实践用汇编语言编写程序,如计算器、菜单等实用程序。
(4)了解8086微处理器的结构和原理。
4. 实验过程在这个实验过程中,我们完成了以下几个程序:(1)计算器计算器是一个简单的程序,主要用于实现两个数之间的加、减、乘、除等基本运算。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
(2)菜单菜单是一个实用程序,主要用于展示一个简单的菜单并实现用户选择相关功能的功能。
我们使用了汇编语言中的跳转指令、输入输出指令等实现了这个程序。
5. 实验结果在我们的实验中,我们成功完成了上述两个程序。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
6. 实验总结在这个实验过程中,我们学习汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
我们通过编写计算器和菜单等简单实用程序,加深了对汇编语言的理解和认识。
我们认为这个实验对我们今后的学习和工作都有很大的帮助。
结论:通过这个实验,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
汇编语言实验7实验报告一、实验目的本次实验旨在通过汇编语言编写程序,实现对字符串的操作和输出。
二、实验内容1. 编写一个汇编程序,要求从键盘输入一个字符串,并将其逆序输出到屏幕上;2. 编写一个汇编程序,要求从键盘输入两个字符串,并将它们拼接起来后输出到屏幕上。
三、实验过程1. 字符串逆序输出程序首先,需要从键盘输入一个字符串。
为了方便起见,我们可以先规定字符串的最大长度为100。
接着,我们需要定义两个变量:```buffer db 100 ; 用于存储输入的字符串length dw ? ; 存储输入的字符串长度```其中,db代表定义字节型变量,dw代表定义双字节型变量。
然后,我们需要使用INT 21H中断来读取用户输入的字符串。
具体而言,我们可以使用下面这段代码:```mov ah, 0Ah ; 设置INT 21H功能号为0Ahmov dx, offset buffer ; 将buffer的地址传给DX寄存器int 21h ; 调用INT 21H中断```该代码会将用户输入的字符串存储在buffer中,并且将其长度存储在length变量中。
接着,我们需要将该字符串逆序输出到屏幕上。
为了实现这个功能,我们可以使用栈来存储字符串中的每个字符,并逐个弹出来输出。
具体而言,我们可以使用下面这段代码:```mov si, offset buffer + 1 ; 将si寄存器指向字符串的第一个字符mov cx, length ; 将cx寄存器设置为字符串长度dec cx ; 字符串长度需要减1reverse:push byte ptr [si] ; 将当前字符压入栈中inc si ; 指向下一个字符loop reverse ; 循环直到所有字符都被压入栈中mov ah, 02h ; 设置INT 21H功能号为02h,表示输出一个字符print:pop dx ; 弹出栈顶元素int 21h ; 输出该字符loop print ; 循环直到所有字符都被弹出并输出完毕```2. 字符串拼接程序首先,需要从键盘输入两个字符串。
实验一查看CPU和内存,用机器指令和汇编指令编程一.实验目的:掌握DEBUG 的基本命令及其功能二.实验内容:1. 预备知识:Debug的使用(1) 什么是Debug?Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。
使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
(2) 我们用到的Debug功能●用Debug的R命令查看、改变CPU寄存器的内容;●用Debug的D命令查看内存中的内容;●用Debug的E命令改写内存中的内容;●用Debug的U命令将内存中的机器指令翻译成汇编指令;●用Debug的T命令执行一条机器指令;●用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。
(3) 进入DebugDebug是在DOS方式下使用的程序。
我们在进入Debug前,应先进入到DOS方式。
用以下方式可以进入DOS:①重新启动计算机,进入DOS方式,此时进入的是实模式的DOS。
②在Windows中进入DOS方式,此时进入的是虚拟8086模式的DOS。
(4) 用R命令查看、改变CPU寄存器的内容1)显示CPU内部所有寄存器内容和标志位状态;格式为:-R2)显示和修改某个指定寄存器内容,格式为:-R 寄存器名若要修改一个寄存器中的值,比如AX中的值,可用R命令后加寄存器名来进行,输入“r ax”后按Enter键,将出现“:”作为输入提示,在后面输入要写入的数据后按Enter 键,即完成了对AX中内容的修改。
若想看一下修改的结果,可再用R命令查看(5) 用Debug的D命令查看内存中的内容1)格式:-d 段地址:偏移地址,Debug将列出从指定内存单元开始的128个内存单元的内容。
使用D命令,Debug将输出3部分内容,如图2.34所示。
中间是部分从指定地址开始的128个内存单元的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。
汇编语言程序设计实验报告二(分支循环程序实验)一、实验目的1、掌握分支程序、循环程序的设计方法。
2、熟悉DEBUG程序的使用方法。
3、掌握汇编语言程序的编辑、汇编、连接以及调试过程。
二、实验内容1、编写一程序,将内存中某一区域的数据传送到另一个区域中(要求用循结构,不考虑数据块重叠问题)。
2、编写一程序,将内存中某一区域的数据传送到另一区域(要求考虑数据块重叠问题)。
三、实验准备1、预习数据传送指令,熟悉分支和循环程序设计方法。
2、预习DEBUG调试程序的使用方法。
3、根据实验内容要求,编写好实验源程序。
四、实验步骤1、用QE或其它编辑软件,在计算机上编辑源程序,使其正确无误。
2、汇编、连接源程序,产生.EXE可执行文件。
3、运行程序。
(1) 进入DEBUG。
打入DEBUGT MYPROG.EXE。
MYPROG为所编程序的文件名。
(2) 先用G命令连续剧连续执行程序,程序执行完毕后,观察运行结果。
如果执行后是对的,说明程序编写是正确的,如果结果不对,说明程序有错误,则执行下一步。
(3) 检查程序。
在程序中设置若干断点,以便杳出错误所在。
(4) 采用单步命令T或执行程序,观察各寄存器和存储单元内容,以便找到错误之处。
五、实验报告要求1、列出程序清单,并给出程序流程图。
2、总结实现数据传送的几种方法,指出它们的区别。
开始3、分析实验中所遇到的一些问题,分析错误原因。
4、说明本实验中是如何使用DEBUG进行调试的。
CX、SI、DI置初值六、流程图勤开始设置增量方式CX、SI、DI置初值保存SI内容AL [SI] SI SI+源块长度[DI] AL N SI>DIYSI SI+1 恢复SI内容恢复SI内容DI DI+1CX CX-1 设置减量方式N CX=0, SI指向源块末尾DI指向目的块末尾Y结束 [DI] [SI]题一流程图 N 传完了吗, 书馆 Y结束题二流程图七、程序清单题一程序清单:STACK SEGMENT STACK ‘STACK’DB 100 DUP(0)STACK ENDSDATA SEGMENT PARA ‘DATA’SOUR DB 0、1、2、3、4、5、6、7、8、9 DEST DB 10 DUP(,)DB ‘$’DATA ENDSSEGMENT PARA‘CODE’ASSUME CS:CODEMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,10MOV SI,offset SOURMOV DI, offset DESTAGAIN: MOV AL,[SI]MOV [DI],ALINC SIIN DILOOP AGAINMOV DX,offset DESTMOV AH,09HINT 21HRETMAIN ENDPCODE ENDSEND START题二程序清单:DATA SEGMENT PARA ‘DATA’STRG DB ‘ABCDEFGHIJKLMNOP’STG1 EQU STRG+4STG2 EQU STHG+8STRSE EQU 6DATA ENDSSTACK SEGMENT PARA ‘CODE’DB 100 DUP(0) STACK ENDSCODE SEGMENT PARA ‘CODE’ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,STRSEMOV SI,OFFSET STG1MOV DI,OFFSET STG2CLDPUSH SIADD SI,STRSE-1CMP SI,DIPOP SIJL MOVESTDADD SI,STRSE-1ADD DI,STRSE-1 MOVE: REP MOVSB RETMAIN ENDPCODE ENDSEND START。
RTW-08熔体物性综合测定仪 (5)RDL-02铁矿石还原软化熔滴实验装置 (5)HYQ-01制气配气系统...................................................................................... 错误!未定义书签。
TKJ-03铁矿石还原性、还原膨胀、低温还原粉化 .................................. 错误!未定义书签。
与焦炭反应性及反应后强度综合测定仪....................................................... 错误!未定义书签。
RDS-04全自动炉渣熔点熔速测定仪.............................................................. 错误!未定义书签。
低温铁合金电镀修复强化技术 (6)不锈钢网增强不锈钢粉多孔复合材料 (7)NE-控温发热材料 (7)新型复合微孔过滤介质................................................................................... 错误!未定义书签。
高硬度、高比重、高耐蚀性金属陶瓷复合强化凡尔球凡尔座生产技术. (8)NEAF铝箔亲水有机膜及技术 (9)耐腐蚀光亮铝合金材料 (9)离子镀金靶材的研制与开发 (10)直接发泡法制造泡沫铝材料........................................................................... 错误!未定义书签。
易烧结α–Al2O3超细微粉及其制品........................................................... 错误!未定义书签。
东北大学计算机硬件技术基础实验报告专业班级:姓名:学号:实验题目:认识汇编语言日期:一、实验目的(1) 掌握顺序程序设计方法;(2) 学习数据传送及算术和逻辑运算指令的用法;(3) 熟悉在PC机上建立、汇编、连接、调试和运行8086汇编语言程序的过程。
二、实验内容首先将FIRST字变量与SECOND字变量相加,结果存至THIRD1存储字中,然后将FIRST与SECOND两个字变量相乘,结果存至THIRD2 开始的两个字中。
三、算法描述流程四、实验步骤1. 输入源程序:DATA SEGMENTFIRST DW 0D56CHSECOND DW 1F08HTHIRD1 DW ?THIRD2 DW 2 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AX,FIRSTADD AX,SECOND ;求和MOV THIRD1,AX ;保存MOV AX,FIRSTMUL SECOND ;求积MOV THIRD2,AX ;保存MOV THIRD2+2,DXMOV AH,4CHINT 21HCODE ENDSEND START2. 保存源文件,执行masm汇编源程序,生成obj目标文件,结果无错误。
3. 执行link连接程序,生成exe可执行文件,结果无错误。
4. 执行debug调试程序,执行程序,在内存中得到结果,验证结果正确,执行d参数命令察看THIRD1和THIRD2所在的地址单元中的数据为0004字节单元和0006中存放结果。
五、实验结果1. 执行masm编译源程序,生成OBJ文件,得到如下界面:2. 执行link连接程序,生成exe可执行文件得到如下界面:3. 执行debug调试程序,使用u进行反编译,得如下界面4. 执行d参数命令察看DATA所在的地址单元中的数据,得到如下界面:5.执行t参数命令,单步查看六、思考题假如FIRST的偏移地址是0000,那么THIRD2的偏移地址是多少?答:如果FIRST的偏移地址是0000,由题可知,FIRST占用两个字节,SECOND 占用两个字节,THIRD1占用两个字节,那么THIRD2的偏移地址为6个字节,由于占用四个字节,所以偏移地址为0006。
青岛理工大学课程实验报告
课程名称汇编语言程序设计班级实验日期
2013.11.3
姓名学号实验成绩
实验
名称
子程序
实验目的及要求1.掌握子程序设计相关指令和伪指令的使用方法
2.掌握子程序设计方法, 特别是参数传递方法
3.掌握主程序和子程序之间的调用关系和调用方法
4.熟悉循环和子程序结合应用解答问题的思路
实验环境1.命令行方式
2.MASM.EXE LINK.EXE DEBUG.EXE
实验内容1.设DATA1开始的内存单元中, 存放着一串带符号字数据, 要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。
然后在显示器输出排好序的数据, 中间用’,’隔开。
2.输出数据使用子程序方式。
算法描述及实验步骤步骤:
(1)设置数据段地址
(2)设置堆栈段地址
(3)设置堆栈指针
(4)调用9号功能, 输出一个提示性字符串。
(5)循环进入子程序, 输出原始数据。
(6)在子程序内循环输出每一位的十进制数字。
(7)主程序进行内外循环, 进行冒泡排序。
(8)再一次调用子程序输出排序后的结果。
调试过程及实验结果调试过程:
(2)(1)在输出时, 调用DOS 9号功能, 并不是只要语句MOV AH,09H
(3)它是存在入口条件的, 入口条件:DS:DX=输出字符缓冲区首地址。
所以前面必须加上MOV DX,OFFSET NOTE1。
(4)汇编语言是不会再输出汉字的。
(5)子程序结束时一定要有RET
(6)冒泡排序也遇到一些困难。
调试结果:。
实验五输入输出程序设计一、实验目的1) 掌握输入输出程序的编写方法。
2) 熟悉系统功能调用的方法。
3) 熟悉动画程序的编写方法。
二、实验内容1)在CRT上每隔一秒连续显示字符0-9。
编程提示为了使输出的字符之间有空格,在每一个循环中输出一个0-9的字符和一个空格。
为了输出0-9,置寄存器BL初值为0,每循环一次使其增量。
为了保证输出是十进制,增量后用DAA调整指令。
由于输出为一位十进制数,用AND 0FH 指令屏蔽高4位。
2)用系统功能调用将‘HELLO’由键盘输入,再从屏幕输出‘***HELLO***’。
3)编制在屏幕上画线的子程序,调用该子程序画一矩形。
4)编制字母下落一行的子程序,调用该子程序使字母从屏幕顶部下落到底部。
5)创建一磁盘文件,保存从键盘输入的字符串。
6)编写程序用设置系统时间,首先从键盘以十进制数形式输入时间,然后修改系统时间,并重新以十进制形式显示时间。
7)编写程序将屏幕分割成格状,每一格涂上不同颜色,格数从键盘输入。
8)编写程序在屏幕上显示菜单,输入相应菜单的序号后,选种该菜单项。
三、源程序EXAM5-1STACK SEGMENT STACKDB 1024 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,SS:STACKSTART:MOV BL,0LP:MOV DL,20HMOV AH, 2INT 21HMOV AL,BLADD AL, 0DAAAND AL,0FHMOV BL,ALPUSH BXOR AL,30HMOV DL,ALMOV AH, 2INT 21HMOV BX,3E8HLP2:MOV CX,176H ;延时1msLP1:PUSHFPOPFLOOP LP1DEC BXJNZ LP2POP BXINC BLJMP LPCODE ENDSEND START执行程序EXAM5-1·EXE,屏幕上依次循环显示一个数字一个空格:0 1 2 3 4 5 6 7 8 9 ……EXAM5-2STACK SEGMENT STACKDB 1024 DUP(0)STACK ENDSDA TA SEGMENTBUFF DB 6,7 DUP(?),‘$’DA TA ENDSINPUT MACRO BUFEMOV DX,OFFSET BUFEMOV AH,0AHINT 21HENDMPUTCHAR MACRO CHARMOV DL,CHARMOV AH,02HINT 21HENDMCODE SEGMENTASSUME CS:CODE,DS:DA TA,SS:STACK START:MOV AX,DA TAMOV DS,AXINPUT BUFF ;读取字符串➝BUFFPUTCHAR 0DHPUTCHAR 0AH ;光标另起一行MOV CX,0003HNEXT:PUTCHAR 2AHLOOP NEXTMOV CL,BUFF+1SUB CH,CHMOV BX,OFFSET BUFF+2BEGIN:MOV AL,[BX]PUTCHAR ALINC BXLOOP BEGINMOV CX,0003HNEXT1:PUTCHAR 2AHLOOP NEXT1MOV AH,4CHINT 21HCODE ENDSEND START执行程序EXAM5-2·EXE,输入HELLO↙屏幕上显示结果:*** HELLO ***EXAM5-5NAME EXAM6SSTACK SEGMENT STACK ’stack’DB 1024 DUP(?)SSTACK ENDSDATA SEGMENTASKNAME DB 0DH,0AH,’Enter the’DB ’dest file name:$’ASKCONT DB 0DH,0AH,’Enter the string’DB ’as file content:’0dh,0ah,’$’ FILEBUF DB 62,63DUP(?)HAND_D DW?MSGMER DB 0DH,0AH,0AHDB ’Directory full’,0DH,0AH,’$’MSGWER DB 0DH,0AH,0AHDB ’Disk full’,0DH,0AH,’$’MSGSUC DB 0DH,0AH,0AH,DB ’Write file is Successful’DB 0DH,0AH,’$’DATA ENDSDISPLY MACRO TEXTMOV DX,OFFSET TEXTMOV AH,09HINT 21HENDMCRHAND MACRO PATH,ATTRMOV DX,OFFSET PATH ;文件名MOV CL,ATTR ;文件属性XOR CH,CHMOV AH,3CHINT 21HENDMWRHAND MACRO HAND,BUFF,BYTEMOV BX,HANDMOV DX,OFFSET BUFFADD DX,2MOV CL,BYTEXOR CH,CHMOV AH,40HINT 21HENDMCLHAND MACRO HANDMOV BX,HANDMOV AH,3EHINT 21HENDMCODE SEGMENTPROG PROC FARASSUME CS:CODE,DS:DATA,SS:SSTACKPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXDISPLY ASKNAME ;提示输入文件名MOV DX,OFFSET FILEBUFMOV AH,0AHINT 21HMOV DI,OFFSET FILEBUF[2]MOV BL,FILEBUF[1]XOR BH,BHMOV BYTE PTR[BX][DI],00HCRHAND FILEBUF[2],0 ;创建并打开新文件JC CRTERRMOV HAND_D,AX ;存文件句柄DISPLY ASKCONT ;提示键入文件内容MOV DX,OFFSET FILEBUFMOV AH,0AHINT 21HWRHAND HAND_D,FILEBUF,FILEBUF[1]JC WRITERRCLHAND HAND_DDISPLY MSGSUCJMP EXIT CRTERR:DISPLY MSGMERJMP EXIT WRITERR:DISPLY MSGWER EXIT:RETPROG ENDPCODE ENDSEND PROG。
汇编语言实验报告
1. 实验简介
本次实验是针对汇编语言的学习和实践,在实验中,我们将学习如何使用汇编语言编写程序、调试程序,并通过一系列实例来练习和巩固所学知识。
2. 实验目的
(这一部分可以根据实际情况来写,列举实验的具体目的和要求)
3. 实验环境及工具
(介绍实验所使用的软件环境和工具,如:编译器、调试器)
4. 实验步骤
(根据实验内容具体描述实验步骤,可以分为多个小节)
4.1 准备工作
在开始实验之前,需要进行一些准备工作,包括安装编译器、创建工作环境等。
4.2 实验一:简单的汇编程序
本实验通过编写一个简单的汇编程序来熟悉汇编语言的基本语法和指令集,包括数据传送、算术运算、逻辑运算等。
4.3 实验二:汇编程序的调试
在实验二中,我们将学习如何使用调试器对汇编程序进行调试,包括设置断点、查看变量值、单步执行等操作。
4.4 实验三:汇编程序的优化
本实验将通过优化代码来提高程序的执行效率,包括减少指令的使用、优化循环结构等。
5. 实验结果与分析
(对实验的结果进行总结和分析,可以包括程序的输出结果、性能分析等)
6. 实验总结
(针对本次实验的收获和心得体会进行总结,可以包括对汇编语言的理解、解决问题的思路等)
7. 实验感想
(对本次实验的感想和建议,如实验过程中遇到的困难、改进的方向等)
8. 参考文献
(列出本报告中所引用的参考文献)
注:该文章只是按照题目提示给出了一个大致的框架和构思,实际根据具体的实验内容和要求来编写每个小节的详细内容。
希望对你有所帮助!。
(附录二)汇编语言程序设计实验报告实验1 数据传送指令1、实验目的:了解和掌握 MOV、PUSH、POP、XCHG四条指令的作用和在编程中的用法。
2、实验要求:(Ⅰ)采用立即数寻址方式将19E0H,3F56H,0AF37H,9A81H 分别送给EAX、EBX、ECX、EDX四个寄存器。
记录:操作前 EAX= 750A3388 、 EBX= 7EFDE000 、 ECX= 00000000 、 EDX= 01361005操作后 EAX= 000019E0 、 EBX= 00003F56 、 ECX= 0000AF37 、 EDX= 00009A81操作过程中所用到的指令:INCLUDE Irvine32.inc.codemain PROCcall DumpRegsmov eax,19E0Hmov ebx,eaxmov ecx,ebxmov edx,ecxcall DumpRegsexitmain ENDPEND main(Ⅱ)采用采用寄存器寻址方式将19E0H送给EBX、ECX、EDX 三个寄存器。
记录:操作前 EAX= 750A3388 、 EBX= 7EFDE000 、 ECX= 000000000 、 EDX= 013C1005操作后 EAX= 000019E0 、 EBX= 000019E0 、 ECX= 000019E0 、 EDX= 000019E0操作过程中所用到的指令:INCLUDE Irvine32.inc.codemain PROCcall DumpRegsmov eax,19E0Hmov ebx,eaxmov ecx,ebxmov edx,ecxcall DumpRegsexitmain ENDPEND main(2)对EAX、EBX、ECX、EDX四个寄存器进行出入堆栈的操作。
(Ⅰ)将EAX、EBX、ECX、EDX四个寄存器的内容依次压入堆栈中,注意观察栈指针寄存器和堆栈内容的变化。
记录:压入EAX前 ESP= 003AF8E8 ,(ESP)= 750A339A压入EAX后 ESP= 003AF8E4 ,(ESP)= 750A3388压入EBX前 ESP= 003AF8E4 ,(ESP)= 750A3388压入EBX后 ESP= 003AF8E0 ,(ESP)= 7EFDE000压入ECX前 ESP= 003AF8E0 ,(ESP)= 7EFDE000压入ECX后 ESP= 003AF8DC ,(ESP)= 00000000压入EDX前 ESP= 003AF8DC ,(ESP)= 00000000压入EDX后 ESP= 003AF8D8 ,(ESP)= 00241005操作过程中所用到的指令:INCLUDE Irvine32.inc.codemain PROCcall DumpRegsmov eax,[esp]call DumpRegspush eaxcall DumpRegspush ebxcall DumpRegspush ecxcall DumpRegspush edxcall DumpRegsexitmain ENDPEND main(Ⅱ)将堆栈中的内容依次弹出到EAX、EBX、ECX、EDX四个寄存器,注意观察栈指针寄存器和堆栈内容的变化。
记录:弹出到EAX前 ESP= 003AF8D8 ,(ESP)= 00241005弹出到EAX后 ESP= 003AF8DC ,(ESP)= 00000000弹出到EBX前 ESP= 003AF8DC ,(ESP)= 00000000弹出到EBX后 ESP= 003AF8E0 ,(ESP)= 7EFDE000弹出到ECX前 ESP= 003AF8E0 ,(ESP)= 7EFDE000弹出到ECX后 ESP= 003AF8E4 ,(ESP)= 750A3388弹出到EDX前 ESP= 003AF8E4 ,(ESP)= 750A3388弹出到EDX后 ESP= 003AF8E8 ,(ESP)= 750A339A操作过程中所用到的指令:pop eaxcall DumpRegspop ebxcall DumpRegspop ecxcall DumpRegspop edxcall DumpRegsexitmain ENDPEND main(3)已知EAX=3F56H,分别利用存储器直接寻址方式和存储器间接寻址方式,将EAX寄存器的内容送到内存单元中。
(Ⅰ)存储器直接寻址方式记录:送出到EAX前 EAX= 00003F56,[var]=00000000送出到EAX后 EAX= 00003F56 ,[var]=00003F56操作过程中所用到的指令:include Irvine32.inc.datavar dword ?.codemain procmov eax,varcall dumpregsmov eax,3f56hcall dumpregsmov var,eaxcall dumpregscall writehexexitmain endpend main(Ⅱ)存储器间接寻址方式记录:送出到EAX前 EAX= 00003F56 ,[var]=00000000用于存放地址码的寄存器( esi )= 00000000送出到EAX后 EAX=00003F56,[var]=00003F56操作过程中所用到的指令:include Irvine32.inc.datavar dword ?.codemain procmov eax,3F56Hcall dumpregsmov esi,offset varmov [esi],eaxcall dumpregsmov edx,varexitmain endpend main(4)已知EAX =3F56H,ECX =4690H,利用交换指令交换这两个寄存器的内容。
记录:交换前EAX= 00003F56H,ECX= 00004690H交换后 EAX= 00004690H, ECX=00003F56H操作过程中所用到的指令:Include Irvine32.inc.codemain PROCmov eax,3F56Hmov ecx,4690Hcall DumpRegsxchg eax,ecxcall DumpRegsexitmain ENDPEND main实验二逻辑指令、跳转指令与分支程序设计1、实验目的:了解和掌握逻辑指令、比较指令、无条件/有条件转移类指令的功能和作用,以及此类指令的使用方法。
2、实验要求:具体了解和掌握逻辑指令、比较指令、无条件/有条件转移类指令的使用和在使用时应注意的问题,学习分支型程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下逻辑指令程序段的每一条指令的运行情况:(Ⅰ)mov al,41 ┃EAX = 750A3329H AL=29H or al,20 ┃EAX = 750A333DH AL=3DH (Ⅱ)mov al,66 ┃EAX = 750A3342H AL=42H and al,0df ┃EAX = 750A3342H AL=42H (Ⅲ)mov EAX,5678 ┃EAX = 0000162EHxor EAX,EAX ┃EAX = 00000000H(Ⅳ)mov EAX,0ff00 ┃EAX=0000FF00Hnot EAX ┃FFFF00FFH(Ⅴ)mov EAX,1234 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,1 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,2 ┃EAX = 000004D2H SF=0 ZF=0 OF=0test EAX,4 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,8 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,10 ┃EAX = 000004D2H SF=0 ZF=0 OF=0test EAX,20 ┃EAX = 000004D2H SF=0 ZF=0 OF=0test EAX,40 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,80 ┃EAX = 000004D2H SF=0 ZF=0 OF=0test指令的作用是在源操作数和目的操作数之间进行布尔“与”运算,但不改变目的操作数,只是设置相应的CPU标志。
(2) 已知DATA单元开始存放三个带符号数,编制程序,检查三个数据是否同号,若同时为正,则在显示器上显示“+”;同时为负,则显示“-”;否则显示空格“”。
要求:分别用三组数据(同时为正,同时为负,异号)调试程序,验证程序的正确性。
INCLUDE Irvine32.inc.datavar1 sword 2var2 sword -1var3 sword 3.codemain PROC;三个数全部为正RCL var1,1 ;把最高位送到进位位jc A ;进位位为1,即CF为1,符号位为1负数,跳转RCL var2,1jc BRCL var3,1jc Bmov al,'+'call writecharjnc D ;全部为正,跳到结束A: ;三个数全部为负 ,此时已有var1为负RCL var2,1jnc B ;无进位位,符号为正,跳转RCL var3,1jnc B ;如果为正则跳转mov al,'-'call writecharjc D ;全部为负,跳到结束B: ;另外一种情况mov al,' 'call writecharD:exitmain ENDPEND main实验三算术运算类指令、移位指令及循环程序设计1、实验目的:了解和掌握加、减、乘、除指令的在程序设计中的用法和应注意的问题,了解和掌握移位指令的功能、作用和方法。
了解和掌握循环控制类指令的功能、作用和方法。
学会循环程序设计的方法。
学习汇编语言输出输入语句的设计。
2、实验要求:具体了解和掌握算术类指令、移位指令和循环控制类指令的使用,以及在使用时应注意的问题,学习循环程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下加、减程序段的每一条指令的运行情况,查看寄存器的结果:(Ⅰ)MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000HMOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFHADD EAX,EBX ┃EAX = 0000D834H EBX = 0000CEDFH(Ⅱ)MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000HMOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFHSUB EAX,EBX ┃EAX = FFFF3A76H EBX = 0000CEDFH(Ⅲ)MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000HMOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFHADD AH,BH ┃EAX = 0000D755H EBX = 0000CEDFH AH=D7H BH=CEHADD AL,BL ┃EAX = 0000D734H EBX = 0000CEDFH AL=34H BL=DFH(Ⅳ)MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000HMOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFHADD AH,BH ┃EAX = 0000D755H EBX = 0000CEDFH AH=D7H BH=CEHADC AL,BL ┃EAX = 0000D734H EBX = 0000CEDFH AL=34H BL=DFH(2)在DEBUG系统状态下,分别编制、调试并记录以下乘、除程序段的每一条指令的运行情况:(Ⅰ)MOV AL,23 ┃EAX = 750A3317H EBX =7EFDE000H AL=17HMOV BL,0CEH ┃EAX = 750A3317H EBX =7EFDE0CEH BL=CEHMUL BL ┃EAX = 750A1282H EBX =7EFDE0CEH(Ⅱ)MOV AX,2389 ┃EAX = 750A0955H EBX =7EFDE000HMOV BX,0CEDFH ┃EAX = 750A0955H EBX =7EFDCEDFHMUL BX ┃EAX = 750A870BH EBX =7EFDCEDFH(Ⅲ)MOV AX,2389 ┃EAX = 750A0955H EBX =7EFDE000HMOV BL,0CEH ┃EAX = 750A0955H EBX =7EFDE0CEHDIV BL ┃EAX = 750A7B0BH EBX =7EFDE0CEH(Ⅳ)MOV AX,2389 ┃EAX = 750A0955H EBX = 7EFDE000H EDX = 00C41005HMOV DX,0856 ┃EAX = 750A0955H EBX = 7EFDE000H EDX = 00C40358HMOV BX,0CEDFH ┃EAX = 750A0955H EBX = 7EFDCEDFH EDX = 00C40358HDIV BX ┃EAX = 750A0423H EBX = 7EFDCEDFH EDX = 00C544D8H(3)在DEBUG系统状态下,分别编制、调试并记录以下移位指令程序段的每一条指令的运行情况:(Ⅰ)mov EAX,420 ┃EAX = 000001A4Hshl EAX,1 ┃EAX = 00000348H(Ⅱ)mov EAX,240 ┃EAX = 000000F0H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 000000F0H EBX = 7EFDE000H ECX = 00000004Hshl EAX,cl ┃EAX = 00000F00H EBX = 7EFDE000H ECX = 00000004H(Ⅲ)mov EAX,8000 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000004Hshr EAX,cl ┃EAX = 000001F4H EBX = 7EFDE000H ECX = 00000004H(Ⅳ)mov EAX,8000 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000004Hsar EAX,cl ┃EAX = 000001F4H EBX = 7EFDE000H ECX = 00000004H(Ⅴ)mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004Hrol EAX,cl ┃EAX = 0001F960H EBX =7EFDE000H ECX = 00000004H(Ⅵ)mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004Hror EAX,cl ┃EAX = 600001F9H EBX = 7EFDE000H ECX = 00000004H(Ⅶ)mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F96H EBX =7EFDE000H ECX = 00000004Hrcl EAX,cl ┃EAX = 0001F960H EBX = 7EFDE000H ECX = 00000004H(Ⅷ)mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004Hrcr EAX,cl ┃EAX = C00001F9H EBX =7EFDE000H ECX = 00000004Hrol与rcl、ror与rcr的区别在于rol和ror是将寄存器中的内容直接进行移位,而rcl和rcr是将寄存器中的内容与进位标志中的内容一起进行移位,因此参加移位的数据比原来的数据位数多一位。