获取编译学习笔记 (六)—— 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区域图像 ...
随机推荐
- sap的示例代码
sap的示例代码查看1.在SE38环境下的程序名输入栏输入'DEMO*'后按F4,你可以查到SAP所有的DEMO示例程序,好好看看,你会学到很多ABAP功能的实现方法.2.运行“ABAPDOCU”T- ...
- javacsript (十) 数据类型
类型声明的时候,直接使用 var varname=xxx 数字.字符.布尔,声明都直接使用var就可以, JavaScript 数组 下面的代码创建名为 cars 的数组: var cars=new ...
- MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录
MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录 MySQL内存表(MEMORY)说明
- 仿ios版微信应用源代码
仿微信基本功能. 基于XMPPserver的即时通信以及交友client. ----第一期代码的功能例如以下---- 1.新用户注冊 2.登陆并连接XMPPserver 握手 保持 ...
- Swift - 使用表格组件(UITableView)实现分组列表
1,样例说明: (1)列表以分组的形式展示 (2)同时还自定义分区的头部和尾部 (3)点击列表项会弹出消息框显示该项信息. 2,效果图: 3,代码如下: 1 2 3 4 5 6 7 8 9 ...
- CentOS 如何修改mysql 用户root的密码
源地址:http://blog.sina.com.cn/s/blog_6756f85201019zv7.html 第一步:用帐号登录mysql[root@CentOs5 ~]# mysql -u ro ...
- 模仿《百度音乐HD》添加到下载框动画
上次听有人说喜欢<百度音乐HD>添加到下载动画 ,我就尝试模仿了下,没想到,今天code4app(地址)也有了这个,但是 这个动画基本相同,我们的思路还是部一样的. 都可以参考 .主要关键 ...
- 基于飞思卡尔i.MX 6Quad Sabrelite开发板的触摸屏调试
1 概述 本次任务是在飞思卡尔i.MX 6Quqd Sabrelite开发板上调试触屏驱动,触屏芯片是Goodix的gt828芯片,触屏接口是I2C. 操作系统:android 4.0.4 ...
- CodeForces 13E. Holes 分块处理
正解是动态树,太难了,仅仅好分块处理水之.看了看status大概慢了一倍之多.. 分块算法大体就是在找一个折衷点,使得查询和改动的时间复杂度都不算太高,均为o(sqrt(n)),所以总的时间复 ...
- ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码
我怎么有二维码没有联系,最近遇到一个问题,,如何推断条码扫描到一维代码或者二维代码,辛苦了一个下午下班后自己,加上网上跟踪信息. 总结出两种方式能够解决该问题(推荐採用另外一种方式): 1.改动源代码 ...