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

发布者:RainbowPromise最新更新时间:2016-06-24 来源: eefocus关键字:汇编入门  双重循环 手机看文章 扫描二维码
随时随地手机看文章
疯狂的暑假学习之  汇编入门学习笔记 (六)—— si、di,双重循环

 

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

 

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

 

and和or,就不多说了。

[bx+idata] 这样写是可以的,某些情况下,比较方便。

[bx+idata] 也可以写成 idata[bx]

 

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

 

  1. assume cs:code,ds:data   
  2.   
  3. data segment  
  4.     db 'ABcde'  
  5.     db 'fGHIg'  
  6. data ends   
  7.   
  8. code segment  
  9.   
  10. start:  mov ax,data  
  11.     mov ds,ax  
  12.           
  13.     mov bx,0  
  14.     mov cx,4  
  15.     mov al,00100000b  
  16. s:  or [bx],al  
  17.     or [5+bx],al ;[5+bx]也可以写成5[bx]  
  18.     inc bx  
  19.     loop s  
  20.           
  21.           
  22.     mov ax,4c00H  
  23.     int 21H  
  24.   
  25. code ends  
  26.   
  27. 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!

 

  1. assume cs:code,ds:data  
  2.   
  3. data segment  
  4.     db 'Welcome!        '  
  5. data ends  
  6.   
  7. code segment  
  8.     start:  mov ax,data  
  9.         mov ds,ax  
  10.       
  11.         mov si,0  
  12.         mov cx,4  
  13.     s:  mov ax,[si]  
  14.         mov 8[si],ax  
  15.         add si,2  
  16.         loop s  
  17.               
  18.         mov ax,4c00H  
  19.         int 21H  
  20. code ends  
  21.   
  22. end start  

 

 

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

 

  1. assume cs:code,ds:data  
  2.   
  3. data segment  
  4.     db '1.file  '  
  5.     db '2.edit  '  
  6.     db '3.search'  
  7.     db '4.view  '  
  8. data ends  
  9.   
  10. code segment  
  11.     start:  mov ax,data  
  12.         mov ds,ax  
  13.               
  14.         mov bx,0  
  15.         mov cx,4  
  16.         mov al,11011111b  
  17.     s:  and [bx+2],al  
  18.         add bx,8  
  19.         loop s  
  20.               
  21.         mov ax,4c00H  
  22.         int 21H  
  23.               
  24.               
  25. code ends  
  26.   
  27. end start  



 

 

3. 双重循环

 

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

 

  1. assume cs:code,ds:data  
  2.   
  3. data segment  
  4.     db 'ibm     '  
  5.     db 'dec     '  
  6.     db 'dos     '  
  7.     db 'vax     '  
  8. data ends  
  9.   
  10. code segment  
  11.     start:  mov ax,data  
  12.         mov ds,ax  
  13.               
  14.         mov bx,0  
  15.         mov al,11011111b  
  16.         mov cx,4  
  17.     s:  mov cx,3  
  18.         mov si,0  
  19.     s0: and [bx+si],al  
  20.         inc si  
  21.         loop s0  
  22.           
  23.         add bx,8  
  24.         loop s  
  25.               
  26.         mov ax,4c00H  
  27.         int 21H  
  28.               
  29. code ends  
  30.   
  31. end start  

 

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

  1. assume cs:code,ds:data  
  2.   
  3. data segment  
  4.     db 'ibm     '  
  5.     db 'dec     '  
  6.     db 'dos     '  
  7.     db 'vax     '  
  8. data ends  
  9.   
  10. code segment  
  11.     start:  mov ax,data  
  12.         mov ds,ax  
  13.               
  14.         mov bx,0  
  15.         mov al,11011111b  
  16.         mov cx,4  
  17.     s:  mov dx,cx  ;dx用来临时存放外层的cx的值  
  18.         mov cx,3  
  19.         mov si,0  
  20.     s0: and [bx+si],al  
  21.         inc si  
  22.         loop s0  
  23.         mov cx,dx   ;用来回复外层循环的cx  
  24.         add bx,8  
  25.         loop s  
  26.               
  27.         mov ax,4c00H  
  28.         int 21H  
  29.               
  30. code ends  
  31.   
  32. end start  

 

上面的代码,虽然能解决上面问题,能正常运行。但是寄存器的数量有限,有时,可能没有其他的寄存器可以用。

解决方法,保存在内存中。例子:

 

  1. assume cs:code,ds:data  
  2.   
  3. data segment  
  4.     db 'ibm     '  
  5.     db 'dec     '  
  6.     db 'dos     '  
  7.     db 'vax     '  
  8.     dw 0    ;定义一个字,用来保存cx  
  9. data ends  
  10.   
  11. code segment  
  12.     start:  mov ax,data  
  13.         mov ds,ax  
  14.               
  15.         mov bx,0  
  16.         mov al,11011111b  
  17.         mov cx,4  
  18.     s:  mov ds:[20H],cx    
  19.         mov cx,3  
  20.         mov si,0  
  21.     s0: and [bx+si],al  
  22.         inc si  
  23.         loop s0  
  24.         mov cx,ds:[20H]   
  25.         add bx,8  
  26.         loop s  
  27.               
  28.         mov ax,4c00H  
  29.         int 21H  
  30.               
  31. code ends  
  32.   
  33. end start  

 

