【1字=16bits的原因,switch汇编详解,跳到中间 jump to middle,guarded-do门卫】
创始人
2024-03-30 13:33:55
0

博主昵称:一拳必胜客
博主主页面链接:博主主页传送门
博主专栏页面连接:专栏传送门--计算机考研
创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流;
博主研究方向:渗透测试、嵌入式、机器学习;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;

 特别鸣谢:木芯工作室

孔子学鼓琴师襄子,十日不进。师襄子曰:“可以益矣。”孔子曰:“丘已习其曲矣,未得其数也。”有间,曰:“已习其数,可以益矣。”孔子曰:“丘未得其志也。”有间,曰:“已习其志,可以益矣。”孔子曰:“丘未得其为人也。”有间,有所穆然深思焉,有所怡然高望而远志焉。曰:“丘得其为人,黯然而黑,几然而长,眼如望羊,如王四国,非文王其谁能为此也!”师襄子辟席再拜,曰:“师盖云文王操也。”


一、概念梳理

1. 字(word)与字节(Byte)

由于历史原因,intel从16位体系逐步扩展到32,64位体系,所以定16bit为1字。64为四字。

例如:long4字。

2. 汇编特殊算数操作

clto 转换为8字(oct word)------128位

2个64位相乘要用128位来盛放

3. 跳转指令

0 :48 89 f8               mov rdi rax

3 :  eb 03                   jmp 8//注意 这个是03 他都是相对地址,下一条的5再加上3 =8 就跳到8了

5 :  48 d1 f8               sar rax

8 : 48 85 c0               test rax rax

b : 7f f8                      jg 5//这个跳转 f8 是个补码,源码是-8,0xb-8=5就跳到5了

d : f3 c3                     repz, retq

4. 跳到中间 jump to middle

jump to middle直接翻译过来就是跳转到中间,它的原理其实就是把条件测试写在中间部分,在首次迭代开始之前先行跳转并执行条件测试语句。

long fact_jump_to_middle(long n) {long result = 1;goto test;loop:result *= n;n --;test:if (n > 1) goto loop;return result;}

对于cpu就知道从前往后执行,不看别的那些label

5.  guarded-do门卫

另一种翻译方式被称为guarded-do,它的原理是在迭代之前设置一个“门卫”条件。如果不符合条件的话,则直接跳到循环逻辑之后,否则就进入循环逻辑中,此处的循环逻辑依旧用do-while循环来实现。按照这种翻译方式所翻译的goto版本如下

long fact_guarded_do(long n) {long result = 1;if (n <= 1) goto done;loop:result *= n;n --;if (n > 1) goto loop;done:return result;

可见最关键的地方是设置的“门卫”条件,该条件应该设置成循环条件的补集。只要满足这个“门卫”条件则跳过整个循环逻辑,否则就进入循环区域中。

6.  switch汇编详解

如果没有break就不会跳到最后。

movl    %eax, -4(%rbp) #eax中存放的是c代码中的 branchvare变量值movl    -4(%rbp), %eaxcmpl    $2, %eaxje    .L9 #等于2跳转到L9cmpl    $2, %eaxjg    .L10 #大于2跳转到L10,在L10代码处又进行了分支跳转cmpl    $1, %eaxje    .L11 #等于1跳转到L11jmp    .L8 #跳转default
.L10:cmpl    $3, %eaxje    .L12cmpl    $4, %eaxje    .L13jmp    .L8
.L11:call    case1jmp    .L14
.L9:call    case2jmp    .L14
.L12:call    case3jmp    .L14
.L13:call    case4jmp    .L14
.L8:call    casedefaultnop
.L14:movl    $0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc



 

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...