汇编实验肆 [bx]和loop的使用

南京信息工程大学实验报告

实验名称   实验 4 [bx]和loop的使用

实验日期      11.25

得分

学院   计软院

专业   计科

年级   2017级

班次   6班级

姓名   江轲禹

学号   20171308227

一、实验目的

1. 理解和掌握寄存器间接寻址方式[bx] 2. 通过汇编指令loop的使用理解编程语言中循环的本质 3. 熟练掌握使用debug按需调试完整汇编源程序的方法

二、实验准备

1. 学习/复习第 5章使用[bx]和loop实现循环的编程应用示例(教材 5.5节,5.8节) 2. 复习第3章「栈」的知识 3. 结合第4章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法

三、实验内容

1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H。 2. 综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH)。 (1)必做:综合使用loop, [bx], mov实现 (2)选做*:利用栈的特性,综合使用 loop,push 实现(限定仅使用 8086 中已学过 指令实现) 3. 教材实验4(3)(P121)

提示: Tips1: 实验内容 1 和 2 本质上是一类问题,都是把数据送到一组连续的内存单元。不 同之处仅在于,实验内容1是将一个常数(字 .数据) ,送到指定的一组连续的字 .单元;而实 验内容 2是将一组连续的字节 ..数据,送到指定的连续的字节 ..单元。在程序中改变偏移地址时, 要注意做不同的处理。 其中,实验内容1如正确编写了程序,其运行结果应当如下图所示:

Tips2: 实验内容 2,如果利用栈实现,借助 push和loop实现连续入栈操作。但要注意: ① 8086的入栈操作,是从高地址单元→低地址单元方向的; ② 8086的入栈操作,只能以字为单元。但这里是字节数据,如何灵活处理? Tips3: 实验内容 3,本质仍然是复制,只不过复制的是自身代码。这道填空的关键是, 如何确定复制多少字节。 Tips4:细节问题,如十六进制/十进制、循环次数、指令合法用法及其注意事项等。

四、实验结论

1. 实验内容1

(1)源代码

(2)将源代码程序中字数据0403H→修改为0441H,再次运行,截图显示运行结果。

代码:

assume cs:code

code segment

mov ax,0b800h

mov ds,ax

mov ax,0403h

mov bx,07b8h

mov cx,16

s:mov [bx],ax

inc bx

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end

实验结果:输入指令,经过一系列的编译和链接,可以得到结果一排红心

代码:

assume cs:code

code segment

mov ax,0b800h

mov ds,ax

mov ax,0441h

mov bx,07b8h

mov cx,16

s:mov [bx],ax

inc bx

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end

实验结果:将mov ax,0403h改为mov ax,0441h,经过一系列的编译和链接,可以得到结果一排红色大写A

分析: 04应该是控制红色的字符,对应地03控制的是红心,41控制的是红色大写A;

2. 实验内容2(必做部分)

(1)源代码

(2)汇编、连结无误后,灵活使用 debug 的 t 命令、g 命令、p 命令调试,用 d 命令 查看0:200~0:23F,确认是否将0~63传送至此段内存区域。这部分,要求有截图。

(选做部分,如完成,也按上述要求在博客文档中撰写相应内容)

代码:

assume cs:code

code segment

mov ax,0h

mov ds,ax

mov cx,63

mov bx,200h

mov ax,0

s:mov [bx],ax

add ax,1

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end

实验结果:输入指令,经过一系列的编译和链接,执行后,却没有任何输出

分析:利用debug环境进行调试:

(1)在debug中运行loop2.exe档并查看当前各个寄存器中的值;

(2)利用u命令对076a:0 001a进行精确反汇编;

(3)利用g命令执行到mov ax,4c00h之前;

(4)利用t命令单部执行;碰到int改用p命令

屏幕上最后输出Programe terminated?normally

为什么会输出Programe?terminated?normally?通过查阅相关资料,了解到,这是因为在指令中没有设置断点,或设置的断点程序在执行中未能到达断点处,这时程序将一直运行,直到结束。

利用g命令执行到int 21h之前,得到以下结果:

由此说明,寄存器cx的值没有发生任何改变

3. 实验内容3

(1)源代码

(2)汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200 之后的若干字节,观察是否将mov ax, 4c00h之前的指令复制到指定内存,这部分要求有截 图,并以文字方式说明空白处填写依据。

根据实验任务2,进行反汇编可以得知"mov ax,4c00h"之前的机器码的存储位置是076a:0~076a:0014,现在需要将之前的指令复制到内存0:200处,只需要将076a:0~076a:0014这段内存中的机器码复制到一0:200开始的内存空间即可。

(1)当前偏移地址为076a,所以将数据传入段寄存器CS中;

(2)由于此段内存空间有14个字节单元,所以执行14次循环;

代码:

assume cs:code

code segment

mov ax,076ah

mov ds,ax