上面的代码,解决了寄存器不够的情况。但是,还是比较复杂,如果有很多循环,就会弄不清楚。

解决方法,使用栈来保存恢复cx。例子1:

 

  1. assume cs:code,ds:data,ss:stack  
  2.   
  3. data segment  
  4.     db 'ibm     '  
  5.     db 'dec     '  
  6.     db 'dos     '  
  7.     db 'vax     '  
  8. data ends  
  9.   
  10. stack segment  
  11.     dw 0,0,0,0,0,0,0,0  
  12. stack ends  
  13.   
  14. code segment  
  15.     start:  mov ax,data  
  16.         mov ds,ax  
  17.         mov ax,stack  
  18.         mov ss,ax  
  19.         mov sp,16  
  20.               
  21.         mov bx,0  
  22.         mov al,11011111b  
  23.         mov cx,4  
  24.     s:  push cx  
  25.         mov cx,3  
  26.         mov si,0  
  27.     s0: and [bx+si],al  
  28.         inc si  
  29.         loop s0  
  30.               
  31.         pop cx  
  32.         add bx,8  
  33.         loop s  
  34.               
  35.         mov ax,4c00H  
  36.         int 21H  
  37.               
  38. code ends  
  39.   
  40. end start  

 

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

  1. assume cs:code,ds:data,ss:stack  
  2.   
  3. data segment  
  4.     db '1.display.......'  
  5.     db '2.brows.........'  
  6.     db '3.replace.......'  
  7.     db '4.modify........'  
  8. data ends  
  9.   
  10. stack segment  
  11.     dw 0,0,0,0,0,0,0,0  
  12. stack ends  
  13.   
  14. code segment  
  15.     start:  mov ax,data  
  16.         mov ds,ax  
  17.         mov ax,stack  
  18.         mov ss,ax  
  19.         mov sp,16  
  20.                   
  21.         mov bx,0  
  22.         mov al,11011111b  
  23.         mov cx,4  
  24.     s:  push cx  
  25.         mov si,0  
  26.         mov cx,3  
  27.     s0: and [bx+si+2],al  
  28.         inc si  
  29.         loop s0  
  30.           
  31.         pop cx  
  32.         add bx,10H  
  33.         loop s  
  34.               
  35.         mov ax,4c00H  
  36.         int 21H  
  37.           
  38. code ends  
  39.   
  40. end start  

关键字:汇编入门  双重循环 引用地址:汇编入门学习笔记 (六)—— si、di,双重循环

上一篇:汇编入门学习笔记 (七)—— dp,div,dup
下一篇:汇编入门学习笔记 (五)—— 包含多个段的程序

推荐阅读最新更新时间:2024-03-16 14:58

