宏指令应用程序设计实验程序设计实验报告 1211.docx
《宏指令应用程序设计实验程序设计实验报告 1211.docx》由会员分享,可在线阅读,更多相关《宏指令应用程序设计实验程序设计实验报告 1211.docx(25页珍藏版)》请在冰豆网上搜索。
宏指令应用程序设计实验程序设计实验报告1211
实验六宏指令运用程序设计实验
学号:
41210038
姓名:
罗天继
一、实验目的:
1、复习掌握:
宏定义,宏调用,宏展开概念;
2、练习掌握:
宏指令在汇编程序中的应用方法;
3、学习掌握:
宏库的概念,学会制作宏库文件的技术;
4、学习掌握:
在汇编程序中引用宏库的编程技术;
5、学习掌握:
宏操作符的概念,在汇编程序中的应用技术;
6、讨论掌握:
宏在汇编程序设计中的地位与作用。
二、实验内容:
实验1:
1、编写一个将AX中数据乘以10的宏MULTAX10,并编制一个程序SY6_1.ASM调用MULTAX10,且调试运行,验证其功能的实现情况;
源文件SY6_1.asm文件内容:
.286;保留
MULTAX10MACRO
PUSHBX
SALAX,1
MOVBX,AX
SALAX,1
SALAX,1
ADDAX,BX
POPBX
ENDM
DATASEGMENT;保留
;填入内容
DATAENDS;保留
STACK1SEGMENTPARASTACK;保留
DW20HDUP(0);保留
STACK1ENDS;保留
CODESEGMENT;保留
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1;保留
START:
MOVAX,DATA;保留
MOVDS,AX;保留
MOVAX,01H
MULTAX10
;填入内容
MOVAX,4C00H;保留
INT21H;保留
CODEENDS;保留
ENDSTART;保留
编译源文件“SY6_1.asm”生成可执行文件“DebugSY6_1.exe”
SY6_1.ini文件内容:
u0,1E
d2867:
0,1f
g=0,14
d2867:
0,1f
q
SY6_1.bat文件内容:
Debugsy6_1.exe>sy6_1.txt
执行SY6_1.bat文件后可以获得SY6_1.txt文件;
SY6_1.txt文件内容:
-u0,1E
2867:
0000B86328MOVAX,2863
2867:
00038ED8MOVDS,AX
2867:
0005B80100MOVAX,0001
2867:
000853PUSHBX
2867:
0009D1E0SHLAX,1
2867:
000B8BD8MOVBX,AX
2867:
000DD1E0SHLAX,1
2867:
000FD1E0SHLAX,1
2867:
001103C3ADDAX,BX
2867:
00135BPOPBX
2867:
0014CD21INT21
2867:
001622CBANDCL,BL
2867:
001840INCAX
2867:
0019AFSCASW
2867:
001A21CBANDBX,CX
2867:
001C40INCAX
2867:
001DAFSCASW
2867:
001E21CBANDBX,CX
-d2867:
0,1f
2867:
0000B863288ED8B80100-53D1E08BD8D1E0D1.c(.....S.......
2867:
0010E003C35BCD2122CB-40AF21CB40AF21CB...[.!
".@.!
.@.!
.
-g=0,14
AX=000ABX=0000CX=0056DX=0000SP=0040BP=0000SI=0000DI=0000
DS=2863ES=2853SS=2863CS=2867IP=0014NVUPEIPLNZNAPENC
2867:
0014CD21INT21
-d2867:
0,1f
2867:
0000B863288ED8B80100-53D1E08BD8D1E0D1.c(.....S.......
2867:
0010E003C35BCD2122CB-40AF21CB40AF21CB...[.!
".@.!
.@.!
.
-q
显然,上面忠实地记录了内存的情况并且展示了实验结果。
这是我做的第一个汇编程序,领悟很深刻,把编写汇编程序的流程拉了一遍,熟悉了一些汇编命令,对以后编写更大的汇编程序奠定了基础。
实验2:
2、编写一个将两个存储单元(字或字节)的内容相互交换的宏EXCHANGE,并编制一个程序SY6_2.ASM调用EXCHANGE,且调试运行,验证其功能的实现情况;
源文件SY6_2.asm文件内容:
.286;保留
EXCHANGEMACROMEM1,MEM2,REG
MOVREG,MEM1
XCHGREG,MEM2
MOVMEM1,REG
ENDM
DATASEGMENT;保留
;填入内容
DA_W1DW1234H
DA_W2DW5678H
DATAENDS;保留
STACK1SEGMENTPARASTACK;保留
DW20HDUP(0);保留
STACK1ENDS;保留
CODESEGMENT;保留
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1;保留
START:
MOVAX,DATA;保留
MOVDS,AX;保留
EXCHANGEDA_W1,DA_W2,CX
;填入内容
MOVAX,4C00H;保留
INT21H;保留
CODEENDS;保留
ENDSTART;保留
编译源文件“SY6_2.asm”生成可执行文件“DebugSY6_2.exe”
SY6_1.ini文件内容:
u0,1E
d2868:
0,1f
g=0,1F
d2868:
0,1f
q
SY6_2.bat文件内容:
debugSY6_2.exe>SY6_2.txt
执行SY6_2.bat文件后可以获得SY6_2.txt文件;
SY6_2.txt文件内容:
-u0,1E
2868:
0000B86328MOVAX,2863
2868:
00038ED8MOVDS,AX
2868:
00058B0E0000MOVCX,[0000]
2868:
0009870E0200XCHGCX,[0002]
2868:
000D890E0000MOV[0000],CX
2868:
00110000ADD[BX+SI],AL
2868:
00130000ADD[BX+SI],AL
2868:
00150000ADD[BX+SI],AL
2868:
00170000ADD[BX+SI],AL
2868:
00190000ADD[BX+SI],AL
2868:
001B0000ADD[BX+SI],AL
2868:
001D0000ADD[BX+SI],AL
-d2868:
0,1f
2868:
0000B863288ED88B0E00-00870E0200890E00.c(.............
2868:
00100000000000000000-0000000000000000................
-g=0,1F
AX=2863BX=0000CX=5678DX=0000SP=0040BP=0000SI=0000DI=0000
DS=2863ES=2853SS=2864CS=2868IP=001FNVUPEIPLNZNAPECY
2868:
001F0000ADD[BX+SI],ALDS:
0000=2D
-d2868:
0,1f
2868:
0000B863288ED88B0E00-00870E0200890E00.c(.............
2868:
00100000000000000000-0000000000000000................
-q
显然,上面忠实地记录了内存的情况并且展示了实验结果。
领悟很深刻,把编写汇编程序的流程拉了一遍,熟悉了一些汇编命令,对以后编写更大的汇编程序奠定了基础。
实验3:
3、编制一个调用宏MULTAX10和EXCHANGE的程序SY6_3.ASM,且调试运行,验证其功能的实现;
源文件SY6_3.asm文件内容:
.286;保留
MULTAX10MACRO
PUSHBX
SALAX,1
MOVBX,AX
SALAX,1
SALAX,1
ADDAX,BX
POPBX
ENDM
EXCHANGEMACROMEM1,MEM2,REG
MOVREG,MEM1
XCHGREG,MEM2
MOVMEM1,REG
ENDM
DATASEGMENT;保留
;填入内容
DA_W1DW1234H
DA_W2DW5678H
DATAENDS;保留
STACK1SEGMENTPARASTACK;保留
DW20HDUP(0);保留
STACK1ENDS;保留
CODESEGMENT;保留
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1;保留
START:
MOVAX,DATA;保留
MOVDS,AX;保留
MOVAX,01H
MULTAX10
EXCHANGEDA_W1,DA_W2,CX
;填入内容
MOVAX,4C00H;保留
INT21H;保留
CODEENDS;保留
ENDSTART;保留
编译源文件“SY6_3.asm”生成可执行文件“DebugSY6_3.exe”
SY6_3.ini文件内容:
u0,1C
d2868:
0,1f
g=0,14
d2868:
0,1f
q
SY6_3.bat文件内容:
debugSY6_3.exe>SY6_3.txt
执行SY6_3.bat文件后可以获得SY6_3.txt文件;
SY6_3.txt文件内容:
-u0,1C
2868:
0000B86328MOVAX,2863
2868:
00038ED8MOVDS,AX
2868:
0005B80100MOVAX,0001
2868:
000853PUSHBX
2868:
0009D1E0SHLAX,1
2868:
000B8BD8MOVBX,AX
2868:
000DD1E0SHLAX,1
2868:
000FD1E0SHLAX,1
2868:
001103C3ADDAX,BX
2868:
00135BPOPBX
2868:
00148B0E0000MOVCX,[0000]
2868:
0018870E0200XCHGCX,[0002]
2868:
001C890E0000MOV[0000],CX
-d2868:
0,1f
2868:
0000B863288ED8B80100-53D1E08BD8D1E0D1.c(.....S.......
2868:
0010E003C35B8B0E0000-870E0200890E0000...[............
-g=0,14
AX=000ABX=0000CX=0070DX=0000SP=0040BP=0000SI=0000DI=0000
DS=2863ES=2853SS=2864CS=2868IP=0014NVUPEIPLNZNAPENC
2868:
00148B0E0000MOVCX,[0000]DS:
0000=1234
-d2868:
0,1f
2868:
0000B863288ED8B80100-53D1E08BD8D1E0D1.c(.....S.......
2868:
0010E003C35B8B0E0000-870E0200890E0000...[............
-q
显然,上面忠实地记录了内存的情况并且展示了实验结果。
这是我前两个汇编程序综合后的结果,领悟很深刻。
实验4:
4、利用宏操作符“&”编写“能够将某寄存器或存储单元R_M,进行由DIRECT指定的逻辑或算术左/右移位,移位次数由COUNT确定的宏SHIFT_VAR,并编制一个程序SY6_4.ASM调用SHIFT_VAR,且调试运行,验证其功能的实现情况;
源文件SY6_4.asm文件内容:
.286;保留
SHIFTMACROR_M,DIRECT,COUNT
MOVCL,COUNT
S&DIRECTR_M,CL
ENDM
DATASEGMENT;保留
;填入内容
DA_BYTEDB0FH
DATAENDS;保留
STACK1SEGMENTPARASTACK;保留
DW20HDUP(0);保留
STACK1ENDS;保留
CODESEGMENT;保留
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1;保留
START:
MOVAX,DATA;保留
MOVDS,AX;保留
MOVAX,0FH
SHIFTAX,HL,2;AX逻辑左移2位
SHIFTDA_BYTE,AR,3;DA_BYTE单元算术右移3位
;填入内容
MOVAX,4C00H;保留
INT21H;保留
CODEENDS;保留
ENDSTART;保留
编译源文件“SY6_4.asm”生成可执行文件“DebugSY6_4.exe”
SY6_4.ini文件内容:
u0,1E
d2868:
0,1F
g=0,14
d2868:
0,1F
q
SY6_4.bat文件内容:
debugSY6_4.exe>SY6_4.txt
执行SY6_4.bat文件后可以获得SY6_4.txt文件;
SY6_4.txt文件内容:
-u0,1E
2868:
0000B86328MOVAX,2863
2868:
00038ED8MOVDS,AX
2868:
0005B80F00MOVAX,000F
2868:
0008B102MOVCL,02
2868:
000AD3E0SHLAX,CL
2868:
000CB103MOVCL,03
2868:
000ED23E0000SARBYTEPTR[0000],CL
2868:
00120000ADD[BX+SI],AL
2868:
00140000ADD[BX+SI],AL
2868:
00160000ADD[BX+SI],AL
2868:
00180000ADD[BX+SI],AL
2868:
001A0000ADD[BX+SI],AL
2868:
001C0000ADD[BX+SI],AL
2868:
001E0000ADD[BX+SI],AL
-d2868:
0,1F
2868:
0000B863288ED8B80F00-B102D3E0B103D23E.c(............>
2868:
00100000000000000000-0000000000000000................
-g=0,14
AX=003CBX=0000CX=0003DX=0000SP=0040BP=0000SI=0000DI=0000
DS=2863ES=2853SS=2864CS=2868IP=0014NVUPEIPLNZNAPONC
2868:
00140000ADD[BX+SI],ALDS:
0000=3D
-d2868:
0,1F
2868:
0000B863288ED8B80F00-B102D3E0B103D23E.c(............>
2868:
00100000000000000000-0000000000000000................
-q
显然,上面忠实地记录了内存的情况并且展示了实验结果。
写汇编程序一定要仔细,有一个地方不对运行结果就出错,而且不会像我们在高级语言中会给出出错的提示,所以就得更加细心。
实验5
5、利用伪指令“LOCAL”编写“能够将某寄存器或存储单元R1_M1中的数值(作为被乘数),与另一个寄存器或存储单元R2_M2中的数值(作为乘数)相乘,乘积存入内存中存储单元M3中;要求定义的宏“MULTIP”能够在同一个程序中,被连续两次或两次以上的调用。
并编制一个程序SY6_5.ASM两次调用MULTIP,且调试运行,验证其功能的实现情况;
源文件SY6_5.asm文件内容:
.286;保留
MULTIPMACROMULT1,MULT2,MULT3
LOCALLOP,EXIT0
MOVDX,MULT1
MOVCX,MULT2
XORBX,BX
XORAX,AX
JCXZEXIT0
LOP:
ADDBX,DX
ADCAX,0
LOOPLOP
EXIT0:
MOVMULT3,BX
MOVMULT3+2,AX
ENDM
DATASEGMENT;保留
;填入内容
DA1DW1234H,5678H
DA2DW1200H,0ABCDH
DA3DW4DUP(0)
DATAENDS;保留
STACK1SEGMENTPARASTACK;保留
DW20HDUP(0);保留
STACK1ENDS;保留
CODESEGMENT;保留
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1;保留
START:
MOVAX,DATA;保留
MOVDS,AX;保留
MULTIPDA1,DA2,DA3;第一次宏调用
MULTIPDA1+2,DA2+2,DA3+4;第二次宏调用
;填入内容
MOVAX,4C00H;保留
INT21H;保留
CODEENDS;保留
ENDSTART;保留
编译源文件“SY6_5.asm”生成可执行文件“DebugSY6_5.exe”
SY6_5.ini文件内容:
u0,1E
d2868:
0,1F
g=0,1E
d2868:
0,1F
q
SY6_5.bat文件内容:
debugSY6_5.exe>SY6_5.txt
执行SY6_5.bat文件后可以获得SY6_5.txt文件;
SY6_5.txt文件内容:
-u0,1E
2868:
0000B86328MOVAX,2863
2868:
00038ED8MOVDS,AX
2868:
00058B160000MOVDX,[0000]
2868:
00098B0E0400MOVCX,[0004]
2868:
000D33DBXORBX,BX
2868:
000F33C0XORAX,AX
2868:
0011E307JCXZ001A
2868:
001303DAADDBX,DX
2868:
0015150000ADCAX,0000
2868:
0018E2F9LOOP0013
2868:
001A891E0800MOV[0008],BX
2868:
001EA30A00MOV[000A],AX
-d2868:
0,1F
2868:
0000B863288ED88B1600-008B0E040033DB33.c(..........3.3
2868:
0010C0E30703DA150000-E2F9891E0800A30A................
-g=0,1E
AX=0147BX=A800CX=0000DX=1234SP=0040BP=0000SI=0000DI=0000
DS=2863ES=2853SS=2864CS=2868IP=001ENVUPEIPLNZNAPENC
2868:
001EA30A00MOV[000A],AXDS:
000A=0000
-d2868:
0,1F
2868:
0000B863288ED88B1600-008B0E040033DB33.c(..........3.3
2868:
0010C0E30703DA150000-E2F9891E0800A30A................
-q
显然,上面忠实地记录了内存的情况并且展示了实验结果。
这是我做的第一个使用两次宏调用的汇编程序,对LOCAL命令有了深刻的理解,对以后编写更大的汇编程序奠定了基础。
实验6:
6、将上面所定义的“宏”,做成一个“宏库”文件,定义为:
MACROLIB.MAC,并用MACROLIB.MAC改写SY6_1.ASM,SY6_2.ASM,SY6_3.ASM,SY6_4.ASM和SY6_5.ASM,从新调试运行程序,验证所调用宏的功能实现情况,以及宏库“MACROLIB.MAC”的作用。
源文件MACROLIB.MAC文件内容:
.286;保留
MULTAX10MACRO
PUSHBX
SALAX,1
MOVBX,AX
SALAX,1
SALAX,1
ADDAX,BX
POPBX
ENDM
EXCHANGEMACROMEM1,MEM2,REG
MOVREG,MEM1
XCHGREG,MEM2
MOVMEM1,REG
ENDM
MULTAX10MACRO
PUSHBX
SALAX,1
MOVBX,AX
SALAX