交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
7 运算符
分享
未结
0
881
李延
LV6
2022-06-01
悬赏:20积分
# 1 四则运算 ## 1.1 add 指令 ``` addq A,B ``` 将A 与 B 相加,并将结果保存再B 中 测试: ```asm .LC0: .string "add %lu\n" .globl main main: subq $56, %rsp movq $1, %rbx addq $2, %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果 ```shell [root@localhost operation]# ./a.out add 3 ``` ### 1.1.1 相加为寄存器 并且两个计算也可以是 寄存器 ```asm .LC0: .string "add %lu\n" .globl main main: subq $56, %rsp movq $1, %rbx movq $2, %rcx addq %rcx, %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` ### 1.1.2 相加为内存 两个参数 其中任意一个可以是内存,如下: ```asm .LC0: .string "add %lu\n" .globl main main: subq $24, %rsp movq $3, (%rsp) movq $2, %rbx addq (%rsp), %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $24, %rsp ret ``` ```asm .LC0: .string "add %lu\n" .globl main main: subq $24, %rsp movq $3, (%rsp) movq $2, %rbx addq %rbx,(%rsp) movl $.LC0, %edi movq (%rsp), %rsi call printf movl $0, %eax addq $24, %rsp ret ``` 结果: ```shell [root@localhost operation]# ./a.out add 5 ``` 但不可以两个都为内存寻址 ```asm .LC0: .string "add %lu\n" .globl main main: subq $24, %rsp movq $3, (%rsp) addq (%rsp),(%rsp) movl $.LC0, %edi movq (%rsp), %rsi call printf movl $0, %eax addq $24, %rsp ret ``` 会报异常: ```shell root@localhost operation]# gcc add5.s add5.s: Assembler messages: add5.s:10: 错误:too many memory references for `add' ``` ## 1.2 减法 ```asm .LC0: .string "imul %lld\n" .globl main main: subq $56, %rsp movq $1, %rbx subq $2, %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果 ```shell [root@localhost operation]# ./a.out imul -1 ``` ## 1.3 乘法 ```asm .LC0: .string "imul %lld\n" .globl main main: subq $56, %rsp movq $2, %rbx imul $5, %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果 ```sh [root@localhost operation]# ./a.out imul 10 ``` # 2 递增与递减 ## 2.1 inc 加1 ```asm .LC0: .string "add %lu\n" .globl main main: subq $56, %rsp movq $6, %rbx inc %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` jieg ```sh [root@localhost operation]# ./a.out add 7 ``` ## 2.2 dec 减1 ```asm .LC0: .string "add %lu\n" .globl main main: subq $56, %rsp movq $6, %rbx dec %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果: ``` [root@localhost operation]# ./a.out add 5 ``` # 3 取负和取补 not 取补 ```asm .LC0: .string "not %lld\n" .globl main main: subq $56, %rsp movq $6, %rbx not %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果: -7 neg 取负 ```asm .LC0: .string "neg %lld\n" .globl main main: subq $56, %rsp movq $6, %rbx neg %rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果 : -6 # 4 或、与 or 或运算 示例: ```asm .LC0: .string "imul %llu\n" .globl main main: subq $56, %rsp movq $0B1101, %rbx movq $0B1011, %rcx and %rcx,%rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果:15. 转换为二进制 为 1111 。 刚好就是我们在编码中 使用的 | 计算 and 与运算 示例: ```asm .LC0: .string "imul %lld\n" .globl main main: subq $56, %rsp movq $0B1101, %rbx movq $0B1011, %rcx andq %rcx,%rbx movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果为9. 二进制 : 1001 # 5 位运算 ## 5.1 左移 sal 与shl 。 对应编码中的 '<<' 和 '<<<' 示例 ```asm .LC0: .string "not %lld\n" .globl main main: subq $56, %rsp movq $0B10111111, %rbx sal $1, %bxl movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果:126 二进制:01111110 ## 5.2 算数右移 sar 对应编码中的 '>>' ```asm .LC0: .string "not %lld\n" .globl main main: subq $56, %rsp movq $0B10111111, %rbx sar $1, %bxl movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果:223 二进制:11011111 ## 5.3 逻辑右移 shr 对应编码中的 '>>>' ```asm .LC0: .string "not %lld\n" .globl main main: subq $56, %rsp movq $0B10111111, %rbx shr $1, %bxl movl $.LC0, %edi movq %rbx, %rsi call printf movl $0, %eax addq $56, %rsp ret ``` 结果:95 二进制:01011111
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号