局部放电检测难度大,FLIR Si124让你安全准确检测
在电力系统中,高压电力设备为电力的运行以及稳定性提供了极大保障,在供电企业中有着重中之重的影响。但值得注意的是,高压电气设备在具有种种优势的同时,也存在着很多危险。比如,高压电气设备的局部放电现象。 传统检测频次不足,问题难发现 多年来,电力公司一直对高压电气设备执行局部放电(PD)测量。局部放电是绝缘劣化的一个衡量指标,绝缘劣化会导致设备故障,甚至更严重的灾难性事件。利用传统的超声解决方案,检测系统通常又大又笨重,并且通常需要专业声学工程师对检测报告进行分析。所以,可能造成电力公司检测频次不足,使得像电机、发电机、开关装置和变压器等设备很容易出现局部放电等相关问题。
[测试测量]
局部放电检测难度大,FLIR <font color='red'>Si</font>124让你安全准确检测
入门级ARM汇编指令
无论是体系结构还是指令集,大家或多或少都应该对X86汇编有些了解,而对于嵌入式领域已被广泛采用的ARM 处理器,了解的可能并不多。如果你有兴趣从事嵌入式方面的开发,那么了解一些RISC 体系结构和ARM汇编的知识还是有必要的。这里,我们找出了这两种体系结构最明显的不同之处,并对此进行介绍,让大家对于RISC体系结构的汇编有一个基本的了解。首先,我们就来看一看基于RISC的ARM的体系结构。 基于RISC 的ARM CPU ARM是一种RISC体系结构的处理器芯片。和传统的CISC体系结构不同,RISC 有以下的几个特点: ◆ 简洁的指令集 为了保证CPU可以在高时钟频率下单周期执行指令,RISC指令集只提供很有限的操作(例如add,
[单片机]
<font color='red'>入门</font>级ARM<font color='red'>汇编</font>指令
AZZURRO成功实现150mm(6吋)晶圆GaN-on-Si制造 可显著降低LED成本
  AZZURRO半导体成立于2003年,具有专利的大直径硅基板氮化镓(GaN-on-Si)技术,该技术源自德国Magdeburg大学,在2010年10月获得包括 Wellington Partners、Good Energies和Emerald等4家创投业者共1,500万欧元的资金投入后,已正式在德烈斯登(Dresden)设立公司与产能,开始投入量产。 AZZURRO目前有2台MOCVD(有机金属化学气相沉积法)机台,将于2011年10月完成量产设置,预计能达到每月1,400片150mm(6吋)晶圆的出货量。未来仍将持续扩充产能,规划2013年达到每月1万片晶圆,以及2015年达到2.7万片晶圆的产能。 注:运用AZZURR
[新能源]
基于PMM8731和SI-7300的步进电机驱动电路
摘要:PMM8731是日本三洋电机公司生产的步进电机脉冲分配器。而SI-7300则是日本三青公司生产的高性能步进电机集成功率放大器。它们和单片机一起可构成一种高效电机控制驱动电路。文中介绍了PMM8713与SI-7300的功能,给出了由它们组成的功率驱动电路及其在步进电机上的应用方法。 关键词:PMM8731;SI-7300;步进电机;功率驱动电路 1 PMM8713的功能特点 PMM8713是日本三洋电机公司生产的步进电机脉冲分配器。该器件采用DIP16封装,适用于二相或四相步进电机。PMM8713在控制二相或四相步进电机时都可选择三种励磁方式(1相励磁,2相励磁,1-2相励磁三种励磁方式之一),每相最小的拉电流和
[应用]
Silicon Labs利用软件定义无线电技术 提升广受欢迎的Si479xx汽车调谐器系列产品
中国,北京 - 2019年7月30日 - Silicon Labs (亦称“芯科科技”,NASDAQ:SLAB)为领先的汽车收音机解决方案供应商,日前宣布推出新型数模混合一体化软件定义无线电(SDR)调谐器,扩展其产品组合使得单个通用平台上能支持全球所有数字收音机标准以满足汽车收音机制造商不断增长的需求。新型Si479x7器件是 Silicon Labs 首款支持Digital Radio Mondiale(DRM)标准的汽车收音机调谐器。Si479x7调谐器是 Silicon Labs 广受欢迎的Global Eagle和Dual Eagle AM/FM接收器和数字收音机调谐器系列产品的扩展,提供同样出色的路试性能、单双调试器
[汽车电子]
Silicon Labs利用软件定义无线电技术 提升广受欢迎的<font color='red'>Si</font>479xx汽车调谐器系列产品
PCB SI介绍
目前用户最需要是一个时序分析和SI结合一体工具,而且界面要优化,设置要简单,同时需要包括Design KIT。ICX Tau如果能够象Quantum-SI一样性能得到改进,那么将会受到用户欢迎。由于Mentor具有设计前端和后端,ICX+Tau优势是其它工具无法取代。 时序问题是关键问题,目前设计者基本上采用核心芯片厂家现成方案,因此设计中主要一部分工作是如何保证PCB能够符合芯片工作要求时序。,目前国内用户基本没有掌握时序问题。少数SQ用户会采用Excel表来编制时序要求,后期把从SQ中测量出参数手工填写到Excel表中去计算是否最终设计符合时序要求。无论是原理图设计者和PCB布线设计者都很难从芯片数据单中读懂时序。时序问题
[模拟电子]
Si整流器与SiC二极管:谁与争锋
在当今的电气设备中,功率半导体和电抗式元件(电容和电感)随处可见。它们在正常工作过程中会在为其供电的交流电线上产生两种不希望出现的副作用。   首先,这些器件会引起较小的功率因数。其次,它们会使线电流失真,引起电噪声或者产生与线电压之间的相位偏移。   功率因数是指实际使用的功率与交流线上产生的视在功率二者的比值。电气设备中如果存在大电容或者电感就会导致视在功率大于实际使用的功率,出现较小的功率因数。   功率因数越小,在为设备供电的交流导线上损耗的电能就越多。如果设备中的功率半导体开关操作非常频繁,那么这种开关操作就会引起交流线电流的失真和噪声。在开关电源中尤其如此。   某些国际标准(例如IEC61000-3-2)针对各
[电源管理]
<font color='red'>Si</font>整流器与SiC二极管:谁与争锋
Mouser备货Vishay Siliconix的Si8802 TrenchFET®功率MOSFET
2012年11月19日 – Mouser Electronics, Inc.正在备货Vishay Siliconix的第一款MOSFET产品,其额定导通电阻低至1.2V并采用了业界最小尺寸的芯片级封装。 Vishay Siliconix的Si8802 TrenchFet®功率MOSFET是第一款额定导通电阻低至1.2V的N沟道器件,采用尺寸最小的0.8mm x 0.8mm芯片级封装——Vishay的MICRO FOOT®。 8V、N沟道的Si8802与尺寸第二小的芯片级器件相比可节省高达36%的电路板空间,而其导通电阻却仍然相近——甚至更低。 对于需要P沟道器件的设计,Vishay的Si8805是业界第一款P沟道功率MO
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved