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

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

  汇编系列其实也在一直更新,只不过更新的频率会挺慢的…由于白天一直忙于工作,空闲时间还要看书、学习各种技术栈,早上也要抽时间早期健身,晚上回家还要陪家人 + 学习,时间安排的满满当当,所以我就慢慢写,各位读者也别太着急,我其实真想再分一个自己出来。
  之前的文章中介绍过 [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
  如果文章对你有帮助,小伙伴们三连走起呀!

死亡,只是一瞬间今日清晨路,草木的枯,胜比昨日,石径上也落满了绿色的叶子。总以为草木渐次枯荣,不曾想以肉眼可见的速度萎去总以为落叶黄花,不曾想绿色亦会凋零总以为叶的离去,是为了根的滋养,不曾想树干我存在吗?(6)生命体是具有自我意识的自为存在,是相对独立于自在世界的行为主体。她具有自主选择行为,既选择生存环境,选择交往伙伴,还选择生存方式选择繁殖方式。既然生命体存在选择行为,那就必须存在实20家白酒A股2022年前三季盘点谁是涨幅王?白酒股是资本市场明星,茅台是第一大市值A股。20家白酒A股上市公司今年前三季股价表现如何?上游新闻记者统计获悉,截止2022年9月30日收盘,金种子酒35。42,古井贡酒12。47突然翻红!几年前按斤卖,如今它身价倍增一机难求金属感的机身,低像素粗颗粒的画质,高饱和度的色彩近日,在某社交平台上,曾一度风靡的CCD卡片机重新翻红,成为时尚关键词。现代快报记者探访发现,几年前按斤卖的电子废品,如今身价上涨,旅游逐步复苏,今年前9个月逾525万名外游赴泰10月2日,泰国总理办公室副发言人特莱素丽女士透露,巴育总理计划利用旅游推动经济发展,推动全国各地收入增长,并命有关部门提高旅游活动产品服务等水准,以期吸引更多游客出游。特莱素丽表不幸的刘丹28岁去世,父亲殉职,母亲患病,ampampquot箫剑ampampquot为她扫墓22年1998年,刘丹因饰演了还珠格格中香妃一角爆红。原本以为从那之后,她便开启了人生的花路,可没想到仅成名了两年刘丹就去世了,享年28岁。这让无数人都感到悲痛和遗憾。然而悲惨的还不止于小夫妻10年前双双遇难,4年之后孩子出生!这到底是怎么回事在阅读此文之前,麻烦您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持!2017年在南京一家医院的产房大门外,4位老人正在焦急地等待着产房内的结果,最终祖国在我心中一人一句告白祖国祖国在我心中冉佳摄2019年10月4日上午9时多,我有幸参观了北京天安门广场,还观看了庄严肃穆的升国旗仪式。北京天安门广场是全中国人民向往的地方!人的一生当中,总想南极发现百年前的胶卷,照片修复后大家究竟看到了什么?南极大陆是一个孤独的隐者。它不与任何大陆相连,被大洋包围在中央,像是一个遗世独立的仙子,从前人们只闻其名却不见其人。山海经中有应龙处南极处南极以出入风的记载。古人记载的南极是否是现徕卡与海信合作出4K超短距投影仪稿源DoNews徕卡(Leica)在本届IFA上宣布与海信(Hisense)合作,带来一款挂着其经典红标的Cine1超短距投影仪。这款设备分为80吋和100吋两个版本,解析度均为4女星曾之乔近日受品牌邀请前往法国参加巴黎时装周女星曾之乔近日受品牌邀请前往法国参加巴黎时装周,因疫情久违的出国行程,让她开心的多日来连晒美照,靠穿搭与美景再度赚足众人眼球。昨(4)日经过巴黎铁塔时,她忍不住合影晒美照,让私粉丝
宋丹丹被骂上热搜,桃花坞全员都慌了,态度有了180度大转弯前段时间,宋丹丹因为在录制桃花坞期间的强势表现,屡次被骂上了热搜,网友评论宋丹丹倚老卖老,脾气固执,说话强势,让人十分不舒服。节目首期播放中,宋丹丹不断贬低汪苏泷,催婚董璇等许多强百亿小生刘昊然,被陈思诚力捧,却身陷谭松韵欧阳娜娜纷争文梦娱星说编辑梦娱星说吃饭睡觉欧阳娜娜,曾是刘昊然微博的常态,他的微博或许可以改名,欧阳娜娜成长之路,还亲切的称呼其为小孩。2014年刘昊然和欧阳娜娜共同参演了北京爱情故事,在电影苹果玩不起?日元贬值手机遭疯抢,库克宣布iPhone13系列涨价今年以来,日元汇率进入下行通道不断贬值,进入6月份创造24年来历史新低纪录,吸引不少海外游客前往日本扫货,其中iPhone13系列最为抢手。不过此举引发苹果总部高度重视,库克无法忍东北烧烤,领先全球100年来源福桃九分饱虽然我是一个东北人,但我每年都会去东北旅一次游,没错,不是回家,是旅游。这点我身边很多朋友,包括我父母都不是很理解,整个东三省都大差不差的,口音吃的也都差不多,有啥可值得收藏的写给党满满祝福的句子1。爱我中华,扬我国威。2。伟大历程,初心不改,永远跟党走。3。九州共襄庆,鸿鹄志弥坚。4。岁月峥嵘,不忘初心。5。7。1建党节,你的1921,我的2022,初心依旧。6。知党心,笑到胃痛的穿帮镜头刘涛我忍了,关晓彤这也太美了我们在看电视剧的时候,里面总会有很多的穿帮镜头,但是我们看的不够仔细所以就没发现,今天就给大家讲几个搞笑的镜头。穿帮镜头一现在影视圈里面有很多导演开始拍摄抗战题材的电视剧,但是有些硬桥硬马,为你的每项运动保驾护航Rex2户外表使用测评很多年前,如果你想买一块户外表,那么选择的余地不会太大,而价格也是高高在上的,甚至是打出了无XX,不户外的口号,这是对自身产品的自信度。我就有过一块全英文界面的户外表,那会儿竟然不外表的每一面都有意义穿衣的自信,可以呈现出怎样的自己穿得好看,心情也会变好,所以不管在什么场合?穿衣都很有意义。常穿暖色系的衣物者,多是开朗的人。相反冷色系的衣物者,多是含蓄的人。在选购衣服时,人们除海南有这样一个全国最美乡村书屋,不要门票,风景如画这个坐落于海南省万宁市北坡镇溪边村的溪边书屋,曾经被评为全国最美书屋,不要门票,风景美如画。溪边村是全省闻名的三角梅生产基地,溪边书屋就掩映在姹紫嫣红的各色三角梅里。走进书屋,仿佛辽宁离队第一人揭晓,夺冠功勋竟遭到放弃,加盟江苏携手李楠对于上个赛季的辽宁队而言,他们经历了一个相当成功的赛季,在夺下队史第二座总冠军奖杯的情况下,辽宁队这边也是不敢有丝毫的怠慢,作为一支对冠军持续保有竞争力的球队,他们也是在日前率先和奥登,曾经那个被叫做大帝的男人我知道自己是NBA历史上最水货的状元之一,我也知道,当凯文杜兰特取得更多成就的时候,我就会变得更水。在面对记者提问时,曾经的天之骄子奥登沮丧地说道。今天,白话就想给大家说说这个曾经