疯狂暑期学习  汇编入门学习笔记 (六)—— 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. oracle系统包——dbms_random用法及order by 小结(转)

    dbms_random是一个可以生成随机数值或者字符串的程序包. 这个包有initialize().seed().terminate().value().normal().random().strin ...

  2. MySQL 存储过程例子,不能在if else里面用begin end否则会报错Error Code : 1064!

    Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your My ...

  3. AMR音频编码器概述及文件格式分析

    全称Adaptive Multi-Rate,自适应多速率编码,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的. 一.分类 1. AMR: ...

  4. SVM入门(十)将SVM用于多类分类

    源地址:http://www.blogjava.net/zhenandaci/archive/2009/03/26/262113.html 从 SVM的那几张图可以看出来,SVM是一种典型的两类分类器 ...

  5. ROOT android 原则。 基于(zergRush)

    从: http://bbs.gfan.com/android-2996211-1-1.html 须要ROOT的同学请去上面的地址下载. a.控制手机创建个暂时目录,然后把zergRush脚本写入此目录 ...

  6. THashMD5,THashSHA1,THashBobJenkins,TIdHashMessageDigest5的用法

    [delphi] view plain copy unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils ...

  7. oschina图形和图像工具开源软件

    图形和图像工具开源软件 http://www.oschina.net/project/tag/181/imagetools?sort=view&lang=21&os=0

  8. <Win32_14>__win32控件(2)__教你自学掌握所有控件的玩法

    学习win32 API 编程,我们应该善于利用微软给我们提供的一些辅助工具,例如大家都知道的MSDN.SPY++等等. 今天在讲述之前呢,先给大家介绍一个很有用的工具——Control Spy——它的 ...

  9. Android开发5:布局管理器2(表格布局TableLayout)

    版本:Android4.3 API18  学习整理:liuxinming 概念      TableLayout继承了LinearLayout,因此它的本质依然是线性布局管理器.      表格布局采 ...

  10. OC对象创建过程

    在利用OC开发应用程序中,须要大量创建对象,那么它的过程是什么呢? 比方:NSArray *array = [[NSArrayalloc] init]; 在说明之前,先把OC的Class描写叙述一下: ...