范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

原来汇编中的循环是这么玩儿的

  汇编系列其实也在一直更新,只不过更新的频率会挺慢的…由于白天一直忙于工作,空闲时间还要看书、学习各种技术栈,早上也要抽时间早期健身,晚上回家还要陪家人 + 学习,时间安排的满满当当,所以我就慢慢写,各位读者也别太着急,我其实真想再分一个自己出来。
  之前的文章中介绍过 [0] 表示的是内存单元,它一般存储在 ds 寄存器中,偏移地址为 0 。比如下面的指令 mov ax,[0]
  就是将一个内存单元的内容送入 ax,这个内存单元的长度为 2 个字节,正好存放一个字型数据,偏移地址为 0 ,段地址在 ds 中。这种寻址方式相当于是直接寻址。
  比如下面代码 mov al,[0]
  就是将一个内存单元的地址送入 al 中,这个内存单元的长度是 1 字节,存放字节型数据,偏移地址位 0 ,段地址在 ds 中。
  所以要描述一个完整的一个内存单元,应该需要两种信息:即 内存单元的地址和内存单元的长度 。
  比如我们要读取一个 10000H 的数据,你可能会需要下面这段代码。 mov bx,10000H mov ds,bx mov al,[0]
  上面这三条指令就把 10000H 读取到了 al 中。
  但是表示内存地址的方式不只有直接指定其内存地址,还可以用一种 间接寻址 的方式,比如 [bx],它表示的是一种寄存器间接寻址,也是一种偏移地址,同样的,比如我们要读取一个 10000H 的数据,使用 [bx] 这种方式的代码如下(假设 ds = 1000H) mov bx,1 mov ax,[bx]
  这样计算机就会寻找段地址为 1000H,偏移地址为 0001H 的数据放入到 ax 中。
  它的中文解释就是  把 [bx] 指向的地址中的内容,送入 ax 寄存器中 。
  比如下面这段代码 mov ax,[bx]
  它表示的就是将偏移地址为 bx 的数据,送入到 ax 中,送入的内存单元地址是 2 个字节,存放字型数据。
  又比如下面这段代码 mov al,[bx]
  它表示的就是将偏移地址为 bx 的数据,送入到 al 中,送入的内存单元地址是 1 个字节,存放字节型数据。
  [bx] 这种间接寻址的好处就是每次偏移地址不是固定的,这为我们接下来的循环指令奠定了基础。
  为了更方便的描述后面,我们后面使用  ()   来表示一个寄存器或者内存单元中的内容。这里需要注意一下,() 内的表示的元素一般有三种类型:
  寄存器名,比如 (ax) 就表示 ax 中的内容,(al) 就表示 al 中的内容。段寄存器名,比如 (ds) 就表示段寄存器 ds 中的内容。内存单元的物理地址,比如 ((ds) * 16 + (bx)),一个 20 位的数据。
  我们知道,寄存器存储的数据类型有两种,字型和字节型,字型数据一般用 ax 这类寄存器来存储,字节型数据一般用 ah 、al 这种寄存器来存储。
  同样的,() 内的数据类型也有两种,字型和字节型。比如 (al)、(bl)、(cl) 这种表示的数据就是字节型,而 (ax)、(bx)、(cx) 表示的数据就是字型。
  在了解完上述的这些知识点后,我们就可以来正式看一下 [bx] 了。 [BX]
  再来啰嗦一下 [bx] 的寻址方式,比如下面代码 mov ax,[bx]
  bx 中存放的数据作为一个偏移地址,这里用 EA 表示(没有其他意思,只是单纯地表示偏移地址),段地址在 ds 中,用 SA 表示(同 EA 的解释),将 SA:EA 处的数据送入 ax 中,即 (ax) = ((ds) * 16 + (bx))。
  可以将内存单元送入寄存器中,也可以将寄存器的数据送入到内存单元中,如下代码所示 mov [bx],ax
  就是将 ax 中的数据送入到 SA:EA 处,即 ((ds) * 16 + (bx)) = (ax)。
  为了让大家加深对 [bx] 的认识,我们通过一些汇编指令来认识一下程序的执行过程,代码如下 mov ax,2000H mov ds,ax mov bx,1000H mov ax,[bx] inc bx inc bx mov [bx],ax inc bx inc bx mov [bx],ax inc bx mov [bx],al inc bx mov [bx],al
  下面我们就按照每一行指令来分析一下
  首先,mov ax,2000H 就是将 2000 送入 ax 中,mov ds,ax 就是将设置段地址为 2000 H,mov bx,1000H 就是将 1000 送入 bx 中,mov ax,[bx] 就是将 2000:1000 处的地址送入到 ax 中(因为段基址为 2000,偏移地址 dx 为 1000),2000H:1000H 处的指令是 00be,所以 ax = 00BEH ,存储字型数据,示意图如下
  inc bx 就是将寄存器 bx 的值加 1,此处有两条 inc 指令,所以执行完成后 bx = 1002H,此处段基址:偏移地址为 2000H:1002H。
  然后下面 (第七行指令)mov [bx],ax 就是将 ax 中的数据送入到 [bx] 中,也就是 1002H 处,指令执行后,2000:1002 单元的内容为 BE,2000:1003 单元的内容为 00,存放字型数据,执行完成后的示意图如下
  继续执行第 8、9 行的指令,inc bx ,执行完成后 bx = 1004H,然后执行第 10 行指令 mov [bx],ax ,指令执行前: ds = 2000H,bx = 1004H,mov [bx],ax 相当于是把 ax 中的数据送到 2000:1004 处,指令执行完成后,2000:1004 的单元内容为 BE,2000:1005 的单元内容为 00 ,如下示意图所示
  接下来执行第 11 行指令,inc bx,执行完成后 bx = 1005H,mov [bx],al 是把 al 中的数据送入内存 2000:1005 处,指令执行完成后,2000:1005 处的单元内容为 BE,如下示意图所示
  继续执行指令,第13、14 行指令和 11 、12 行指令一样,它的意思就是将 bx 的值加一之后,将 al 的值送入到指定地址处,执行完成后的 ds = 2000H,bx = 1006H,所以 2000:1006 处的内容是 BE(al 存储的数据),示意图如下
  想必大家跟完上面的流程后,应该对 [bx] 这个间接寻址方式有了比较深刻的认识。
  下面想个问题,使用汇编编程计算 2 * 2 ,并将结果存储在 ax 寄存器中。
  这个思路还是比较简单的,直接将 2 放在 ax 寄存器中,然后执行 ax 的 add 操作就可以了,下面是汇编代码 assume cs:codesg codesg segment  mov ax,2  add ax,ax    mov ax,4c00h  int 21h codesg ends end
  上面这段代码中的计算量还比较低,但是如果要让你计算 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 呢,你难道要写 n 个 add ax,ax 吗? assume cs:codesg codesg segment  mov ax,2  add ax,ax  add ax,ax  add ax,ax  add ax,ax  …    mov ax,4c00h  int 21h codesg ends end
  这就很繁琐啊,所以不能这么玩,那该怎么搞呢?这里就需要一种能够循环之星 add ax,ax 的指令了,这个指令就是  Loop  。Loop 指令
  Loop 指令能够循环判断是否执行指定的指令,它的执行流程就相当于我们 Java 中的 for 循环。
  我们先来使用 Loop 改写一下上面 n 个 2 相乘的代码,然后再讲解一下 Loop 的使用。 assume cs:codesg codesg segment 	mov ax,2 	mov cx,8 s: add ax,ax 	loop s  	mov ax,4c00h 	int 21h codesg ends end
  可以看到,我们使用 8 个 2 相乘的代码被优化的这么简单,这就是 loop 指令的精髓所在。
  其实关键代码就是三条指令,即 mov cx,8 s: add ax,ax loop s
  翻译过来的意思就是将 8 放在 cx 中,然后给 add ax,ax 处设置一个标号,然后执行 s 循环。
  loop 指令的格式是:loop 标号,CPU 执行 loop 指令的时候,要进行两步操作,第一步:(cx) = (cx) - 1,第二步:判断 cx 的值,不为 0 则转至标号(上面代码是 s)处继续执行指令,如果为 0 则向下执行(上面代码中乡下继续执行就是 mov ax,4c00h)。上面代码中,我们把 8 送入了 cx 中,也就是说,cx 中存储的就是执行次数。
  下面我们详细介绍一下上面这段程序的执行过程,从中体会一下 cx 和 loop s 是如何配合实现循环的。
  (1) 执行 cx,8 ,设置 cx = 8
  (2) 执行 add ax,ax(第 1 次)
  (3) 执行 loop s 将 cx 的值 - 1,此时 (cx) = 7,(cx) != 0 ,所以转至 s 处
  (4) 执行 add ax,ax(第 2 次)
  (5) 执行 loop s 将 cx 的值 - 1,此时 (cx) = 6,(cx) != 0 ,所以转至 s 处
  (6) 执行 add ax,ax(第 3 次)
  (7) 执行 loop s 将 cx 的值 - 1,此时 (cx) = 5,(cx) != 0 ,所以转至 s 处
  (8) 执行 add ax,ax(第 4 次)
  (9) 执行 loop s 将 cx 的值 - 1,此时 (cx) = 4,(cx) != 0 ,所以转至 s 处
  (10) 执行 add ax,ax(第 5 次)
  (11) 执行 loop s 将 cx 的值 - 1,此时 (cx) = 3,(cx) != 0 ,所以转至 s 处
  (12) 执行 add ax,ax(第 6 次)
  (13) 执行 loop s 将 cx 的值 - 1,此时 (cx) = 2,(cx) != 0 ,所以转至 s 处
  (14) 执行 add ax,ax(第 7 次)
  (15) 执行 loop s 将 cx 的值 - 1,此时 (cx) = 1,(cx) != 0 ,所以转至 s 处
  (16) 执行 add ax,ax(第 8 次)
  (15) 执行 loop s 将 cx 的值 - 1,此时 (cx) = 0,(cx) == 0 ,所以转至 s 处
  (16) 执行 mov ax,4c00h(循环结束)
  从上面这个过程中,我们可以总结处用 cx 和 loop 指令相配合实现循环功能的 3 点注意事项: 在 cx 中存放循环次数。 loop 指令中的标号所标识的地址要在前面 要循环执行的程序段,要写在标号和 loop 指令的中间。
  所以综上所述,使用 Loop 和 cx 相配合实现的循环功能的结构如下: 	mov cx,循环次数 s:  	循环执行的程序段 	loop s
  比如我们想用 Loop 循环计算出 123 * 456 这个值,就可以使用这种方式 assume cs:codesg codesg segment 	mov ax,0 	mov cx,456 s:add ax,123 	loop s 	 	mov ax,4c00h 	int 21h codesg ends end
  如果文章对你有帮助,小伙伴们三连走起呀!

