贺利坚老师汇编课程37笔记:运用栈加两层循环之把六个字符串里的字母都改写成大写字母
- 指路老师的博客
- 题目如下,编程加个datasg段中每个单词改写为大写字母
- 4个字符串,看成4行16列的二维数组
- 要修改二维数组的每一行的前3列
- 构造4 X 3 次二重循环
- [BX+SI]方式,基址BX代表每一行的起始地址,变址寄存器SI代表每一列
R = 第一行地址;
mov cx,4;循环4次
s0:C=第一列的地址
mov cx,3
s:改变R行,C列字母为大写
C = 下一列的地址;
loop s;
R = 下一行的地址
loop s0
- 代码如下,产生疑惑,当结束内层s的循环后,跳出来时CX的值为多少,尝试用另外一个寄存器DX,会导致IBM后面的数发生变化
assume cs:codesg,ds:datasg
datasg segmentdb 'ibm ';db 'dec ';db 'dos ';db 'vsx ';
datasg endscodesg segment
start:mov ax,datasgmov ds,axmov bx,0mov cx,4s0:mov si,0mov cx,3s:mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop sadd bx,16loop s0mov ax,4c00Hint 21H
codesg ends
end start
- 单步调试没问题
- 仔细看还是有问题CX的值变为FFFFH是个负数
- 解决方案一:把外层循环CX的值保存在DX
assume cs:codesg,ds:datasg
datasg segmentdb 'ibm ';db 'dec ';db 'dos ';db 'vsx ';
datasg endscodesg segment
start:mov ax,datasgmov ds,axmov bx,0mov cx,4s0:MOV DX,CX;将外层循环的CX值保存在DX中mov si,0mov cx,3;CX设置为内存循环的次数s:mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop sadd bx,16MOV CX,DX;用DX中存放的外层循环的计数值恢复CXloop s0;loop s0时CX赋值为CX-1mov ax,4c00Hint 21H
codesg ends
end start
- 方案一也有问题,如果DX已经被用了,别的寄存器也被用了,寄存器总共只有14个
- 解决方案二:用固定内存空间保存数据
- 方法三:用栈保存数据,因为不提倡在程序直接指定某一个内存单元,容易内存单元被其他数据覆盖
assume cs:codesg,ds:datasg,ss:stacksg
datasg segmentdb 'ibm ';db 'dec ';db 'dos ';db 'vsx ';
datasg endsstacksg segmentdw 0,0,0,0,0,0,0,0
stacksg endscodesg segment
start:mov ax,stacksgmov ss,axmov sp,16mov ax,datasgmov ds,axmov bx,0mov cx,4s0:push cx;将外层循环的CX值压栈mov si,0mov cx,3;CX设置为内存循环的次数s:mov al,[bx+si]and al,11011111bmov [bx+si],alinc siloop sadd bx,16pop cx;从栈定弹出原CX的值,恢复CXloop s0mov ax,4c00Hint 21H
codesg ends
end start
- 提倡运用栈的第三种做法
贺利坚老师汇编课程37笔记:运用栈加两层循环之把六个字符串里的字母都改写成大写字母相关推荐
- 贺利坚老师汇编课程37笔记:把六个字符串里的头一个字母改写成大写字母
指路老师的博客 将datasg段中每个单词的头一个字母改写成大写字母,共六个字符串 像是某个软件的菜单 assume cs:codesg,ds:datasg datasg segmentdb '1. ...
- 贺利坚老师汇编课程18笔记:栈的操作SS:SP
课时18:栈与栈操作的实现 课件:实现功能交换两个数 代码 mov ax,1000H mov ss,ax mov sp,0010H mov ax,001AH mov bx,001BHpush ax p ...
- 贺利坚老师汇编课程36笔记:[BX+SI+IDATA]和[BX+DI+IDATA]寻址
指路老师的博客 [BX+SI+IDATA]表示一个内存单元,偏移地址(BX)+(SI)+IDATA,BX中数值加SI中数值加IDATA立即数,段地址DS 往内存里写数 21000H BE 210001 ...
- 贺利坚老师汇编课程32笔记:处理字符串——大小写转换通过与和或运算加减20H
指路老师博客 20H = 10 0000B b 62H 0110 0010B B 42H 0100 0010B 第一个字符串:小写字母转换为大写字母 小写转大写,通过与运算,0对应位上无论是多少相与是 ...
- 贺利坚老师汇编课程40笔记:指令里的数据在哪里有多长
指路老师的博客 汇编中数据位置的表达 立即数 寄存器 内存:段地址SA+偏移地址EA 指令处理数据长度 字操作WORD16位 字节操作BYTE8位 用word ptr或byte ptr指明 示例 操作 ...
- 贺利坚老师汇编课程28笔记:使用附加段寄存器ES进行拷贝
指路老师的博客链接 将内存FFFF:0 ~ FFFF:B中的数据拷贝到0:200~0:20b单元中 段地址每循环一次变一次的初始方案 ;初始方案 ASSUME CS:CODE CODE SEGMENT ...
- 贺利坚老师汇编课程73笔记:键盘输入的处理过程
指路老师的博客 键盘的每一个键相当于一个开关,键盘中有一个芯片对键盘的每一个键的开关状态进行扫描 按下一个键的操作 开关接通,该芯片就产生了一个扫描码,扫描码说明按下的键在键盘的位置 扫描码被送入主板 ...
- 贺利坚老师汇编课程70笔记:端口的读写
指路老师的博客 端口对应外部设备 发声程序 assume cs:codecode segment start:mov al,08h;设置声音频率out 42h,alout 42h,alin al,61 ...
- 贺利坚老师汇编课程66笔记:自定义除法中断学习如何编制中断程序
指路老师的博客 CPU随时可能检测中断信息,所以中断程序常驻内存(一直存储在内存的某段空间中) 中断处理程序的入口地址,即中断向量,必须存储在中断向量表的表项中 (0000:0000 - 0000:0 ...
最新文章
- 使用pycharm调试Python代码时F8快捷键失效
- 常用 SQL Server 规范集锦
- C ++ STL中的set :: upper_bound()函数
- 软件构建设计图_游戏设计如何帮助您构建更好的软件
- mysql jndi 实例_自己收藏-JNDI应用实例
- 如何设置 Excel 文件打印时刚好是一页的宽度?让打印范围刚好是一页纸
- Java widget xui_XUI使用总结
- Unity3d开发wp8问题汇总
- 2.9Unicode 文本标准化
- 学生计算机教室怎么连接网络,计算机(网络)教室学生使用守则
- oracle 字符串中数字转中文大写,金额钱数转中文大写
- 强化学习之AC系列算法(AC、A2C、A3C)
- 微信jssdk签名生成代码示例PHP版本
- WPF补充(二) 资源(Resource)
- 2019C语言课程设计
- ansible aws_如何使用Ansible管理您的AWS资源
- prepay id为空php,微信公众号支付踩坑笔记
- usb网卡在linux上能直接用吗,关于usb网卡如何在红旗linux6.0上使用的问题
- 杭州市拥北发展是否是最优解,拥江发展处于何种地位
- 正则表达式前瞻(?=)、后顾(?)、负前缀(?!)、负后顾(?!)
热门文章
- python字典嵌套循环_python使用for循环更新嵌套字典值
- 【Mybatis】maven配置pom.xml时找不到依赖项(已解决)
- 【深度优先搜索】牛客网:剪绳子
- python中pass的使用_pass语句如何在Python项目中使用
- jquery validate表单校验
- Tomcat设置session超时的几种方式
- ECharts力导向布局图增加滚动条
- 关于Windows系统中一些实用的修改常识
- oracle怎么使用包,oracle包(package)入门——应用实例
- java 访问器_网络之美 JavaScript中Get和Set访问器的实现代码