获取编译学习笔记 (六)—— si、di,双环
疯狂暑期学习 汇编入门学习笔记 (六)—— 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,双环的更多相关文章
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
随机推荐
- 屏幕对象的F1/F4输入帮助功能
1.HELP-REQUST[FOR{LOW|HIGH}]字段的F1帮助 当选择SAP屏幕功能的制定字段按F1键时可以调关注用自定义的程序或者系统帮助文件,该功能通常称为F1帮助. TYPES:syst ...
- clear、REFRESH、free区别
clear可以清楚一个工作区或变量.但是如果该内表是带表头的,清空内表时需要在该内表后加[].例如:clear gt_tab[]. free可以清空带表头的内表但是不会清空这个带表头内表的表头,但是也 ...
- 积累的VC编程小技巧之编辑框
1.如何让对话框中的编辑框接收对话框的消息 ////////////////////////////////////////////////// 如何让对话框中的CEdit控件类接收对话框的消息/// ...
- 【Demo 0006】iOS常用控件
本章学习要点 1. 了解iOS中控件继承关系: 2. 掌握UIControl基础知识; 3. 掌握UIButton基本用法: 4. 掌握UILa ...
- 6.0RMB MP3所看到的……
产品篇: 偶然看到这个商品信息,作为电子开发人员,首先想到的便是采用了哪家芯片方案,怎么做到这么低的价格! 于是立刻买了一台回来,拆机如下: 成本BOM: ...
- [置顶] 简单解析linux下进程通信方法
linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...
- Android 服务类Service 的具体学习
上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们能够在无形 ...
- 很具体GC学习笔记
GC学习笔记 这是我公司同事的GC学习笔记,写得蛮具体的,由浅入深,循序渐进,让人一看就懂,特转到这里. 一.GC特性以及各种GC的选择 1.垃圾回收器的特性 2.对垃圾回收器的选择 2.1 连续 V ...
- JQuery 事件与动画
第一大部分 提纲 事件与动画 一.事件 1.在JavaScript语法中的事件,把onxxxxx中的on去掉,就是JQuery中的事件. onclick - click ondblclick - db ...
- css中的hover ,关于li与a标签的问题
<head> <style> ul li a:hover{ background-color: red; } </style></head><ul ...