汇编2.docx
《汇编2.docx》由会员分享,可在线阅读,更多相关《汇编2.docx(6页珍藏版)》请在冰豆网上搜索。
![汇编2.docx](https://file1.bdocx.com/fileroot1/2023-1/28/4fee9af9-addf-459f-a5da-40bfd2a5d39b/4fee9af9-addf-459f-a5da-40bfd2a5d39b1.gif)
汇编2
汇编语言程序设计
实验三汇编语言程序调试运行
学号:
姓名:
(1)将下面的数据段输入,取名为1.asm,保存在MASM文件夹下,生成.lst文件,不必连接运行,查看1.lst文件,试回答:
DA1,DA2的偏移量分别为多少?
COUNT的值为多少?
datasegment
org20h
num1=8
num2=num1+10h
da1db'IBMPC'
da2db0ah,0dh
countequ$-da1
dataends
end
(2)输入下列指令,改正可能的错误(先不要运行程序):
datasegment
var1db0,25,0dh,300
var2db12h,a4h,6bh
var3db'ABCDEF'
var4dw1234h,5678h
var5dw10hdup(?
)
dataends
codesegment
assumecs:
code,de:
data
beginmovax,data
movds,ax
leasi,var5
movbx,offsetvar2
mov[si],0abh
movax,var1+2
mov[bx],[si]
movvar5+4,var4
movah,4ch
int21h
codeends
endstart
(3)写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AGUEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG中的SUM中。
其中AUGEND,ADDEND,SUM均为dw类型,AUGEND赋值为9251,ADDEND赋值为-5962。
实验报告中要求写出源程序,简单叙述上机步骤,调试方法。
调试步骤(详见书P146~153)
1.编辑源程序,建立一个以后缀为.asm的文件.
2.汇编源程序,编译:
c:
\MASM5\masmxxxx.asm检查程序有否错误,有错时回到编辑状态,修改程序中错误行。
无错时继续第3步。
3.连接目标程序,产生可执行程序。
连接:
c:
\MASM5\linkxxxx.obj
4.运行:
c:
\MASM5\xxxx..exe
5.调试:
c:
\winnt\system32\debugxxxx.exe
1)先用命令U反汇编整个程序,查看每条指令的物理地址,其显示内容的含义为:
内存地址指令代码反汇编的程序代码
-u0B75:
00001EPUSHDS
2)再用-t命令单步执行,检查各个寄存器的值变化情况
6.DEBUG调试可执行程序,记录数据段和附加段的内容。
(4)数组中是一组无符号数,将最小数放在M单元中,经过汇编后,形成.EXE文件,先用G=0命令执行程序,用-D命令查看M单元的内容,会发现结果不正确。
用单步执行命令T查找程序中的逻辑错误。
DSEGSEGMENT
MSGDB13,15,7,25,24
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,4
MOVAL,MSG
MOVSI,OFFSETMSG+1
L1:
CMPAL,[SI]
JBNEXT
MOVAL,[SI]
NEXT:
LOOPL1
MOVM,AL
MOVAX,4C00H
INT21H
CSEGENDS
ENDSTART
(5)试编制一个汇编语言程序,求出首地址为DATA的10个无符号字数组中的最小偶数,把它存放在AX中。
画出程序框图,写出源程序清单和执行结果。
Dataword0141H,0AE00H,07B4H,0A508H,0691H,
word0870H,7542H,0081H,0916H,0017H
(6)有10个数,统计正数的个数,存放在变量M中。
经过汇编后,形成.EXE文件,先用G=0命令执行程序,用-D命令查看M单元的内容,会发现结果不正确。
用单步执行命令T查找程序中的逻辑错误,注意每一次循环中AL寄存器中的值变化是否正确(AL寄存器中存放正数的个数)
DSEGSEGMENT
MSGDB4,-2,-6,0,5,67,8,-3,5,6
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,10
MOVAL,0
LEASI,MSG
L1:
MOVBL,[SI]
CMPBL,0
JBENEXT
INCAL
NEXT:
INCSI
LOOPL1
MOVM,AL
MOVAX,4C00H
INT21H
CSEGENDS
ENDSTART
(7)假设有一组数据:
5,-4,0,3,100,-51请编一程序,判断:
每个数大于0,等于0,还是小于0;并将最终结果存于以result为存储的字节单元中,(ResultDB6dup(?
))
即:
1当x>0
y=0当x=0
-1当x<0
编程提示:
1.首先将原始数据装入起始地址为XX的字节存储单元中。
2.其中判断部分可采用CMP指令,得到一个分支结构,分别输出“y=0”,“y=1”,“y=-1”。
将结果存入result的相应单元
3.程序中存在一个循环结构,循环6次,调用6次分支结构后结束。
(8)数据段中的三个字符,调用子程序将其逐个显示出来。
子程序的功能是显示一个字符。
单步执行,观察SP、IP的变化,并用D命令查看栈顶的内容。
DATASEGMENT
MAGDB'ABC'
DATAENDS
STACK_SEGSEGMENT
DB100DUP(?
)
TOSLABELWORD
STACK_SEGENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK_SEG
START:
MOVAX,STACK_SEG
MOVSS,AX
MOVSP,OFFSETTOS
MOVAX,DATA
MOVDS,AX
MOVSI,0
MOVCX,3
LL:
MOVDL,MAG[SI]
CALLMADD
INCSI
LOOPLL
MOVAx,4C00H
INT21H
MADDPROC
MOVAH,02H
INT21H
RET
MADDENDP
CODEENDS
ENDSTART
(9)将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元,如二进制数10010011转换成字符串为‘10010011’。
要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8位和16位二进制数的转换。
(用寄存器或变量实现参数传递)
测试数据:
Var8bitbyte10010011B
Var16bitword1010001111000100B
显示单元:
Show8bitbyte8dup(?
)
Show16bitbyte16dup(?
)
(10)将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元,如二进制数10010011转换成字符串为‘10010011’。
要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8位和16位二进制数的转换。
(用堆栈实现传参:
可以选择用子过程来平衡堆栈,也可以用调用过程来实现平衡堆栈,程序功能说明中要指出)
测试数据:
Var8bitbyte10010011B
Var16bitword1010001111000100B
显示单元:
Show8bitbyte8dup(?
)
Show16bitbyte16dup(?
)
实验报告要求:
1.程序说明。
说明程序的功能、结构。
2.调试说明。
包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。
3.写出源程序清单和执行结果。