mov ax,0020h

mov es,ax

mov bx,0

mov cx,14

s:mov al,[bx]

mov es:[bx],al

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end

实验结果:输入指令,经过一系列的编译和链接,执行后,输出Required parameter missing。。。(缺少必要参数)?

分析:输出Required parameter missing 的原因是什么?

利用debug环境进行调试

运行copy.exe并查看当前各个寄存器的值并利用u命令进行精确反汇编

利用g命令执行到mov ax,4c00之前

利用t命令和p命令执行

最后用d命令查看0:200之后的内容;

可以看出我们已经将数据存入了0:200开始的内存

五、总结与体会

1)了解了loop和[bx]的使用,利用 [bx]和loop可以直接进行循环,方便了很多。

2)灵活使用debug命令查看寄存器的值和u命令对程序段进行精确反汇编。

原文地址:https://www.cnblogs.com/jiangkeyu/p/10017433.html

时间: 2024-10-05 21:48:40

汇编实验肆 [bx]和loop的使用的相关文章

实验 4 [bx]和 loop 的使用

一.实验目的 1. 理解和掌握寄存器间接寻址方式[bx] 2.  通过汇编指令 loop 的使用理解编程语言中循环的本质 3.  熟练掌握使用 debug 按需调试完整汇编源程序的方法 二.实验准备 1. 学习/复习第 5 章使用[bx]和 loop 实现循环的编程应用示例(教材 5.5 节,5.8 节) 2.  复习第 3 章「栈」的知识 3.  结合第 4 章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法 三.实验内容 1.  综合使用 loop,[bx],编写完整汇编程序,实现

实验 四 [bx]和loop的使用

1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H. 代码  assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov cx,16 s:mov [bx],0403h add bx,2 loop s mov ax ,4c00h int 21hcode endsend 2. 综合使用 loop,[bx],编写完整汇编源程序,实现向内存

实验四 [bx]和 loop 的使用

一: 1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据 0403H. 代码如下: assume cs:code code segment mov ax,0b800h mov ds,ax mov cx,16 mov bx,07b8H mov ax,0403h s: mov [bx],al inc bx mov [bx],ah inc bx loop s mov ax,4c00h int 21h code ends en

实验 4 [bx]和loop的使用

一.实验结论 1.实验内容1 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H. (1)代码如下: assume cs:codecode segment mov ax,0b800h     mov ds,ax     mov ax,0403h     mov bx,07b8h     mov cx,16s:mov [bx],ax  inc bx  inc bx  loop s  mov ax,4c00h  int

实验4 [bx]和loop的使用

1. 综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8 开始的连续16 个 字单元重复填充字数据0403H. 在Masm集成环境中写入代码保存为1116.asm文件如下: 编译运行生成如下文件: 成功运行得到如下结果: 用debug调试查看b800:0728后的16个字单元的内容,成功改写,截图如下: 将数据0403h改写成0441h,编译运行得到如下截图: 结论:观察到改变填充内容,输出字符形状产生了变化,且是根据各数值对应的ASCII码及相应形状而发生改变. 通过改

实验四 [bx]和loop的使用

1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H. 代码如下: 对他进行连接执行,出现了红心. 2. 综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH). 写出程序,执行用d命令查看 3. 教材实验4(3)(P121) 使用r命令显示寄存器状态,显示程序所占字节数 cx=001c; 使用u命令,求出需要复制的机器码的字节数 001cH-00

实验四 [BX]和loop指令

一.练习1 编写完整汇编源程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0430h. 源程序如下: 运行结果如下: 二.练习2 综合使用loop和[bx],编写完整汇编源程序,实现向内存0:200~0:23f依次传送数据0~63(3FH). 源程序代码如下: assume cs:code code segment mov ax,00020h mov ds,ax mov bx,0 mov cx,64 s: mov [bx],bx inc bx loop s mov ax,4

汇编入门学习笔记 (四)—— [BX] 和 loop指令

疯狂的暑假学习之  汇编入门学习笔记 (四)-- [BX]  和 loop指令 参考:<汇编语言> 王爽 第5章 1.[BX] mov al,[1] 在debug中,会把bs:1 中数据赋给al,但在在masm中不会把bs:1 中数据赋给al,而是把 [1] 认为是 1 赋给al. 如果要实现在debug中的mov al,[1],在masm中就需要[bx] 如: mov bx,1 mov al,[bx] 还可以用 bs:[1] 的方式 如: mov al,bs:[1] 2.loop 循环 要使

汇编实验课程设计1之设置时间半成品

;    感觉双休就想睡觉,这鬼天气,一直下雨.设置时间未完成,只是加了一个所谓的主界面;   display system time. press f1 to change the color displayed, press esc to return main list. f3 exit;    clear_screen 清空屏幕assume cs:codesgstacksg segment    dw 128 dup(0)stacksg endscodesg segment