• assembly note


    gcc -g -o hello.exe hello.s // -g 加入訊息方便debug

    gdb 用法

    gdb -q hello
    
    break *main //亦可 b *main
    
    run  //亦可
    
    print/x $eax //印出 16進位 的 register 內容
    print $eax //印出 10進位 的 register 內容
    
    print *(&array+1) //印出array[1]之值

    ----

    dword : 4 bytes
    word : 2 bytes

    mov ax,BUFF #把BUFF(in memory) 的 value 放入ax register
    lea ax,BUFF #把BUFF(in memory) 的 address 放入ax register

    LEA EAX,DWORD PTR SS:[ESP+4C]

    ---------
    values: .int 10, 15, 20
    等於 x[] = {10,15,20};
    ---------
    把指標存入 register。變數前加 $ 符號,

    movl $values, %edi ## 把 value 的位址存入 edi

    # 這和下面這一行有何不同 ?
    movl values, %edi

    # 以 C 來做比喻
    # edi = &value;
    # 和
    # edi = value;
    #
    --------------------
    The format of the expression is
    base(offset, index, size)

    The data value retrieved is located at
    base_address+ offset_address + index * size

    ---------------------

      問題:為什麽用xorl來設置eax的值? 
        註意到優化後的代碼中,eax返回值的設置由 movl $0,%eax 變為 xorl %eax,%eax ,這是因為IA32指令中,xorl比movl有更高的運行速度。

     -------------

    (gdb) x/20x $esp                      $esp=0x28fef0 ,印出20項esp所指的位置之值

    0x28fef0: 0x0028ff0b 0xc97ca1c9 0xfffffffe 0x76c81162
    0x28ff00: 0x76cd5bc4 0x00401864 0x0028ff28 0x004018c2
    0x28ff10: 0x00401864 0x004a3ef8 0x0028ff28 0x004013ba
    0x28ff20: 0x00000000 0x7efde000 0x0028ff68 0x004010b9
    0x28ff30: 0x00000001 0x00702b78 0x00701960 0xffffffff

     

     

  • 相关阅读:
    Java中的事务
    ABCDE
    Android 防内存泄露handler
    自建应用新花样,菜鸟也会做应用
    软件測试之独步武林系列(一)
    刚在在win8.1下装了ubuntu12.04
    SVN 的一些操作
    [华为机试练习题]42.求二叉树的深度和宽度
    iOS_正則表達式
    在应用中更新App版本号
  • 原文地址:https://www.cnblogs.com/bittorrent/p/2706484.html
Copyright © 2020-2023  润新知