APCS Network

 Quên mật khẩu
 Đăng ký
Tìm
Xem: 3950|Trả lời: 0
Thu gọn cột thông tin

Đọc hiểu code Assembly

[Lấy địa chỉ]
Đăng lúc 20-12-2012 20:50:05 | Xem tất |Chế độ đọc
Bài được boylove142 sửa lúc  21-12-2012 19:23

Bài được boylove142 sửa lúc  21-12-2012 03:08

Đây là một bài code mẫu về function. Các bạn xem có hiểu nó hoạt động như thế nào không nha.
Code này đảm bảo chạy trên linux x86 ổn. Để biết kết quả, thì sau dòng gọi chương trình chạy
  1. ./demo1
Sao chép mã
các bạn ấn thêm một dòng nữa là:
  1. echo $?
Sao chép mã
Nghĩa là lấy ra giá trị mà chương trình return ra

Nguồn: http://ftp.twaren.net/Unix/NonGNU//pgubook/ProgrammingGroundUp-1-0-booksize.pdf
(Về function trong assembly thì xem chapter 4 - dành cho bạn nào không hiểu)

  1. #PURPOSE: Program to illustrate how functions work
  2. #This program will compute the value of
  3. #2^3 + 5^2
  4. #
  5. #Everything in the main program is stored in registers,
  6. #so the data section doesn’t have anything.
  7. .section .data

  8. .section .text

  9. .globl _start
  10. _start:
  11. pushl    $3                         #push second argument
  12. pushl    $2                         #push first argument
  13. call       power                    #call the function
  14. addl     $8, %esp                   #move the stack pointer back
  15. pushl    %eax                       #save the first answer before
  16.                                     #calling the next function
  17. pushl    $2                         #push second argument
  18. pushl    $5                         #push first argument
  19. call     power                      #call the function
  20. addl     $8, %esp                   #move the stack pointer back
  21. popl     %ebx                       #The second answer is already
  22.                                     #in %eax. We saved the
  23.                                     #first answer onto the stack,
  24.                                     #so now we can just pop it
  25.                                     #out into %ebx
  26. addl     %eax, %ebx                 #add them together
  27.                                     #the result is in %ebx
  28. movl     $1, %eax                   #exit (%ebx is returned)
  29. int      $0x80
  30.                                     #PURPOSE: This function is used to compute
  31.                                     # the value of a number raised to
  32.                                     # a power.
  33.                                     #
  34.                                     #INPUT: First argument - the base number
  35.                                     # Second argument - the power to
  36.                                     # raise it to
  37.                                     #
  38.                                     #OUTPUT: Will give the result as a return value
  39.                                     #
  40.                                     #NOTES: The power must be 1 or greater
  41.                                     #
  42.                                     #VARIABLES:
  43.                                     # %ebx - holds the base number
  44.                                     # %ecx - holds the power
  45.                                     # -4(%ebp) - holds the current result
  46.                                     #
  47.                                     # %eax is used for temporary storage
  48.                                     #

  49. .type power, @function
  50. power:
  51. pushl     %ebp                      #save old base pointer
  52. movl      %esp, %ebp                #make stack pointer the base pointer
  53. subl      $4, %esp                  #get room for our local storage
  54. movl      8(%ebp), %ebx             #put first argument in %eax
  55. movl      12(%ebp), %ecx            #put second argument in %ecx
  56. movl      %ebx, -4(%ebp)            #store current result

  57. power_loop_start:
  58. cmpl      $1, %ecx                  #if the power is 1, we are done
  59. je        end_power
  60. movl      -4(%ebp), %eax            #move the current result into %eax
  61. imull     %ebx, %eax                #multiply the current result by
  62.                                     #the base number
  63. movl      %eax, -4(%ebp)            #store the current result
  64. decl       %ecx                     #decrease the power
  65. jmp       power_loop_start          #run for the next power

  66. end_power:
  67. movl      -4(%ebp), %eax            #return value goes in %eax
  68. movl      %ebp, %esp                #restore the stack pointer
  69. popl      %ebp                      #restore the base pointer
  70. ret
Sao chép mã
Bạn phải đăng nhập mới được đăng bài Đăng nhập | Đăng ký

Quy tắc điểm

Phòng tối|APCS Forum

GMT+7, 24-8-2019 03:50 , Processed in 0.123323 second(s), 23 queries .

Powered by APCS-HCMUS

© 2007-2013 APCS Network.

Trả lời nhanh Lên trên Trở lại danh sách