鱼C论坛

 找回密码
 立即注册
查看: 3111|回复: 0

[学习笔记] 《零基础入门学习汇编语言》第五十一讲

[复制链接]
发表于 2017-9-6 00:41:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 shuiyu 于 2017-9-6 00:43 编辑

越努力,越幸运。欢迎大家来看我的笔记 小白刚学,不对的请各位大佬指正,谢谢

一、批量数据的传递
(1)前面的例程中,子程序 cube 只有一个参数(bx),寄存器的数量终究有限,我们不可能简单地用寄存器来存放多个需要传递的数据。在这种时候,我们将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。
(2)也就是直接用一个首地址来代表一个寄存器(相互之间转换很让人头疼,虽然效率不高但是毕竟也是个方法

二、寄存器冲突的问题
(1)将一个全是字母,以0结尾的字符串,转化为大写。
用子程序实现:
abc:    mov cl,[si]
    mov ch,0
    jcxz ok
    and byte ptr [si],11011111b
    inc si
    jmp short abc
ok:    ret

说一下难理解的两个地方:1. jcxz ok 表示:判断如果cx=0则跳转到标号ok执行ret,反之则不处理继续往下执行。2.跳转到标号ok处后呢?执行ret然后呢?其实执行ret就是出栈pop ip 而ip是多少呢?在什么时候入的栈呢?肯定是在调用这个子程序时的那个call abc指令的下面啊!说白了就是跳出了这个子程序了,这个子程序已经结束了
其它就不用多说了吧(PS:第五位为0则是大写,第五位为1则是小写)

(2)将data段中字符串全部转化为大写
               assume cs:code
            data segment
                db ‘word',0
                db ‘unix',0
                db ‘wind',0
                db ‘good',0
            data ends
分析:其实思路很简单,就是在外面加一个4次循环就Ok了。下面是我对小甲鱼代码的分析:
1.PNG

分析:我们可以看到,在第一次call里循环结束ret出来的时候,cx变成0了,而不是我们在外面赋值的4,而且继续往下运行cx已经跑飞了(cx=FFFF )所以我们只要解决掉cx的问题就能完成题目了。怎么解决呢?看下图:
2.PNG
解决:我创建了一个栈用来存CX,每次LOOPS循环我都入栈和出栈,所以一切都迎刃而解喽



谢谢小甲鱼带来的视频教程,感谢!!

本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记 小白刚学,不对的请各位大佬指教,谢谢

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 03:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表