实验4 —— [bx]和loop的使用
实验
- 综合使用
loop、[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续 16 个字单元重复填充字数据0403H。
以下为示例程序:
assume cs:code # 1
code segment # 2
mov ax, 0b800h # 3 ; 数据必须以数字开头,要在字母前补 0
mov ds, ax # 4
mov cx, 16 # 5 ; 设置循环次数为 16
mov bx, 07b8h # 6
# 7
S: mov [bx], word ptr 0403h # 8 ; 将字数据 0403h 送向偏移地址
inc bx # 9 ; 字数据占 2 个内存单元 bx 自增两次
inc bx # 10
loop s # 11
# 12
mov ax, 4c00h # 13
int 21h # 14
code ends # 15
end # 16
编译、连接和运行结果如下图所示:

将源代码程序中字数据
0403H修改为0441H,再次运行的结果如下:
结论与实验 3 是一致的,
b8000开始的一块内存与显示有关,且修改的字数据的前两位和颜色有关,后两位是字符的 ASCII 码值。
- 综合使用
loop、[bx],编写完整汇编源程序,实现向内存0:200到0:23F依次传送数据0到63(3FH)。
使用
loop,[bx],mov实现- 以下为示例程序:
assume cs:code # 1
code segment # 2
mov ax, 0020h # 3
mov ds, ax # 4
mov cx, 64 # 5 ; 设置循环次数为 64
mov bx, 0 # 6
# 7
S: mov [bx], bl # 8 ; 将字节数据送向偏移地址
inc bx # 10
loop s # 11
# 12
mov ax, 4c00h # 13
int 21h # 14
code ends # 15
end # 16
- 编译、连接如下图所示:

- 用
g命令执行程序,并用d命令显示内存中的内容,如下图所示:

结果很明显。还有,这里因为数据不大于 255 所以传送字节数据。
还可以利用栈的特性,使用
loop和push实现- 以下为示例程序:
assume cs:code # 1
code segment # 2
mov ax, 0020h # 3
mov ss, ax # 4 ; 根据之前的实验得,在修改 ss 时一并执行
mov sp, 0040h # 5 ; 下一条指令,下一条指令一般是修改 sp 的值
mov bx, 3f3eh # 6 ; 由于栈是对字数据操作,不得不将 2 个内存
# 7 ; 单元的值一起写入 16 位寄存器
mov cx, 32 # 8 ; 对字数据操作,循环 32 次
# 9
s: push bx # 10 ; 压栈时栈顶指针上移 2 个单位 (sp - 2)
sub bl, 2 # 11
sub bh, 2 # 12
loop s # 13
# 14
mov ax, 4c00h # 15
int 21h # 16
code ends # 17
end # 18
- 编译、连接如下图所示:

- 重复上次实验的操作,如下图所示:

根据压栈的特性,需要先压入高地址单元的内存,所以是按从
3f到0的顺序压入。
- 下面的程序的功能是将
mov ax, 4c00h之前的指令复制到内存0:200处,补全程序并调试。
assume cs:code # 1
code segment # 2
mov ax, __ # 3
mov ds, ax # 4
mov ax, 0020h # 5
mov es, ax # 6
mov bx, 0 # 7
mov cx, __ # 8
# 9
s: mov al, [bx] # 10
mov es:[bx], al # 11
inc bx # 12
loop s # 13
# 14
mov ax, 4c00h # 15
int 21h # 16
code ends # 17
end # 18
指令执行是因为 cs:ip 指向了它,cs 就是指令的段地址,我们只需要把指令的段地址交给数据段就能直接通过 [bx] 来获取内存中的内容了。所以 # 3 行的空格填 cs。
由于不确定指令占用多少字节,现在将 cx 的值设为 0 并编译、连接,如下图所示:

使用 debug 中的 u 命令反汇编,查看指令占用了多少内存,如下图所示:

可见 mov ax, 4c00h 之前的命令占用 1e87:0000 到 1e87:0015 共 17h 个字节。
由此可得,共循环 17h 次,因此 # 8 行的空格填 17h,并将 cx 的值设置为 17h,重新编译、连接和反汇编,如下图所示:

确认无误后,使用 g 命令运行,并使用 d 命令查看结果,如下图所示:

可见已成功将 mov ax, 4c00h 之前的指令复制到指定内存。
尾巴
这次没有什么好说的,那就简单说一下在实验时可能遇到的问题:
debug中的mov ax, [0]与程序中的mov ax, [0]是不同的,程序中的会被编译器当作mov ax, 0, 解决方法有两种mov bx, 0 mov ax, [bx]或者是mov ax, ds:[0]。- 程序中所有数据不能以字母开头,如果是字母开头的 16 进制数,需要在前面补 0。
- 栈只能对字数据进行操作,有时需要对操作数据做一些转换。
实验4 —— [bx]和loop的使用的更多相关文章
- 实验4 [BX]和loop指令
实验内容: 1.综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据0441H. 实验结果: 若填充的数据为:0403h,则实验结果转变为: ...
- 【实验四】[bx]和loop的使用
四.实验结论 任务一: (1) ①当我写 mov ax,b800h时,编译报错了. ②清屏后运行 (2)将源代码程序中字数据0403H→修改为0441H,再次运行,图案发生了变化. 任务二: (1) ...
- 汇编语言_实验四_[bx]和loop的使用
四.实验结论 1. 实验内容1 (1)源代码: assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov c ...
- 汇编语言-[BX]和loop指令
汇编语言-[BX]和loop指令 [BX]指令介绍 mov ax,[bx] 功能: bx为偏移地址,段地址默认为ds.因此,上面指令作用就是将ax中的数据送入内存ds:bx处,即:((ds)*16 + ...
- 汇编学习笔记(3)[bx]和loop
本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...
- [汇编学习笔记][第五章[BX]和loop指令]
第五章[BX]和loop指令 前言 定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如: (ax)表示ax中的内容,(al)表示al的内容. 约定符号ideta表示常量. 5.1 [BX ...
- 80806汇编(5)——[BX]和Loop指令
80806汇编(5)--[BX]和Loop指令 已经好久没写点东西了,国庆节就一直想弄个个人网站,这段时间一直在弄那个,虽然有现成的框架(Hexo),但是总想弄出自己的效果来,但是最后还是有些差强人意 ...
- 小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令
这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀. 1.[BX]的概念 [BX]和[0]类似 ...
- 王爽汇编第五章,[bx]和loop指令
目录 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 例子: 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 [bx]之前我们介绍寄存器的时候,已经很详细的说明过了,b ...
随机推荐
- Nginx功能介绍
Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的. 从2004年发布至今,凭借开元的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也可作 ...
- Cache中间件和缓存降级
Cache中间件和缓存降级 1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版A ...
- 【部分补充】【翻译转载】【官方教程】Asp.Net MVC4入门指南(4):添加一个模型
4. 添加一个模型 · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-mo ...
- webpack.config.js====CSS相关:css和scss配置loader
1. 安装: //loader加载器加载css和sass模块 cnpm install style-loader css-loader node-sass sass-loader --save-dev ...
- Java基础语法(Eclipse)
Java基础语法 今日内容介绍 u Eclipse开发工具 u 超市库存管理系统 第1章 Eclipse开发工具 Eclipse是功能强大Java集成开发工具.它可以极大地提升我们的开发效率.可以自动 ...
- Intellij idea 创建JAVA项目
1. 打开软件,new一个project的java项目 2. 点击下一步,此界面可通过模板生成项目,如下图 3. 填写项目名称和项目源码的保存路径,如下图 4. 点击 Finish 完成按钮即可,项目 ...
- 关于ECSHOP中sql注入漏洞修复
标签:ecshop sql注入漏洞修复 公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程 ...
- 【javascript类库】zepto和jquery的md5加密插件
[javascript类库]zepto和jquery的md5加密插件 相信很多人对jQuery并不陌生,这款封装良好的插件被很多开发者使用. zepto可以说是jQuery在移动端的替代产品,它比jQ ...
- 一键部署Drupal开源内容管理系统
https://market.azure.cn/Vhd/Show?vhdId=10897&version=12950 产品详情 产品介绍Drupal是一个由Dries Buytaert创立的自 ...
- iOS 学习随记 (一)
入行IT也已经很多年了,厌倦了Windows平台的工作, 4月初突然抽风买了台Mac就开始决定转身做iOS/OS X下的App开发了. 从适应Mac机器到开始编程没有花费太长时间,也因为有C#和Jav ...