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

2022-12-02 16:50:19 浏览数 (2)

本篇介绍

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

内容介绍

补码

对于有符号整数类型,负数是以补码(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就不能单步调试了。

0 人点赞