实验六宏汇编的程序设计
宏汇编语言程序设计
第3章宏汇编语言程序设计3.1 教学要求·熟悉汇编语言程序的结构及其语句的结构。
·熟悉伪指令及其功能。
·掌握汇编语言结构化程序设计方法,即顺序结构、分支结构和循环结构的设计。
·熟悉过程(子程序)和宏指令的定义及使用规则。
·熟悉DOS调用功能及其规则。
3.2 内容提要3.2.1 汇编语言的语句结构汇编语言程序是由语句组成的。
语句的格式如下[名称[:]] 操作助记符操作数[,操作数][;注释]汇编语言语句的分成包含名称、操作助记符、操作数、注释四个域。
语句格式“[ ]”中的内容为可选项,根据实际情况而使用。
1. 操作助记符域操作助记符域是指令中唯一不可缺少的部分,由指令、伪指令或宏指令构成。
(1)指令指令是计算机可以执行的基本操作,汇编时可以转换为机器代码。
操作助记符为指令的语句称为指令语句,每条指令语句在执行时都对应一条机器指令。
例如MOV、ADD、SUB 等皆为指令。
(2)伪指令伪指令是在汇编语言源程序中使用的指令,用来定义段、定义数据、分配存储器、指示程序结束等。
伪指令语句只在汇编语言源程序中使用,不会转换成机器代码,机器不能执行。
例如,SEGMENT、DB、END等皆是伪指令。
(3)宏指令宏指令是由用户自己定义的指令。
2. 名称域名称包括标号和变量。
名称在汇编语言源程序中定义和使用,名称应以字母开头,后跟若干字母、数字或特殊符号(“_”、“.”、“?”、“$”、“@”)组成,符号个数不超过31个。
(1)标号标号在代码段中定义和使用,标号后面需要加“:”号,例如“START:”。
标号用来表示代码段中某条语句的地址,因此也称为代码的符号地址。
利用标号可以方便实现程序的转移和循环的控制。
标号有段属性、偏移属性和类型属性。
段属性代表定义标号的段地址;偏移属性代表标号的偏移地址;类型属性代表标号的使用范围,NEAR类型属性的标号只能在段内使用,而FAR类型属性的标号可以在不同段之间使用。
实验六宏汇编的程序设计
本例中的 ABSOL 宏定义在考虑有多次调用可能性的情况下,应定义为:
宏调用:
ABSOL NEXT:
MACRO LOCAL CMP JGE NEG
OPER NEXT OPER,0 NEXT OPER
ENDM
宏展开:
... ABSOL
... ABSOL
...
VAR BX
...
+
CMP VAR,0
+
JGE
子程序的不同调用,其局部 在每次宏引用的扩展
调用或引用
变量名保存不变
时,将会自动产生出一
个唯一的局部标号
宏定义中允许使用宏调用,其限制条件是:必须先定义后调用
宏定义:
DIF MACRO X,Y
MOV
AX,X
SUB
AX,Y
ENDM
DIFSQR 宏调用:
MACRO PUSH PUSH DIF IMUL MOV POP POP ENDM
宏定义:
LEAP MACRO COND,LAB J&COND LAB ENDM
宏调用:
...
LEAP
Z,THERE
...
LEAP
NZ,HERE
... 宏展开:
...
+
JZ
THERE
...
+
JNZ
...
HERE
“&”符号是一个操作符,它在宏定义体中可以作为哑元的前缀,展开时可以把&前后 个符号合并而形成一个符号,这个符号可以是操作码,操作数或是一个字符串。
AX,Y
MOV
Z,AX
POP
AX
ENDM 形成加法宏定义 ADDITION.同样,宏调用
宏汇编语言程序设计PPT课件
MOV ES , AX
129F:000F BF0000 MOV DI , 0000
129F:0012 B90600 MOV CX, 0006
129F:0015 F3
REP
129F:0016 A4
MOVSB
129F:0017 B44C
MOV AH, 4C
129F:0019 CD21
INT
21
、、、、、、
-U
;查看程序代码
129F:0000 FC
CLD
129F:0001 B89D12 MOV AX , 129D
129F:0004 8ED8
MOV DS , AX
129F:0006 8D360000 LEA SI ,
[ 0000 ]
129F:000A B89E12 MOV AX , 129E
129F:000D 8EC0
MOV AH, SIZE A2
汇编时形成指令
MOV CX, 200
MOV AH, 2
第21页/共92页
5). PTR 修改属性操作符
格式:类型/距离 PTR 变量或标号 功能:将PTR左边的类型属性赋给右边的变量或标号。 常用类型:BYTE、WORD、DWORD、NEAR、FAR
例:
MOV BYTE PTR [BX],10; [BX] 10H MOV WORD PTR [BX],10; [BX],[BX+1]
第15页/共92页
4). 数值返回操作符
SEG 取符号地址(变量或标号)的段地址
例 MOV AX , SEG yy
OFFSET 取符号地址(变量或标号)的偏移地址
例 MOV BX , OFFSET yy
bb yy bb cc ES:bb start :
宏汇编(MASN)及汇编语言上机过程实验报告
佛山科学技术学院实验报告课程名称汇编语言程序设计实验项目实验一宏汇编(MASN)及汇编语言上机过程专业班级 13 网络工程班姓名学号指导教师杨定安成绩日期2015.10. 25一、实验目的1.通过实验了解和熟悉微机系统的配置。
2.学习在DEBUG状态下输入汇编源程序的方法。
3.初步掌握调试(在DEBUG状态下)的过程。
二、实验原理1. 本实验要求在DEBUG状态下输入汇编源程序,并用DEBUG命令进行调试。
用单步跟踪的方法验证指令的功能。
2. 以下是给定的参考程序,并在实验时在每条指令的“;”符号右边按要求填写指令的执行结果。
注:⑴微机进入DEBUG状态下之后,一切立即数和地址数据均被默认为十六进制数,在输入时数的后面不加后缀“H”;⑵在DEBUG状态下执行程序时,“INT 20H”指令可使系统执行完该指令前的程序时返回到“-”提示符状态,并且恢复CS和IP寄存器原来的值。
三、实验仪器微机一台,U盘一块。
四、实验步骤1.开机和关机操作顺序开机:先打开微机外部设备电源开关,如显示器,最后打开主机电源开关。
关机:与开机相反,先关掉主机电源开关,然后关闭所有外设的电源开关。
2. 装入DEBUG程序若计算机系统启动正常,可以进入MASM文件夹或MASM5文件夹从磁盘上调用DEBUG,程序到内存。
如是WINDOWS环境下,先运行CMD命令,然后运行CD MASM命令,再运行DEB2000命令。
一般C盘上装有DEBUG和DEB2000软件,若没有,可以用复制命令从其它盘拷贝过来,然后从装有DEBUG 和DEB2000软件的磁盘上调用DEBUG和DEB2000软件程序。
例如:C :\MASM> DEB2000↙(↙回车符)-(-DEBUG 提示符)当显示器出现提示符“-”时,说明已进入DEBUG状态,这时,可用DEBUG命令进行操作。
4. 用DEBUG的Register命令检查所有寄存器内容,并作记录,主要是R命令5. 用DEBUG的Assemble命令输入汇编源程序。
汇编语言实验报告_6
青岛理工大学课程实验报告
课程名称汇编语言程序设计班级实验日期
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)冒泡排序也遇到一些困难。
调试结果:。
宏汇编语言程序设计 .ppt
ENDS
END START
§4-4 程序设计方法
【 分支结构】
2.多分支
依次测试多个条件是否满足:若满足转入相应分支入口;不满足继续向下
测试,直到全部测试完。
此方法编程简单直观,但速度慢。
判定条件
例 有8个加工子程序,入口地址分别为
P1 ,P2 ,…P8 。编程实现检测键盘输入
命令,使系统分别转向8个加工子程序。
概述
一个好的程序,应该具备的特点:
程序结构模块化,程序易读,易调试及维护。 执行速度快。 占用内存空间小。
§4-4 程序设计方法
【概述】
设计汇编语言源程序的基本步骤:
⑴ 分析问题 抽象数学模型,确定实现算法。
⑵ 绘制程序流程图 粗框图 细框图。
⑶ 分配存储空间、工作单元 分配数据段、堆栈段、程序段 的位置,确定寄存器主:
§4-4 程序设计方法
P1: P2: P3:
P8: ST :
MOV INT CMP JE CMP JE … CMP JE JMP … … … … … HLT
AH, 1 21H AL, ‘1’ P1 AL, ‘2’ P2
AL, ‘8’ P8 ST
【 分支结构】
;1号功能键调用,键盘接收 ;键值为1,转1号加工子程序 ;键值为2,转2号加工子程序
MOV AH, 0
DEC AL MOV BL, AL
; AL为键值
ADD ADD MOV ADD JMP
AL, AL AL, BL BX, OFFSET BASE BX, AX BX
;偏移量=键值×3 ;基地址 ;表地址 ;转入转移指令
§4-4 程序设计方法
【 分支结构】
⑶根据关键字分支
汇编语言 宏汇编程序设计
昆明理工大学信息工程与自动化学院学生实验报告(2010 —2011 学年第 1 学期)课程名称:汇编语言程序设计开课实验室: 2010年 12 月 14 日年级、专业、班计科083 学号姓名成绩实验项目名称宏汇编指导教师教师评语教师签名:年月日一、实验要求宏指令设计1)掌握宏指令库的设计方法,并设计程序来调用其中的宏指令;2)编程实现32位二进制数除以16位二进制数,并把结果用十进制数形式显示在屏幕上。
要求采用宏指令库实现;3)观察并记录运行结果。
二、实验原理及基本技术路线图(方框原理图)使用debug进行调试。
源程序:INCLUDE MACRO.libPURGE SETMODE,INCHAR,OUTCHAR,WINDOW,MOVE,MULSTACKSG SEGMENT STACK 'S'DW 16 DUP('?')STACKSG ENDSDATA SEGMENTA DD 1234001B DW 1234C DW ?PROMPT DB 'The result is: $'ASCII DB 5 DUP(?),'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSGMAIN PROC FARMOV AX,DATAMOV DS,AXMOV DX,WORD PTR A+2MOV AX,WORD PTR ADIV BBIN_DEC ASCII,AX CLRSCRNDISP PROMPTDISP ASCIIRETURNMAIN ENDPCODE ENDSEND MAIN附:宏库MACRO.libSETMODE MACROPUSH AXMOV AH, 0MOV AL, 3INT 10HPOP AXENDMINCHAR MACROPUSH AXMOV AH,1INT 21HPOP AXENDMOUTCHAR MACRO XPUSH DXPUSH AXMOV DL,XMOV AH,2INT 21HPOP AXPOP DXENDMPUSHREG MACROPUSH DXPUSH CXPUSH BXPUSH AXPUSH DIPUSH SIPUSH BPENDMPOPREG MACROPOP BPPOP SIPOP DIPOP AXPOP BXPOP CXPOP DXENDMWINDOW MACRO Collor,WleftTopRow,WLeftTopCul, WRightBottomRow,WRightBottomCulPUSHREGMOV AH ,6MOV AL ,0MOV BH ,CollorMOV CH ,WleftTopRowMOV CL ,WLeftTopCulMOV DH ,WRightBottomRowMOV DL ,WRightBottomCulINT 10HPOPREGENDMMOVE MACRO X,YPUSH AXMOV AX,XMOV Y,AXPOP AXENDMCLRSCRN MACROPUSHREGMOV AH,6MOV AL,0MOV BH,1FHMOV CX,0MOV DX,184FHINT 10HPOPREGENDMCURSOR MACROPUSH AXPUSH BXMOV AH,2XOR BH,BHINT 10HPOP BXPOP AXENDMMUL MACRO M1,M2PUSH AXPUSH BXPUSH DXMOV AX,M1MOV BX,M2MUL BXPOP DXPOP BXPOP AXENDMRETURN MACROPUSH AXMOV AX, 4C00HINT 21HPOP AXENDMBIN_DEC MACRO ASC,BIN LOCAL LOPLOCAL EXITPUSHREGLEA DI, ASC ADD DI, 5MOV AX, BIN MOV BX, 10 LOP: MOV DX, 0CMP AX, 0JE EXITDIV BXADD DL, 30HDEC DIMOV [DI],DLJMP LOPEXIT: POPREGENDMDISP MACRO ASCPUSH DSPUSH DXPUSH AXLEA DX, ASCMOV AH, 9INT 21HPOP AXPOP DXPOP DSENDM三、所用仪器、材料(设备名称、型号、规格等)Masm 6.0,debug。
汇编程序设计实验
汇编程序设计实验汇编程序设计实验是计算机科学与技术专业中一项重要的实践教学环节,它旨在培养学生对计算机硬件结构和低级语言程序设计的深入理解。
通过实验,学生可以学习到如何使用汇编语言编写程序,以及如何将这些程序转换为机器可以执行的指令。
实验目的1. 理解汇编语言的基本概念和语法结构。
2. 掌握汇编语言程序设计的基本方法和技巧。
3. 熟悉汇编程序的编写、编译、调试和运行过程。
4. 增强对计算机硬件工作原理的认识和理解。
实验环境- 汇编语言开发环境,如MASM、NASM等。
- 汇编器和链接器,用于将汇编源代码转换为可执行文件。
- 调试工具,如调试器,用于检查程序的执行过程。
实验内容1. 汇编语言基础- 学习汇编语言的指令集和操作数。
- 了解汇编语言的基本语法和程序结构。
2. 编写简单的汇编程序- 编写一个程序,实现数据的输入和输出。
- 编写一个程序,实现简单的算术运算。
3. 寄存器和内存操作- 学习如何使用寄存器进行数据存储和操作。
- 编写程序,实现内存地址的数据读写。
4. 循环和条件判断- 学习循环结构和条件判断的实现方法。
- 编写程序,实现循环和条件判断的功能。
5. 子程序调用- 学习子程序的编写和调用方法。
- 编写一个主程序和若干子程序,实现模块化编程。
6. 中断和异常处理- 了解中断和异常的基本概念。
- 编写程序,实现简单的中断服务程序。
7. 汇编与高级语言的接口- 学习如何将汇编程序与C/C++等高级语言程序进行接口。
- 编写程序,实现汇编语言与高级语言的混合编程。
实验步骤1. 环境搭建:安装并配置汇编语言开发环境。
2. 编写代码:根据实验要求编写汇编语言源代码。
3. 编译程序:使用汇编器将源代码编译为机器代码。
4. 链接程序:使用链接器将编译后的代码与其他必要的库链接成可执行文件。
5. 调试程序:使用调试工具检查程序的执行过程,找出并修复错误。
6. 运行程序:在适当的环境下运行程序,验证程序的正确性。
宏指令应用程序设计实验程序设计实验报告 _20141211
实验六宏指令运用程序设计实验学号:41210038姓名:罗天继一、实验目的:1、复习掌握:宏定义,宏调用,宏展开概念;2、练习掌握:宏指令在汇编程序中的应用方法;3、学习掌握:宏库的概念,学会制作宏库文件的技术;4、学习掌握:在汇编程序中引用宏库的编程技术;5、学习掌握:宏操作符的概念,在汇编程序中的应用技术;6、讨论掌握:宏在汇编程序设计中的地位与作用。
二、实验内容:实验1:1、编写一个将AX中数据乘以10的宏MULTAX10,并编制一个程序SY6_1.ASM调用MULTAX10,且调试运行,验证其功能的实现情况;源文件SY6_1.asm文件内容:.286 ;保留MULTAX10 MACROPUSH BXSAL AX , 1MOV BX , AXSAL AX , 1SAL AX , 1ADD AX , BXPOP BXENDMDATA SEGMENT ;保留;填入内容DATA ENDS ;保留STACK1 SEGMENT PARA STACK ;保留DW 20H DUP(0) ;保留STACK1 ENDS ;保留CODE SEGMENT ;保留ASSUME CS:CODE,DS:DATA,SS:STACK1 ;保留START: MOV AX,DATA ;保留MOV DS,AX ;保留MOV AX , 01HMULTAX10;填入内容MOV AX,4C00H ;保留INT 21H ;保留CODE ENDS ;保留END START ;保留编译源文件“SY6_1.asm”生成可执行文件“Debug SY6_1.exe”SY6_1.ini文件内容:u 0,1Ed 2867:0,1fg=0,14d 2867:0,1fqSY6_1.bat文件内容:Debug sy6_1.exe < sy6_1.ini> > sy6_1.txt 执行SY6_1.bat文件后可以获得SY6_1.txt文件;SY6_1.txt文件内容:-u 0,1E2867:0000 B86328 MOV AX,28632867:0003 8ED8 MOV DS,AX2867:0005 B80100 MOV AX,00012867:0008 53 PUSH BX2867:0009 D1E0 SHL AX,12867:000B 8BD8 MOV BX,AX2867:000D D1E0 SHL AX,12867:000F D1E0 SHL AX,12867:0011 03C3 ADD AX,BX2867:0013 5B POP BX2867:0014 CD21 INT 212867:0016 22CB AND CL,BL2867:0018 40 INC AX2867:0019 AF SCASW2867:001A 21CB AND BX,CX2867:001C 40 INC AX2867:001D AF SCASW2867:001E 21CB AND BX,CX-d 2867:0,1f2867:0000 B8 63 28 8E D8 B8 01 00-53 D1 E0 8B D8 D1 E0 D1 .c(.....S....... 2867:0010 E0 03 C3 5B CD 21 22 CB-40 AF 21 CB 40 AF 21 CB ...[.!".@.!.@.!.-g=0,14AX=000A BX=0000 CX=0056 DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=2863 ES=2853 SS=2863 CS=2867 IP=0014 NV UP EI PL NZ NA PE NC 2867:0014 CD21 INT 21-d 2867:0,1f2867:0000 B8 63 28 8E D8 B8 01 00-53 D1 E0 8B D8 D1 E0 D1 .c(.....S.......2867:0010 E0 03 C3 5B CD 21 22 CB-40 AF 21 CB 40 AF 21 CB ...[.!".@.!.@.!.-q显然,上面忠实地记录了内存的情况并且展示了实验结果。
罗辛汇编实验
实验六子程序和宏汇编的程序设计一. 实验目的:1、掌握子程序设计和调试方法,包括:1) 掌握主程序与子程序之间的调用关系及其调用方法;2) 掌握子程序调用过程中近程调用与远程调用的区别;2、掌握DOS调用功能的输入输出设计方法3、掌握大小转换的设计方法4、掌握十进制数的计算设计方法二. 实验要求:1、掌握子程序设计方法,包括:1) 子程序间参数简单传递方法2) 利用堆栈传递方法3) 子程序的递归2、基于DOS调用的输入输出方法,包括:1) 单个字符的输出方法2) 字符串的输出方法3) 字符的输入方法三. 实验内容:1.控制台输入输出(1) 字符的输出向显示器输出信息有三种方法:▪通过操作系统的服务程序(INT 21H)输出;▪通过“基本输入输出系统(BIOS)”输出;▪把显示内容(ASCII码)直接写入“显示存储器(Video RAM,VRAM)”,由显示器接口电路转换输出这里实验通过操作系统的服务程序(INT 21H)输出。
①输出单个字符例:下面的程序在显示器上输出数字字符“9”:字符“9”显示在光标(Cursor)位置, 光标向右移动一个字符位置。
问题:X为DB定义的一个变量,下面的程序能够输出X的值吗?MOV AH, 2 ;功能号02H装入AH寄存器MOV DL, X ;变量X的值装入DL寄存器INT 21H ;调用21H号系统服务程序练习1:在显示器上输出文字“Hello !”参考程序:CODE SEGMENTASSUME CS: CODESTART: LEA BX, STRINGMOV CX, 11ONE: MOV DL, CS: [BX] ;取出一个字符的ASCII代码MOV AH, 2 ;单个字符输出的功能号NT 21H ;调用系统服务,输出一个字符INC BX ;修改指针LOOP ONE ;计数与循环控制MOV AX, 4C00HINT 21HSTRING DB 0DH, 0AH, ‘Hello !’, 0DH, 0AHCODE ENDSEND START说明:STRING在代码段里定义,取字符需要增加段跨越前缀“CS: [BX]”,否则会到“DS: [BX]”处取字符,输出不确定的内容。
实验六 汇编语言程序综合设计
实验六汇编语言程序综合设计一、实验目的1.熟练掌握汇编语言程序调试的方法。
二、实验内容(自选2-4 个程序实现)1.编程计数1+2+…+199+200,将结果存入SUM 单元。
2.编写程序统计BUF单元开始的长度为20 的字符串中包含字符‘A’的个数。
(字符串可以先由键盘输入)3.内存BUF单元开始存放20 个字节数,编程将按从小到大的顺序排列,并存放在原存储区中。
4. 在数据段中变量WEEK存储星期一至星期日的英文缩写(MON、TUE、WED、THU、FRI、SAT、SUN),DAY 单元中用数1~7 分别表示星期一到星期日,编程根据DAY的内容显示对应的英文缩写。
5. 在包含100 个字符的字符串中寻找第一个回车符CR,找到后保留地址,显示“Y”,否则显示“N”。
具体内容:1.编程计数1+2+…+199+200,将结果存入SUM 单元。
(1)程序:DA TA SEGMENTCNT DB 200SUM DW ?DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART: MOV AX,DATAMOV DS,AXMOV AX,0MOV CL,CNTMOV BX,0NEXT: ADD AX,BXINC BXLOOP NEXTMOV SUM,AXMOV AH,4CHINT 21HCODE ENDSEND START(2)过程分析:CB的16位进制数为200,而BC 4D的高四位是4D,他们的16位为19900 刚好等于(0+199)*200/2=19900(3)实验结果(截屏)(42.编写程序统计BUF单元开始的长度为20 的字符串中包含字符‘A’的个数。
(字符串可以先由键盘输入)(1) 程序:DATA SEGMENTBUF DB 'ADNBSDJKNABABDEAEBEB',0DHCOUNT DB 0DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODESTART: MOV AX,DATAMOV DS,AXLEA BX,BUFMOV CL,0LOP: INC BXMOV AL, [BX-1]CMP AL, 0DHJZ EXITCMP AL, 41HJNZ LOPINC CLJMP LOPEXIT: MOV COUNT,CLMOV AH,4CHINT 21HCODE ENDSEND START(2)调试过程:'ADNBSDJKNABABDEAEBEB'中有四个A(3)实验结果(截屏)3.内存BUF单元开始存放20 个字节数,编程将按从小到大的顺序排列,并存放在原存储区中。
汇编语言(王爽第三版)实验6实践课程中的程序
汇编语⾔(王爽第三版)实验6实践课程中的程序实验6 实践课程中的程序(1)将课程中所有讲解过的程序上机测试,⽤debug跟踪其执⾏过程,并在过程中理解所讲内容。
问题7.6 将data段中每个单词的头⼀个字母改为⼤写字母。
assume cs:codedata segmentdb '1. file 'db '2. edit 'db '3. search 'db '4. view 'db '5. options 'db '6. help 'data endscode segment程序分析:1)数据段定义了6个字符串结构,长度⼀致都是16字节,并且字符都是连续的,并且头⼀个字母在字符串中的位置都是第4个字符,在上⾯的寻址⽅式中,我们发现[bx+idata]⽅式⽐较适合这种情况,idata代表每个字符串起始地址,bx代表基本偏移地址,bx的偏移量也是有规律的16。
2)在debug中,这6个字符串显⽰的正好是6⾏16列的字符,是⼀个我们在C语⾔中讲到的⼆维数组[6][16],其实它在内存中是线性单列排列的。
3)遇到此种情况我们使⽤[bx+idata]的⽅式进⾏内存的寻址⽐较科学。
完整的代码如下:assume cs:codedata segmentdb '1. file 'db '2. edit 'db '3. search 'db '4. view 'db '5. options 'db '6. help 'data endscode segmentstart:mov ax, datamov ds, axmov bx, 0 ;将ds:bx指向data第⼀个单元mov cx, 6 ;需要修改6次s: mov al, [bx+3] ;使⽤[bx+idata]寻址⽅式,并送⼊al(单字节)and al, 11011111b ;转换为⼤写字母mov [bx+3], al ;回写内存add bx, 16 ;6个字符串长度⼀致,都是16字节,增量为16loop smov ax, 4c00Hint 21Hcode endsend start结果分析:(1)在循环中,如遇到loop指令,⾸先我们要认识到,(cx)=(cx)-1;直到cx=0退出循环。
宏汇编程序设计
5. 1 编制汇编语言程序的步骤
1 . 将实际问题抽象为数学模型。 2 . 确定算法。 3 . 程序模块设计,确定确定各模块间的接 口(通信)。 4 . 画出流程图。 5 .编制程序(包括设置常量、变量,分配 工作区和工作单元。 6 .上机调试。
5. 1 编制汇编语言程序的步骤(续1)
上机调试的步骤: 生成目标程序(宏汇编): MASM <源程序名> ;;; 生成可执行程序(连接): LINK <目标程序名> ;
5. 6循环程序设计(续1 )
lp2: mov si , cx lea bx , arr lp1: mov al , [bx] cmp al,[bx+1] jge zy1 xchg al, [bx+1] mov [bx], al zy1: inc bx loop lp1 mov cx , si loop lp2 mov ah , 09h lea dx ,arr int 21h mov ah , 4ch int 21h ret code ends end start
4. 3ቤተ መጻሕፍቲ ባይዱ2 代码段(续1)
标号
⋮ AGAIN: MOV AX , BX ⋮ JNZ AGAIN ⋮ CODE ENDS END START
;JNZ:不等于转移
;代码段结束 ;指明程序开始地址
4. 3.3堆栈段和附加段
3.堆栈段:设置堆栈
例:
STACK SEGMENT DZH DB 100DUP(?) STACK ENDS 4.附加段:作用同数据段。一般用于串操
4. 3.1 数据段
DA5 DW ? ;变量,两个字节,初始值未定 DA6 DD ? ;常量,四个字节,初始值未定 DA7 DB 100 DUP(0) ;定义缓冲区、表, ;100个字节,初值 ; 为零 DA8 DB 100 DUP(?) ;定义缓冲区、表, ; 100个字节初值 ;未定
汇编实验报告6
汇编实验报告6汇编实验报告6引言:汇编语言是一种底层编程语言,它直接操作计算机硬件,提供了对计算机底层资源的更精确控制。
在本次实验中,我们将继续学习和实践汇编语言的相关知识,探索其在计算机系统中的作用和应用。
一、实验目的本次实验旨在加深我们对汇编语言的理解,并通过实践进一步掌握汇编语言的基本概念、语法和应用。
具体目标如下:1. 掌握汇编语言的基本指令和寻址方式;2. 理解和实现简单的汇编程序;3. 学会使用调试工具调试汇编程序。
二、实验环境本次实验使用的环境为Windows操作系统和MASM汇编器。
在实验开始前,我们需要确保已经正确安装了MASM汇编器,并配置好了相关环境变量。
三、实验过程1. 编写程序本次实验我们将编写一个简单的汇编程序,实现两个数相加并输出结果的功能。
首先,我们需要使用文本编辑器打开一个新的文件,并保存为.asm格式。
接下来,我们将按照汇编语言的语法规则,逐步编写程序。
2. 汇编程序的结构一个标准的汇编程序由三个部分组成:数据段、代码段和堆栈段。
在数据段中,我们定义了需要使用的变量和常量;在代码段中,我们编写了实际的汇编指令;而堆栈段则用于存储程序执行过程中的临时数据。
3. 汇编指令的使用在本次实验中,我们将使用一些常见的汇编指令,如MOV、ADD、SUB等。
这些指令用于操作寄存器、内存和立即数,实现数据的传输、运算和比较等功能。
4. 调试程序编写完汇编程序后,我们需要使用调试工具对程序进行调试,以确保程序的正确性。
调试工具可以帮助我们逐条执行程序,并查看寄存器和内存的变化,从而找出程序中的错误。
四、实验结果与分析经过编写和调试,我们成功地实现了两个数相加并输出结果的功能。
我们可以通过调试工具查看程序执行过程中寄存器和内存的变化,以验证程序的正确性。
同时,我们还可以对程序进行性能分析,了解其在不同输入情况下的执行效率。
五、实验总结通过本次实验,我们深入学习了汇编语言的基本概念和应用。
宏汇编程序设计共34页
谢谢!
宏汇编程序设计
•
6、黄金时代是在我们的前面,而不在 我们的 后面。
•
7、心急吃不了热汤圆。
•
8、你可、只为成功找方法,不为失败找借口 (蹩脚 的工人 总是说 工具不 好)。
•
10、只要下定决心克服恐惧,便几乎 能克服 任何恐 惧。因 为,请 记住, 除了在 脑海中 ,恐惧 无处藏 身。-- 戴尔. 卡耐基 。
21、要知道对好事的称颂过于夸大,也会招来人们的反感轻蔑和嫉妒。——培根 22、业精于勤,荒于嬉;行成于思,毁于随。——韩愈
23、一切节省,归根到底都归结为时间的节省。——马克思 24、意志命运往往背道而驰,决心到最后会全部推倒。——莎士比亚
东华大学计算机病毒课实验六宏病毒实验报告
计算机病毒实验报告姓名:学号:老师:日期:一。
实验目的Word宏是指能组织到一起为独立命令使用的一系列Word指令,它能使日常工作变得容易。
本实验演示了宏的编写,通过两个简单的宏病毒示例,说明宏的原理及其安全漏洞和缺陷,理解宏病毒的作用机制,从而加强对宏病毒的认识,提高防范意识。
二. 实验内容1。
macro virus中的内容2。
信安实验平台—-—>计算机病毒篇 -———>计算机宏病毒3。
结合杀毒软件如诺顿、卡巴斯基等,观察病毒查杀现象三. 实验环境1。
macro virus硬件设备:局域网,终端PC机.系统软件:Windows系列操作系统支撑软件:Word 2003软件设置:关闭杀毒软;打开Word 2003,在工具→宏→安全性中,将安全级别设置为低,在可靠发行商选项卡中,选择信任任何所有安装的加载项和模板,选择信任visual basic项目的访问。
实验环境配置如下图所示:受感染终端受感染Word文档被感染终端2。
计算机宏病毒硬件设备:部署 WIN2003 系统的PC 机一台软件工具:Office word2007四.实验步骤及截图1.自我复制,感染word公用模板和当前文档打开一个word文档,然后按Alt+F11调用宏编写窗口(工具宏 Visual Basic 宏编辑器),在左侧的project-〉Microsoft Word对象 ThisDocument中输入以上代码,保存,此时当前word文档就含有宏病毒只要下次打开这个word文档,就会执行以上代码,并将自身复制到Normal.dot(word文档的公共模板)和当前文档的ThisDocument中,同时改变函数名(模板中为Document_Close,当前文档为Document_Open),此时所有的word文档打开和关闭时,都将运行以上的病毒代码,可以加入适当的恶意代码,影响word的正常使用,本例中只是简单的跳出一个提示框。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
POP AX
;恢复 AX 原值
POP DX
;恢复 DX 原值
ENDM
其中,“MUPLY_2W” 为宏定义名;“OPR1、OPR2、RESULT”为形参(OPR1
为被乘数,OPR2 为乘数,RESULT 为乘积);在第一行和最后一行之间的指令
宏展开 1:
语句就是实现题目要求的宏定义体。
宏调用 1:
+ PUSH DX
??0000
+
NEG VAR
+??0000:
...
+
CMP BX,0
+
JGE
??0001
+
NEG BX
+??0001:
...
由此,汇编程序将不会显示“标号重复定义”的错误信息。
可见,如同重复调用子过程一样可以重复调用宏(否则就失去了使用宏的意义)。绝不
能认为“宏不能重复调用且这是其与子过程的不同之处”!
宏展开 2:
+ PUSH DX
+ PUSH AX + MOV AX,240 + IMUL BX
;第一个操作数是立即数 240 ;第二个操作数在BX中
+ MOV SAVE, AX ;结果存入变量SAVE
+ POP AX
+ POP DX
宏调用和子程序调用的比较
宏调用的优点:
宏指令可以带哑元,调用时可以用实元取代,这就避免了子程序因参数传送带来的麻 烦,使宏汇编的使用更加灵活。并且,宏调用时的实元可以是常数、寄存器、存储单 元名以及用寻址方式能找到的地址或表达式等,如例 6.1 中两次宏调用时所用到的实 元“240、cx、var、xyz[x]”;实元也可以是指令的操作码或操作码的一部分等。由此 使得宏汇编具有很大的灵活性,这是子程序所不及的。
MULTI_2W CX, VAR, XYZ[BX]
其中,实元CX对应于形参OPR1, 即寄存器CX的值作为被乘数;实元 VAR对应于形参OPR2,即偏移地址 VAR指向的存储单元中的数值作为 乘数;实元XYZ[BX]对应于形参 RESULT,即偏移地址XYZ[BX]指 向的存储单元存放两数的乘积。
+ PUSH AX
宏定义:
PO MACRO P1
JMP
TA&P1
ENDM
宏调用:
宏展开:
FO
WORD_VAR
+
JMP TAWORD_VAR
实元是 ASCII 串的情况
宏定义:
MSGGEN MACRO LAB,NUM,XYZ
LAB&NUM DB 'HELLO MR.&XYZ'
宏调用:
ENDM
宏展开:
MSGGEN MSG,1,TAYLOR
宏调用就是在源程序中调用已有的宏定义,直接使用宏定义名加上实参(如 果宏定义有形参)即可,其格式如下::
MACRO_NAME [ACTUAL_PARAMETER_LIST]
ACTUAL_PARAMETER_LIST 称为实元表,它的每一项称为“实元”,相互之间用逗号隔开, 分别与宏定义中的哑元表的各项形式参数(“虚参”)相对应。
局部标号伪指令 LOCAL 的使用——宏定义体内允许使用标号,如:
宏定义:
ABSOL MACRO OPER
CMP
OPER,O
JGE
NEXT
NEG
OPER
NEXT: ...
ENDM
如果程序中多次调用该宏定义时,展开后会出现标号的多重定义.为此系统提供了 LOCAL
伪操作,其格式是
LOCAL LIST OF LOCAL LABELS
为此,宏定义通常放置在程序中所有段的代码之前,亦即在程序一开始就首先设计好程 序中将要用到的所有的宏定义,以便在程序中调用。
宏定义可以无变元
宏定义:
ACRO_01 MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
ENDM 宏调用:
变元可以是操作码
使用子程序增加了一些额外开销,包括转向子程序和返回断点以及保存、恢复寄存器 现场以及参数的传送等;而宏汇编可以免去执行时间上的额外开销。
宏调用和子程序调用二者的工作方式不同:
宏调用则是在汇编期间展开的,每调用一次就把宏定义体展开一次,因此它占有的存 储空间与调用次数有关,调用次数越多则占有的存储空间也就越大,如图 E6.1(a)所 示;而子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间, 如图 E6.1(b)所示。
则宏定义可表示如下:
MULTI_2W
MACRO OPR1, OPR2, RESULT
PUSH DX
;保存 DX 原值
PUSH MOV IMUL
AX AX, OPR1 OPR2
;保存 AX 原值 ;取第一个操作数 OPR1,存在 AX 中
;与第二个操作数 OPR2 相乘
MOV RESULT, AX ;结果存入结果变量 RESULT 中
而不用宏汇编;而那些较短的且需要传送的参数较多的功能段,则使用宏汇编就更为
合理了。但是,如果宏调用次数较多的话,则其空间上的开销也是应该考虑的因素。
因此,应根据具体情况综合考虑来决定是选择宏调用还是子程序调用。
宏汇编的若干要点:
必须先进行宏定义,然后才可宏调用,亦即要遵从“先定义,后调用”的 原则。
AX,X AX,Y
MOV
Z,AX
POP
AX
ENDM
ENDM
其中 MACNAM 是内层的宏定义名,但又是外层宏定义的哑元,所以调用 DEFMAC 时,就形成
一个宏定义.
宏调用:
DEFMAC ADDITION,ADD
宏展开:
+ ADDITION MACRO X,Y,Z
PUSH
AX
MOV
AX,X
216
ADD
ENDM
宏调用:
...
ADD XX,YY,ZZ
PURGE ADD
...
214
在宏调用后,用 PURGE 伪操作取消定义,以便恢复 ADD 指令的原始含义,在 PURGE ADD
后面所用的 ADD 指令,则服从机器指令的定义。
PURGE 伪操作可同时取消多个宏操作,此时各宏指令之间用逗号隔开。
通常,实元的个数和哑元的个数是相等的(可以通过重新修改宏定义来实现)。但是, 汇编程序并不要求它们必须相等。若实元个数大于哑元个数,则多余的实元不予考虑; 若实元个数小于哑元个数,则多余的哑元作“空”处理。
例如: 用宏定义指令设计一个宏,以完成两个字操作数相乘,得到一个 16 位的乘积。
- 211 -
- 212 -
(a) 宏调用的工作方式
(b) 子程序调用的工作方式
其中:宏定义中的“X、Y”为形参,“A、B、C、D、E、F”为实参;
子程序中的“X、Y”为入口参数,“A、B、C、D、E、F”为实参。
图E6.1 子程序调用和宏调用工作方式的区别
宏调用和子程序调用的选择:
一般说来,由于宏汇编可能占用较大的空间,所以代码较长的功能段往往使用子程序
MACRO_NAME MACRO [DUMNY_PARAMETER_LIST] (宏定义体) ENDM
MACRO 和 ENDM 是一对用来定义“宏”的伪操作指令,亦即为“宏定义指令”。 MACRO_NAME是设定宏定义的名称,亦即“宏指令名”(可简称为“宏名”)。调用时就
使用宏指令名来调用该宏定义。宏指令名的第一个符号必须是字母,其后可以跟字母、 数字或下划线字符等有效的汇编语言字符。 DUMNY_PARAMETER_LIST 称为哑元表,它给出宏定义中所用到的形式参数(也称“虚参” 或“哑元”),哑元之间用逗号隔开。根据实际情况,宏定义可以没有形式参数,亦 即可以不设置哑元表。 宏定义体是一组具有独立功能的程序代码,处于 MACRO 和 ENDM 之间。
宏展开就是在源程序被汇编时,汇编程序用宏定义体取代源程序中的宏指 令,而宏定义中的哑元被宏调用所带的实元所取代。
宏展开后,即用实元取代哑元后,所得到的宏定义体的各条语句必须是有效的,亦即 必须符合汇编语法,否则汇编程序将会提示出错。
在宏展开进行实元取代哑元时,实元和哑元是依次一一对应的,即第一个实元取代第 一个哑元,第二个实元取代第二个哑元……依次类推。
OPR1,OPR2,RESULT DX AX OPR1,OPR2 AX RESULT,AX AX DX
DIFSQR
VAR1,VAR2,VAR3
宏定义体内可以包含宏定义.
宏定义:
DEFMAC
MACRO MACNAM
MACNAM,OPERATOR
MACRO
X,Y,Z
PUSH
AX
MOV OPERATOR
子程序的不同调用,其局部 在每次宏引用的扩展
调用或引用
变量名保存不变
时,将会自动产生出一
个唯一的局部标号
宏定义中允许使用宏调用,其限制条件是:必须先定义后调用
宏定义:
DIF MACRO X,Y
MOV
AX,X
SUB
AX,Y
ENDM
DIFSQR 宏调用:
MACRO PUSH PUSH DIF IMUL MOV POP POP ENDM
AX,Y
MOV
Z,AX
POP
AX
ENDM 形成加法宏定义 ADDITION.同样,宏调用
DEFMAC
SUBTRACT,SUB
形成减法的宏定义.当然在形成这些宏定义后,就可以使用宏调用
而展开成: