【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
相关文章
|
3月前
|
前端开发 编译器
为什么switch里的case没有break不行
为什么switch里的case没有break不行
|
5月前
|
传感器 监控 内存技术
GE Mark VIe系列 IS220PDIOH1A 分立式输入/输出模块
IS220PDIOH1A是通用电气的分立式I/O模块,属Mark VIe系列,集成PDIA和PDOA功能于一体。它支持24路输入、12路继电器输出及反馈信号,通过三针电源和双以太网端口连接系统。模块与TDBS/TDBT端子板兼容,安装简便,具备自检和软启动功能,确保可靠运行。
|
8月前
|
安全 编译器
8086 汇编笔记(四):[BX] 和 loop 指令
8086 汇编笔记(四):[BX] 和 loop 指令
|
8月前
汇编语言中的条件跳转和无条件跳转(je,jz,jmp)
汇编语言中的条件跳转和无条件跳转(je,jz,jmp)
296 1
|
8月前
|
编译器 C语言 C++
【C语言】分支和循环 ---- if、switch、while、for、goto语句, 理解getchar和putchar函数
【C语言】分支和循环 ---- if、switch、while、for、goto语句, 理解getchar和putchar函数
58 0
|
8月前
|
JavaScript Java Android开发
你胆敢在case后面不加break试试?
你胆敢在case后面不加break试试?
|
8月前
|
存储
【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间
【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间
150 1
|
8月前
汇编指令学习(CALL,JMP,RET)
汇编指令学习(CALL,JMP,RET)
121 0
printf scanf if switch分支语句总结
printf scanf if switch分支语句总结
50 0
|
小程序 C语言
goto的应用举例及详解
goto的应用举例及详解
100 0

热门文章

最新文章

下一篇
开通oss服务