电商与门店之争(一)门店存在的问题现在实体门店的处境是比较艰难,生意难做。很多人把这个矛头对准了电商,认为电商破坏了门店的生存环境,是罪魁祸首。只要把电商取消,门店就会迎来春天。为此他们还抛出了一个观点,只有大家都新加密货币之都?外媒称美国得州电力廉价渐成比特币乐土英国泰晤士报网站近日报道称,美国得克萨斯州正在成为世界加密货币中心。报道称,近期,比特币行业纷纷迁往美国得克萨斯州。这种迁移的速度和程度令人震惊,对于被越来越多金融机构接受的这种市799元,首款鸿蒙智能头盔已上架,智能灯光蓝牙通话样样都有就在今天,首款鸿蒙智能头盔已经上架华为商城,这款名为HelmetphoneBH51MNEO的智能头盔支持鸿蒙智联,设计功能也是十分的全面,包括智能灯光语音导航摔倒报警一键求救蓝牙通苹果八成iPhone基带芯片将在2023年自立门户?高通影响不大财联社(上海,编辑潇湘)讯,高通公司周二在刚刚结束的2021年投资者大会上预计,到2023年苹果公司发布新款iPhone时,将仅有20的调制解调器芯片由高通供应,不过对此高通已经做为什么说比亚迪股票是泡沫而特斯拉不是二众所周知,特斯拉电动车性能极为强悍。3。32。52。11。91。2破百的速度不断刺激大家的眼球,十年前所达到的性能现在国产电动车依然做不到,比亚迪旗舰汉EV破百最牛逼的也只有3。9跌出全球第二,市值蒸发3279亿,风光的小米怎么了?小米不创新永远是打工,小米以前玩的是性价比,产品质量也没话说,线下客户也认可,从去年,美国佬控制芯片,小米价格上去了,但产品质量缺下来了,还想让线下客户买单,那有这么好的事情,现在马斯克兑现承诺卖掉10的特斯拉股票上周末,全球首富埃隆马斯克在推特上发起了一项投票,问网友是否支持他卖掉10的特斯拉股票,结果有过半人投票表示支持。本周三,马斯克遵守诺言,卖掉了价值约50亿美元的特斯拉股票。马斯克共享充电宝好借难还?比特斯拉充电还贵?调查来了在智能手机不离手的时代,如果电量告急,无法及时充电,可能带来电量焦虑。应运而生的共享充电宝,满足了消费者的应急之需。但同时,不少消费者反映共享充电宝的服务并不尽如人意。为了解共享充华为职级薪资你知道吗?华为前员生工透露真实薪资比这还高华为职级薪资波动还挺大的,在这里主要说说平均水平18级,100w17级,80w16级,55w15级,40w14级,30w13级,20w薪资构成工资短期激励长期激励,工资占比最小,主性价比远超小米手机,却极少被人提起,比如这3款手机红米手机是出了名的性价比之王,主打的是中低端的手机市场。然而除了红米之外,还有一些手机也是极具性价比的,只不过名气没有红米手机的大,因此知道的人不多,比如以下这三款手机。中兴Axo鼎桥通信正式官宣,华为麒麟将恢复5G功能一导读近日,西方再次重申,不会放松对华为中兴等国产科技企业的限制,这也意味着针对华为的新规还将一直存在,在此之前,海思半导体已经因为无人代工生产成为了PPT产品,第三方芯片厂商也因
可以检测人体并追踪的看家神器小米小白摄像机Y2云台尊享版首先,我们来探究下真相本质,摄像头是用来做什么的?我是用来拍我父母的,他们现在退休,独自在家,有的时候视频沟通不方便(毕竟手机摄像头掌握在父母手里,不好控制)还是摄像头手机视频通话新款HyperDeckStudio系列录机发布BlackmagicDesign今天发布了新的HyperDeckStudio系列录机。新系列采用更好的设计,升级了编解码器,支持更多存储类型。所有型号现在都支持H。264ProRe揭秘浙江邮电职业技术学院今年9月22日至23日,四川邮电职业技术学院院长杨光一行到浙江邮电职业技术学院考察调研,两学院有着相同的行业背景,通过两天的深入交流与思想火花碰撞,达成了多方面进一步合作的意向。上揭秘陕西邮电职业技术学院陕西邮电职业技术学院是经陕西省人民政府批准成立的全日制公办普通高等学校,是西北地区唯一一所全日制公办通信信息类高等职业技术学院。历史沿革学院始创于1958年,1999年被评为国家级大学生如何自我定位,希望这篇文章对你有所帮助大学生必须正确认识自己。要想完全正确认识自己并不是一件很容易的事情,我们要抓住优点,正视缺点。我们知道,五个手指头有长有短,有大有小,但各有各的长处和不足。大拇指最粗,当我们在称赞马自达CX50的假想图曝光,3。0TV6后驱,这一操作卖多少钱合适?一提起汽车圈内有名的技术宅,很多人脱口而出的就是马自达。在人们的刻板印象中,马自达应该是一个很低调的汽车品牌,营销不多,但技术绝对过硬。在此前,马自达一口气发布5款全新SUV,涉及宝马M135ixDrive最新官图曝光,2。0T四驱系统,零百仅需4。8秒日前,宝马官方发布了一组M135ixDrive最新官图,这次主要是在外观颜色和动力性能方面做了调整。虽然这些变化听起来不大,但改动过的动力性能让它百公里加速仅需4。8秒完成。下面,曝下一代野马将采用两种混动系统,或2022年年底发布日前,有媒体在Linkedin(领英)的工程师履历上,发现了下一代福特Mustang(野马)的线索,虽然福特对细节守口如瓶。据悉,全新Mustang将采用两种混动系统,并有望于20坐着也能减肥的神器maizu迈族智能律动机打工族越来越难,内卷也越来越严重,不能躺平,不能认命,每天拖着沉重的身躯下班,专家还建议生三胎,哪有劲啊?我前几天入手了划船机,我是满怀热情的,但是老婆大人划了两下就放弃了,她划不喜欢性能车的有福了,奔驰AMGSL插电混动版谍照曝光,年底发布如果你想买一款BBA的高性能车型,应该也绕不过奔驰AMG宝马M奥迪RS系列的车型。这其中,比较注重品牌豪华感的人应该会选择奔驰品牌。日前,海外媒体曝光了一组奔驰AMGSL插电混动车苹果高管允许侧载应用程序将打开潘多拉魔盒据MobileWorldLive报道,在葡萄牙里斯本举行的2021年网络峰会上,苹果软件工程高级副总裁克雷格费德里吉(CraigFederighi)对欧盟数字市场法案允许侧载的条款