banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Cho em hỏi về tìm kiếm file trong asm32  XML
  [Programming]   Cho em hỏi về tìm kiếm file trong asm32 03/09/2008 01:19:27 (+0700) | #1 | 149442
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Em đang bắt đầu học asm32, em có đoạn code sau để tìm kiếm file trong thư mục nhưng ko hiểu sao khi chạy lại có lỗi này:




Đoạn code của em:

Code:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib

.code
search_handle	dd 0
lpFileName	db	"*.*",0
lpFindFileData	STRUCT
  dwFileAttributes	DWORD      ?
  ftCreationTime        	FILETIME <>
  ftLastAccessTime	FILETIME <>
  ftLastWriteTime       FILETIME <>
  nFileSizeHigh         	DWORD      ?
  nFileSizeLow          	DWORD      ?
  dwReserved0        	DWORD      ?
  dwReserved1         	DWORD      ?
  cFileName             	BYTE MAX_PATH dup(?)
  cAlternate            	BYTE 14 dup(?)
lpFindFileData	ENDS
start:          
	mov	eax,lpFindFileData
      	push	eax
      	lea	eax,lpFileName
      	push	eax
      	call 	FindFirstFileA  
      	cmp 	eax,-1  
       	je 	error   
      	mov 	search_handle,eax 
findnext:
       	mov	eax,lpFindFileData
      	push	eax    
      	lea	eax,search_handle
      	push	eax 
   	call 	FindNextFileA
        cmp 	eax,0
      	je 	error  
     	loop 	findnext
error:
   	invoke ExitProcess, NULL
end	start


Các anh có thể xem hộ em là lý do vì sao lại ko chạy đc ko ạ?
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi về tìm kiếm file trong asm32 03/09/2008 07:11:54 (+0700) | #2 | 149468
[Avatar]
Tal
Member

[Minus]    0    [Plus]
Joined: 15/09/2007 16:50:17
Messages: 67
Offline
[Profile] [PM]
lpFindFileData là 1 cấu trúc. Bạn chỉ có thể dùng được biến thôi. Ở trên bạn mới khai báo cấu trúc.

Hàm FindFirstFile có 2 đối là 2 con trỏ, vì vậy phải nạp địa chỉ của 2 đối lên.
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi về tìm kiếm file trong asm32 03/09/2008 11:28:14 (+0700) | #3 | 149495
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Hic, anh có thể viết lại cho em đoạn khai báo đc ko ạ, lần trước em hỏi thì anh mfeng nói khai báo như vậy, em ko tìm thấy ở đâu nói về khai báo cả.
Còn đoạn nạp địa chỉ thì em thay
Code:
mov	eax,lpFindFileData
       	  push	eax

bằng
Code:
lea  	eax,lpFindFileData
       	  push	eax

thì lại ko compile đc, bị báo lỗi.


[Up] [Print Copy]
  [Question]   Re: Cho em hỏi về tìm kiếm file trong asm32 03/09/2008 14:10:58 (+0700) | #4 | 149514
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Em đã giải quyết xong đoạn code trên rồi, tuy nhiên vẫn còn 1 vấn đề, nếu em đưa khai báo
Code:
search_handle	dd 0
lpFileName	db	"*.*",0
lpFindFileData	WIN32_FIND_DATA <>

vào code, ko sử dụng data section thì chương trình khi chạy sẽ gặp lỗi (khi debug sẽ thấy lỗi ở ngay hàm findfirstfile).
Đoạn code để chạy đc là phải đưa các biến vào section data:
Code:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib
.data
search_handle	dd 0
lpFileName	db	"*.*",0
lpFindFileData	WIN32_FIND_DATA <>
.code
start:          
	invoke FindFirstFile,addr lpFileName,addr lpFindFileData  
      	cmp 	eax,-1  
       	je 	error   
      	mov 	search_handle,eax 
findnext:
       	invoke FindNextFile,search_handle,addr lpFindFileData
        cmp 	eax,0
      	je 	error  
     	loop 	findnext
error:
   	invoke ExitProcess, NULL
end	start

Các anh có thể cho em biết lý do vì sao lại lỗi và em muốn đưa cả biến và code vào cùng 1 section thì phải làm thế nào ko ạ?
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi về tìm kiếm file trong asm32 04/09/2008 07:18:27 (+0700) | #5 | 149597
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Ừ, thì phải đưa vào .data section, vì .data section default là write able, còn code section thì readonly, execute able.
Hàm FindFirstxxx gì đó cần và phải ghi ngược data trả về vào findFileData struct variable, và vì variable này nằm trong code section, read only, nên sẽ gây ra Access Violation Exception.
Cách khắc phục là đưa variable trên vào .data section, hoặc dùng 1 PE Editor để modify attribute của code section thành writable, hay đưa thêm option /SECTION:.text,EWR cho command line của link.exe
[Up] [Print Copy]
  [Question]   Re: Cho em hỏi về tìm kiếm file trong asm32 04/09/2008 10:46:24 (+0700) | #6 | 149611
bboy0303
Member

[Minus]    0    [Plus]
Joined: 06/06/2007 11:06:41
Messages: 46
Offline
[Profile] [PM]
Em quên mất điều đấy đấy smilie , cám ơn anh nhé!!!
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|