疯狂暑期学习  汇编入门学习笔记 (六)—— 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. 屏幕对象的F1/F4输入帮助功能

    1.HELP-REQUST[FOR{LOW|HIGH}]字段的F1帮助 当选择SAP屏幕功能的制定字段按F1键时可以调关注用自定义的程序或者系统帮助文件,该功能通常称为F1帮助. TYPES:syst ...

  2. clear、REFRESH、free区别

    clear可以清楚一个工作区或变量.但是如果该内表是带表头的,清空内表时需要在该内表后加[].例如:clear gt_tab[]. free可以清空带表头的内表但是不会清空这个带表头内表的表头,但是也 ...

  3. 积累的VC编程小技巧之编辑框

    1.如何让对话框中的编辑框接收对话框的消息 ////////////////////////////////////////////////// 如何让对话框中的CEdit控件类接收对话框的消息/// ...

  4. 【Demo 0006】iOS常用控件

    本章学习要点       1.  了解iOS中控件继承关系:       2.  掌握UIControl基础知识;       3.  掌握UIButton基本用法:       4.  掌握UILa ...

  5. 6.0RMB MP3所看到的……

    产品篇:          偶然看到这个商品信息,作为电子开发人员,首先想到的便是采用了哪家芯片方案,怎么做到这么低的价格!     于是立刻买了一台回来,拆机如下:          成本BOM: ...

  6. [置顶] 简单解析linux下进程通信方法

    linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...

  7. Android 服务类Service 的具体学习

    上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们能够在无形 ...

  8. 很具体GC学习笔记

    GC学习笔记 这是我公司同事的GC学习笔记,写得蛮具体的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...

  9. JQuery 事件与动画

    第一大部分 提纲 事件与动画 一.事件 1.在JavaScript语法中的事件,把onxxxxx中的on去掉,就是JQuery中的事件. onclick - click ondblclick - db ...

  10. css中的hover ,关于li与a标签的问题

    <head> <style> ul li a:hover{ background-color: red; } </style></head><ul ...