x86汇编--(五)定位内存+栈的巧妙应用 温故知新
2016-04-04 11:27
204 查看
之前都是靠ds:[bx]或者[bx]来直接定位内存的
之后知道了SI和DI这两个寄存器,这样定位内存的方法就更加灵活了
SI和DI是与bx功能差不多只是不能像BX一样拆分成bl和bh
同时,还有这样的方式:mov ax,ds:[bx+idata]
idata是一个数,可以自己来定,这种用法在程序中是否有用,如下
下面是嵌套的循环,不过程序执行有问题,就是debug发现无限循环
debug就会知道:
(1)内循环退出,CX的值是0
(2)执行外面的loop s0,CX-1。由于CX之前变0了,CX-1变为0XFFFF,
(3)进入内循环,又执行(1)
无限循环bug - -
------------------------------栈是个好东西-----------------------------------------
上面的程序bug通过栈暂存cx来解决,如下:
0 0 栈太巧妙了,实际上各种编程语言都是这样的机制来调用函数吖、进行循环吖之类的(づ ̄ 3 ̄)づ
以后多用栈啊( •̀ ω •́ )y
之后知道了SI和DI这两个寄存器,这样定位内存的方法就更加灵活了
SI和DI是与bx功能差不多只是不能像BX一样拆分成bl和bh
同时,还有这样的方式:mov ax,ds:[bx+idata]
idata是一个数,可以自己来定,这种用法在程序中是否有用,如下
assume cs:codesg,ds:datasg datasg segment db 'Basic' db 'Linux' datasg ends codesg segment start: mov ax,datasg mov ds,ax mov bx,0 mov cx,5 s: mov al,ds:[bx] mov ah,ds:[bx+5] or al,00100000b ;转换为小写 and ah,11011111b ;转换为大写 mov ds:[bx],al mov ds:[bx+5],ah add bx,1 loop s mov ax,4c00h int 21h codesg ends end start
下面是嵌套的循环,不过程序执行有问题,就是debug发现无限循环
assume cs:codesg,ds:datasg datasg segment db 'acfil ' db 'acfil ' db 'acsea ' db 'acopt ' datasg ends codesg segment start: mov ax,datasg mov ds,ax mov bx,0 mov cx,4 s0: mov si,0 ;si定位列 mov cx,3 s: mov al,[bx+si] and al,11011111b ;小写变大写 mov [bx+si],al ;覆盖原来的小写 inc si loop s ;bx定位行 add bx,16 loop s0 mov ax,4c00h int 21h codesg ends end start
debug就会知道:
(1)内循环退出,CX的值是0
(2)执行外面的loop s0,CX-1。由于CX之前变0了,CX-1变为0XFFFF,
(3)进入内循环,又执行(1)
无限循环bug - -
------------------------------栈是个好东西-----------------------------------------
上面的程序bug通过栈暂存cx来解决,如下:
assume cs:codesg,ds:datasg,ss:stacksg datasg segment db 'acfil ' db 'acfil ' db 'acsea ' db 'acopt ' datasg ends stacksg segment dw 0,0,0,0,0,0,0,0 stacksg ends codesg segment start: mov ax,stacksg mov ss,ax mov sp,16 mov ax,datasg mov ds,ax mov bx,0 mov cx,4 s0: push cx ;把cx的值保存起来 mov si,0 ;si定位列 mov cx,5 s: mov al,[bx+si] and al,11011111b ;小写变大写 mov [bx+si],al ;覆盖原来的小写 inc si loop s ;bx定位行 add bx,16 pop cx ;恢复cx外层循环的值 loop s0 mov ax,4c00h int 21h codesg ends end start
0 0 栈太巧妙了,实际上各种编程语言都是这样的机制来调用函数吖、进行循环吖之类的(づ ̄ 3 ̄)づ
以后多用栈啊( •̀ ω •́ )y
相关文章推荐
- hdu 1030 Delta-wave
- 改变表单的提交方法
- Entity Framework 学习笔记(2)
- 文章标题
- 一个简单的SignalR例子
- 抽象类和接口的区别
- JAVA如何将ip字符串转化为整型的工具方法
- 【BZOJ 1877】【SDOI 2009】晨跑
- nginx反向代理substitutions4nginx模块实现替换字符盗站 nginx.conf配置
- 修改商品详细页-销售记录-买家名称和显示字数
- 在项目中使用mybatis
- Java数据库连接——JDBC调用存储过程,事务管理和高级应用
- 4月3日腾讯笔试题“最长回文子串”PS
- 5、Mysql普通索引创建实例
- MySQL 查询最大最小值优化
- Linux 学习_mysql
- javaServlet+tomcat+mysql简单登陆注册web测试环境搭建
- 学习笔记之lvm基本应用及其扩展和缩减实现
- 学习笔记之lvm基本应用及其扩展和缩减实现
- JSON