前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >汇编学习(2),数据表示与寄存器

汇编学习(2),数据表示与寄存器

作者头像
一只小虾米
发布2022-12-02 16:50:19
4130
发布2022-12-02 16:50:19
举报
文章被收录于专栏:Android点滴分享Android点滴分享

本篇介绍

本篇介绍下数据在计算机中的表示形式以及常用的寄存器, 最后再学一个稍微复杂点的代码。

内容介绍

补码

对于有符号整数类型,负数是以补码(complement)形式保存的,这样可以方便做运算,补码就是绝对数的各个bit位取反然后加1,举个例子如下:

代码语言:javascript
复制
有符号整数 17
二进制形式: 0000 0000 0001 0001
十六进制:  0x0011

有符号整数 -17
绝对值 17
二进制形式: 0000 0000 0001 0001
补码形式: 1111 1111 1110 1110
加1: 1111 1111 1110 1111
十六进制: 0xffef

再计算下 17 + (-17)
二进制:
    0000 0000 0001 0001
+  1111  1111  1110 1111

=  0000 0000 0000 0000
十六进制: 0x0000

这样就简单很多了,减法也可以使用加法的规则

寄存器

通用寄存器如下:

image.png

指令寄存器(rip) 用来存放即将执行的下一条指令地址。 标记寄存器(rlags),个别字段介绍如下:

image.png

打印字符串

在编辑器中写入如下的代码:

代码语言:javascript
复制
    ; hello.asm
    section .data
    msg1 db "hello, world",10, 0
    msg1Len equ $-msg1-1 ; $ 表示取当前地址
    msg2 db "Alive and Kicking!", 10,0
    msg2Len equ $-msg2-1
    radius dq 357
    pi dq 3.14
    section .bss
    section .text
    global main
main:
    push rbp        ; prologue
    mov rbp, rsp
    mov rax,1
    mov rdi,1
    mov rsi, msg1
    mov rdx,msg1Len
    syscall
    mov rax, 1
    mov rdi,1
    mov rsi, msg2
    mov rdx, msg2Len
    syscall
    mov rsp, rbp        ; epilogue
    pop rbp
    mov rax,60
    mov rdi,0
    syscall

编译后用gdb 加载并执行disassemble main,这时候会发现汇编是att格式的,如下:

image.png

而我们写的汇编是intel风格的,这时候可以设置下flavor,set disassembly-flavor intel, 再反汇编看下,就会看到格式变成intel了:

image.png

这时候再简单提下prologue和epilogue对于gdb的作用,如果没有他们,那么gdb就不能单步调试了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本篇介绍
  • 内容介绍
    • 补码
      • 寄存器
        • 打印字符串
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档