Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: làm sao để lấy được argc và argv trong asm

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    84

    Mặc định làm sao để lấy được argc và argv trong asm

    Mình đang thắc mắc cách lấy argc và argv trong assembly
    cái này giống như trong lập trình C
    int main(int argc,char **argv){

    }
    ASM Code:
    1. # hello world
    2. .file "t.s"
    3. .data
    4. msg:
    5.     .ascii "Hello world!\n"
    6.     len= . - msg
    7. .text
    8. .global strlen
    9. strlen:
    10.     xor %rax,%rax
    11.     .LP0:
    12.     movb (%rdi),%cl
    13.     cmpb $0,%cl
    14.     je .LP1
    15.     inc %rdi
    16.     inc %rax
    17.     jne .LP0
    18.     .LP1:
    19.     ret
    20. .global puts
    21. puts:
    22.     mov %rdi,%r8
    23.     call strlen
    24.     mov %rax,%rdx
    25.     mov $1,%rax
    26.     mov %rax,%rdi
    27.     mov %r8,%rsi
    28.     syscall
    29.     ret
    30. .global exit
    31. exit:
    32.     mov $60,%rax
    33.     syscall
    34.     ret
    35. .global _start
    36. _start:
    37.     mov $msg,%rdi
    38.     call puts
    39.     mov $0,%rdi
    40.     call exit
    RISC better than CISC
    phamthechung0@gmail.com

  2. #2
    Ngày gia nhập
    09 2011
    Bài viết
    84

    thôi mình biết cách rùi
    ASM Code:
    1. pop %rdi
    2. pop %rsi
    3. jmp _main
    RISC better than CISC
    phamthechung0@gmail.com

  3. #3
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Cậu lấy các tham số từ ép,vì các argument trên commandline đề được push vào stack cả.Tùy vào cách viết hàm mà nó push vào tế nào.Thường thì nó chừa ra 8
    byte,4 byte đầu cho argc và 4xbyte tiếp là *argv

    C Code:
    1.  
    2. .globl _start
    3. _start:
    4.     pop    %ecx        ;day la argc
    5.     cmp    $2,%ecx
    6.     jne     notparam  
    7.     add    $8,%esp    
    8.     pop    %esi        ; day la argv thứ 2(cái thứ 1 là path của chương trình)
    9.     JMP abc
    10. notparam : .... //khong co argv
    11. abc :
    12. ...
    13. }
    Đã được chỉnh sửa lần cuối bởi lttq : 19-10-2011 lúc 06:38 PM.
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Tùy theo Calling convertion, nên đọc tutorials sau: Calling Syntax | Calling convertion
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  5. #5
    Ngày gia nhập
    08 2011
    Bài viết
    98

    calling convention có lẽ không liên quan mấy đến việc lấy argv vì calling convention cho cùng cũng là cách gọi hàm của các cc khác nhau.cc của windows có name mangling khác với linux nhưng nhìn chung thì cách clean stack ... thì cũng tương tự vậy.

    Nói về vấn đề của bạn chủ thread đang đề cập thì khi 1 chương trình chạy thì hệ điều hành xác lập các argument để truyền vào cái điểm vào của chương trình.Các đối số được truyền từ chương trình khác,thông thường là bash shell.Shell sẽ ngắt các tham số từ dòng lệnh ta gõ,sau đó truyền đến hệ điều hành,hệ điều hành lúc này sẽ đưa các giá trị này vào mảng argv.

    Khi chạy chương trình thì hệ điều hành chừa ra 1 vùng localsize để push các biến,... vào stack.Vì lý do này nên các argc và argv sẽ push vào đầu tiên.Chỉ cần điều chỉnh esp về và lấy được các argv ngay
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  6. #6
    Ngày gia nhập
    09 2011
    Bài viết
    84

    Mặc định làm sao để lấy được argc và argv trong asm

    lttq giải thích rõ thiệt
    từ calling convention thì mình không biết trong tiếng Việt dịch là gì nữa
    sau đây là calling convention của Linux system call
    x86_32 bcdSDB
    x86_64 DSd r10 r8 r9
    RISC better than CISC
    phamthechung0@gmail.com

Các đề tài tương tự

  1. Kỹ thuật C Sự khác nhau giữa khai báo void main(), int main(void) và int main(int argv, char *argc[])?
    Gửi bởi v_huster38 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 21-11-2013, 12:10 PM
  2. Kỹ thuật C Hỏi về int main(int argc, char* argv[])
    Gửi bởi huuson94 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 24
    Bài viết cuối: 24-07-2013, 08:03 PM
  3. Lập trình winsock | int main(int argc, char* argv[]) có nghĩa là gì?
    Gửi bởi ngocthien552000 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 29-09-2010, 10:36 PM
  4. Mảng ARGV | Char* argv trong hàm main có ý nghĩa gì??
    Gửi bởi manhluat93 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 08-06-2010, 01:49 AM
  5. win32 Console đối số argc,argv,argp của Hàm Main
    Gửi bởi AdminPro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 05-04-2009, 08:00 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn