【1字=16bits的原因,switch汇编详解,跳到中间 jump to middle,guarded-do门卫】

简介: 【1字=16bits的原因,switch汇编详解,跳到中间 jump to middle,guarded-do门卫】

一、概念梳理


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), %eax
    cmpl    $2, %eax
    je    .L9 #等于2跳转到L9
    cmpl    $2, %eax
    jg    .L10 #大于2跳转到L10,在L10代码处又进行了分支跳转
    cmpl    $1, %eax
    je    .L11 #等于1跳转到L11
    jmp    .L8 #跳转default
.L10:
    cmpl    $3, %eax
    je    .L12
    cmpl    $4, %eax
    je    .L13
    jmp    .L8
.L11:
    call    case1
    jmp    .L14
.L9:
    call    case2
    jmp    .L14
.L12:
    call    case3
    jmp    .L14
.L13:
    call    case4
    jmp    .L14
.L8:
    call    casedefault
    nop
.L14:
    movl    $0, %eax
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
相关文章
如何在HTML文件中添加超链接
如何在HTML文件中添加超链接
497 0
|
JavaScript
Vue中 使用 iframe 嵌入本地 HTML 页面 并 相互通信
Vue中 使用 iframe 嵌入本地 HTML 页面 并 相互通信
2630 0
Vue中 使用 iframe 嵌入本地 HTML 页面 并 相互通信
|
10月前
|
机器学习/深度学习 监控 数据可视化
DeepSeek模型解释与可视化
深度学习模型常被视为“黑盒”,其决策过程难以理解,但在医疗、金融等高风险领域,理解模型决策至关重要。DeepSeek提供多种工具和方法,帮助解释和可视化模型的决策过程。本文介绍如何使用DeepSeek进行特征重要性分析、中间层可视化、局部解释(如LIME和SHAP)及训练过程监控,并通过代码示例详细讲解这些技巧,助力你掌握模型解释与可视化的方法。
|
监控 安全 生物认证
网络安全中的身份认证与访问控制技术详解
【6月更文挑战第30天】网络安全聚焦身份认证与访问控制,确保合法用户身份并限制资源访问。身份认证涉及生物和非生物特征,如密码、指纹。访问控制通过DAC、MAC、RBAC策略管理权限。最佳实践包括多因素认证、定期更新凭证、最小权限、职责分离和审计监控。这些措施旨在增强系统安全,防范未授权访问。
2096 2
|
12月前
|
人工智能 自然语言处理 语音技术
Ultravox:端到端多模态大模型,能直接理解文本和语音内容,无需依赖语音识别
Ultravox是一款端到端的多模态大模型,能够直接理解文本和人类语音,无需依赖单独的语音识别阶段。该模型通过多模态投影器技术将音频数据转换为高维空间表示,显著提高了处理速度和响应时间。Ultravox具备实时语音理解、多模态交互、低成本部署等主要功能,适用于智能客服、虚拟助手、语言学习等多个应用场景。
759 14
Ultravox:端到端多模态大模型,能直接理解文本和语音内容,无需依赖语音识别
|
数据安全/隐私保护 iOS开发
什么是 DVD 区码?关于删除DVD区域代码,您需要知道的一切
DVD 和蓝光分区是数字版权管理的一种形式,目的是控制电影在世界不同地区的发行。这往往会导致在某一地区购买的 DVD 或蓝光光盘无法在另一地区购买的播放器上播放。我们将在本文中,探讨 DVD 和蓝光存在这些地区限制的原因、DVD 和蓝光的常见地区代码类型,并提出消除这些地区限制的有效解决方案。
1319 1
|
开发工具 Docker 索引
docker容器中没有vi编辑命令,简单的处理方法
docker容器中没有vi编辑命令,简单的处理方法
1993 0
|
机器学习/深度学习 数据采集 自然语言处理
使用R语言进行文本挖掘和自然语言处理
【4月更文挑战第26天】R语言在文本挖掘和自然语言处理(NLP)中扮演重要角色,得益于其强大的统计分析功能、灵活的数据处理和丰富的扩展包。活跃的社区开发了如&quot;tm&quot;、&quot;SnowballC&quot;、&quot;text2vec&quot;、&quot;topicmodels&quot;和&quot;syuzhet&quot;等包,支持数据预处理、向量化、主题建模和情感分析。
255 1
|
数据采集 自然语言处理 搜索推荐
Python实现基于LDA主题模型进行电商产品评论数据情感分析
Python实现基于LDA主题模型进行电商产品评论数据情感分析