shuiyu 发表于 2017-9-6 00:41:57

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

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

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

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

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

说一下难理解的两个地方:1. jcxz ok 表示:判断如果cx=0则跳转到标号ok执行ret,反之则不处理继续往下执行。2.跳转到标号ok处后呢?执行ret然后呢?其实执行ret就是出栈pop ip 而ip是多少呢?在什么时候入的栈呢?肯定是在调用这个子程序时的那个call abc指令的下面啊!说白了就是跳出了这个子程序了,这个子程序已经结束了{:10_245:}
其它就不用多说了吧(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了。下面是我对小甲鱼代码的分析:


分析:我们可以看到,在第一次call里循环结束ret出来的时候,cx变成0了,而不是我们在外面赋值的4,而且继续往下运行cx已经跑飞了(cx=FFFF{:10_250:} )所以我们只要解决掉cx的问题就能完成题目了。怎么解决呢?看下图:

解决:我创建了一个栈用来存CX,每次LOOPS循环我都入栈和出栈,所以一切都迎刃而解喽{:10_279:}



谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}

本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:}
页: [1]
查看完整版本: 《零基础入门学习汇编语言》第五十一讲