美文网首页
汇编学习(2),数据表示与寄存器

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

作者: android小奉先 | 来源:发表于2022-11-26 13:23 被阅读0次

    本篇介绍

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

    内容介绍

    补码

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

    有符号整数 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

    打印字符串

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

        ; 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就不能单步调试了。

    相关文章

      网友评论

          本文标题:汇编学习(2),数据表示与寄存器

          本文链接:https://www.haomeiwen.com/subject/jspffdtx.html