鱼C论坛

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

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

[复制链接]
发表于 2017-7-4 23:54:15 | 显示全部楼层 |阅读模式

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

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

x
小白刚学,不对的请各位大佬指正,谢谢


一、加深学习Loop指令
(1)从上边的课程中,我们可以总结出用cx和loop 指令相配合实现循环功能的三个要点:
1.在cx中存放循环次数;
2.loop 指令中的标号所标识地址要在前面;
3.要循环执行的程序段,要写在标号和loop 指令的中间。

(2)提高Loop的计算速度(计算效率):其实就是使Loop的循环次数变少。
如:123*236
第一种方法:123连续相加236次。
第二种方法:236连续相加123次。
总结:两种方法结果相同,但是过程不同;第一种方法循环了236次,而第二种方法只循环了123次!效率是不是变高了呀

(3)关于小甲鱼对于问题5.2中赋值给CX值得问题:问题要求我们循环相加236次,这里小甲鱼赋值给CX也是236次;我们不禁要问,不是应该赋值给CX235次吗?因为在上一节课中,说到add要先执行一次啊;这样赋值不就是循环了237次了吗?
对于这个问题我也想了一下才反应过来,具体原因是这样的:因为这里的  add ax,123 中的ax一开始是为0的,这一次的 add ax,123 其实只是赋值给ax而已,并没有执行到 123+123这样的结果,只是赋值 ;所以在CX处要赋值为236次。


二、在Debug中跟踪用loop指令实现的循环程序
(1)计算ffff:0006单元中的数乘以3,结果存储在dx中。我们分析一下:
1.运算后的结果是否会超出dx所能存储的范围?
   ffff:0006 单元中的数是一个字节型的数据,范围在0~255之间,则用它和3相乘结果不会大于65535,可以在dx 中存放下。
2.我们用循环累加来实现乘法,用哪个寄存器进行累加? 我们将ffff:0006单元中的数赋值给ax,用dx进行累加。先设(dx)=0,然后做3次(dx)=(dx)+(ax)。
3.ffff:0006单元是一个字节单元,ax是一个 16 位寄存器,数据长度不一样,如何赋值?
   8位数据01H和16位数据0001H的数据长度不一样,但它们的值是相等的。所以,若实现ffff:0006单元向ax 赋值,我们应该令(ah)=0,(al)=(ffff6H)。

(2)在汇编源程序中,数据不能以字母开头,所以要在前面加0。


(3)G命令和P命令用法(它们都是用来让CUP帮助我们执行繁琐的循环命令的):
G命令:单步跟踪进入到循环后,使用 G命令而且后面还要跟上源程序中Loop s 的下一条代码的偏移地址。如: G 0014
P命令:单步跟踪运行到Loop s循环处(无论是在刚开始还是已经在循环里面了,都可以用),直接输入P命令;CPU会后台帮我们执行完循环。


三、下面是我做的问题:计算 ffff:0006单元中的数乘以 123,结果存储在dx中。

(1)写好程序编译链接,然后用debug单步跟踪exe文件:
1.PNG

(2)下面是我用G命令让CUP帮助我们执行循环,我是让G指向Loop s 的下一条代码的偏移地址。
2.PNG

(3)下面是我用P命令让CUP帮助我们执行循环,单步跟踪运行到Loop s循环处(我这里是处在循环内,但是一样可以跳出循环,让CUP帮助我们执行循环)
3.PNG


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


   
本节结束,多谢览阅!
小白刚学,不对的请各位大佬指正,谢谢

评分

参与人数 1鱼币 +7 收起 理由
小甲鱼 + 7 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-20 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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