疯狂暑期学习  汇编入门学习笔记 (六)—— si、di,双重循环

參考: 《汇编语言》 王爽 第7章

1. and和or指令,与[bx+idata]

and和or。就不多说了。

[bx+idata] 这样写是能够的,某些情况下,比較方便。

[bx+idata] 也能够写成 idata[bx]

直接见样例: 把’ABcde‘ 跟 ‘fGHig’ 都改成大写(ASCII中大写字母与小写字母二进制中。仅仅有第五位不同,大写字母是0,小写字母是1)

assume cs:code,ds:data 

data segment
db 'ABcde'
db 'fGHIg'
data ends code segment start: mov ax,data
mov ds,ax mov bx,0
mov cx,4
mov al,00100000b
s: or [bx],al
or [5+bx],al ;[5+bx]也能够写成5[bx]
inc bx
loop s mov ax,4c00H
int 21H code ends end start

2. si,di,与[bx+si],[bx+di],[bx+si+idata],[bx+di+idata]

si与di,除了不能像bx一样分成bh。bl。其它与bx一样。

如 mov ax,[si] 等等

[bx+si],[bx+di],[bx+si+idata],[bx+idata]

这些都是能够的,某些情况下。比較方便。

当中[bx+si]与[bx+di] 能够写成 [bx][si],[bx][di]

[bx+si+idata],[bx+di+idata] 能够写成idata[bx][si],idata[bx][di]

样例:复制Welcome!

assume cs:code,ds:data

data segment
db 'Welcome! '
data ends code segment
start: mov ax,data
mov ds,ax mov si,0
mov cx,4
s: mov ax,[si]
mov 8[si],ax
add si,2
loop s mov ax,4c00H
int 21H
code ends end start

样例:将data中的单词的首字母改成大写

assume cs:code,ds:data

data segment
db '1.file '
db '2.edit '
db '3.search'
db '4.view '
data ends code segment
start: mov ax,data
mov ds,ax mov bx,0
mov cx,4
mov al,11011111b
s: and [bx+2],al
add bx,8
loop s mov ax,4c00H
int 21H code ends end start

3. 双重循环

样例:data中单词改成大写的

assume cs:code,ds:data

data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends code segment
start: mov ax,data
mov ds,ax mov bx,0
mov al,11011111b
mov cx,4
s: mov cx,3
mov si,0
s0: and [bx+si],al
inc si
loop s0 add bx,8
loop s mov ax,4c00H
int 21H code ends end start

上面
的代码。是错误的会出现是死循环。由于cx不断的被赋予3。导致外层循环死循环。

改进,在进行内层循环时把cx保存起来,内存循环结束时,恢复cx。

样例:

assume cs:code,ds:data

data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends code segment
start: mov ax,data
mov ds,ax mov bx,0
mov al,11011111b
mov cx,4
s: mov dx,cx ;dx用来暂时存放外层的cx的值
mov cx,3
mov si,0
s0: and [bx+si],al
inc si
loop s0
mov cx,dx ;用来回复外层循环的cx
add bx,8
loop s mov ax,4c00H
int 21H code ends end start

上面的代码,尽管能解决上面问题,能正常执行。

可是寄存器的数量有限,有时。可能没有其它的寄存器能够用。

解决方法,保存在内存中。

样例:

assume cs:code,ds:data

data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
dw 0 ;定义一个字,用来保存cx
data ends code segment
start: mov ax,data
mov ds,ax mov bx,0
mov al,11011111b
mov cx,4
s: mov ds:[20H],cx
mov cx,3
mov si,0
s0: and [bx+si],al
inc si
loop s0
mov cx,ds:[20H]
add bx,8
loop s mov ax,4c00H
int 21H code ends end start

上面的代码,攻克了寄存器不够的情况。可是,还是比較复杂。假设有非常多循环,就会弄不清楚。

解决方法,使用栈来保存恢复cx。

样例1:

assume cs:code,ds:data,ss:stack

data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends stack segment
dw 0,0,0,0,0,0,0,0
stack ends code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16 mov bx,0
mov al,11011111b
mov cx,4
s: push cx
mov cx,3
mov si,0
s0: and [bx+si],al
inc si
loop s0 pop cx
add bx,8
loop s mov ax,4c00H
int 21H code ends end start

样例2:把data中的单词,前3个字母改成大写

assume cs:code,ds:data,ss:stack

data segment
db '1.display.......'
db '2.brows.........'
db '3.replace.......'
db '4.modify........'
data ends stack segment
dw 0,0,0,0,0,0,0,0
stack ends code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16 mov bx,0
mov al,11011111b
mov cx,4
s: push cx
mov si,0
mov cx,3
s0: and [bx+si+2],al
inc si
loop s0 pop cx
add bx,10H
loop s mov ax,4c00H
int 21H code ends end start

获取编译学习笔记 (六)—— si、di,双环的更多相关文章

  1. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

  4. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  5. Java IO学习笔记六:NIO到多路复用

    作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  8. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  9. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

随机推荐

  1. spring获取bean 实例

    ApplicationContext ctx = new ClassPathXmlApplication("applicationContext.xml"); DataSource ...

  2. 【Dev Club 分享】腾讯验证码的十二年

    源:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653578147&idx=3&sn=94a8f8f8b4a23 ...

  3. win32用GDI+加载png图片作为背景图

    #include <windows.h> #include <gdiplus.h> /* GDI+ startup token */ ULONG_PTR gdiplusStar ...

  4. J2EE开发框架搭建(2) - springmvc4 + spring4 + hibernate4 整合

    1. 打开hqhop-framework-parent项目下的pom.xml文件.加入springmvc4 , spring4 , hibernate4 ,以及数据源druid的依赖包,插件,依赖包版 ...

  5. oracle实现远程连接超简单;枚举与剪枝();PowerDesigner生成数据库代码注意里面的双引號,应该去掉

    点击開始,查看netManager,点击面板的监听程序,默认仅仅有地址1且标记着localhost.新建一个地址,输入本机IP,又一次开启监听程序就可以 △△△ * △△ = △△△△ 某3位数乘以2 ...

  6. ThinkPhp学习06

    原文:ThinkPhp学习06 一.简单学习修改用户信息模块 1.编写UserAction.class.php <?php class UserAction extends Action{ pu ...

  7. 【MFC两种视频图像採集方法】DirectShow与Opencv

    效果图: DirectShow採集核心代码: 创建线程调用该函数,採集图像通过x264解码封装rtmp协议包.推送至FMSserver,可实现视频直播 UINT __stdcall StartVide ...

  8. VS2008下OpenCV1.0的设置

    原地址:http://hi.baidu.com/caicai_coco/item/0f3b23e1742e3f11595dd825 1.下载安装最新的OpenCV版本,我使用的是OpenCV_1.0. ...

  9. git/github初级运用自如 (转)

    三 . 设置用户信息 这一步不是很重要,貌似不设置也行,但github官方步骤中有,所以这里也提一下. 在git中设置用户名,邮箱 $ git config --global user.name &q ...

  10. OCA读书笔记(16) - 执行数据库恢复

    16. Performing Database Recovery 确定执行恢复的必要性访问不同接口(EM以及命令行)描述和使用可用选项,如RMAN和Data Recovery Advisor执行恢复- ...