Difference between revisions of "CSC231 No-no! and Be-Careful! situations"
(→What's wrong with the following code?) |
(→Helpful Trick) |
||
Line 57: | Line 57: | ||
=Helpful Trick= | =Helpful Trick= | ||
+ | * We can use the '''%define''' directive to assign names to our parameters living in the stack. | ||
+ | * Example: | ||
+ | |||
+ | |||
+ | ;;; -------------------------------------------------------------- | ||
+ | ;;; openFile( filename, handle ) | ||
+ | ;;; opens a file for reading, puts handle in dword whose address | ||
+ | ;;; is passed in stack. | ||
+ | ;;; Does not modify the registers, but modifies flags. | ||
+ | openFile: | ||
+ | push ebp | ||
+ | mov ebp, esp | ||
+ | pushad | ||
+ | |||
+ | '''%define of_fileName dword[ebp+12]''' | ||
+ | '''%define of_handle dword[ebp+8]''' | ||
+ | |||
+ | mov eax,SYS_OPEN | ||
+ | mov ebx, '''of_fileName''' | ||
+ | mov ecx, O_RDONLY | ||
+ | mov edx, S_IRUSR|S_IWUSR|S_IXUSR | ||
+ | int 0x80 | ||
+ | |||
+ | test eax,eax | ||
+ | jns .fileOk | ||
+ | print2 "Error opening file" | ||
+ | mov eax, SYS_EXIT | ||
+ | mov ebx, 1 | ||
+ | int 0x80 | ||
+ | |||
+ | .fileOk: | ||
+ | mov ebx, '''of_handle''' | ||
+ | mov [ebx], eax ; save handle | ||
+ | clc ; clear carry if ok | ||
+ | |||
+ | .done: popad ; restore registers | ||
+ | pop ebp | ||
+ | ret 8 | ||
+ | |||
+ | |||
+ | </pre></code> | ||
<br /> | <br /> |
Revision as of 08:26, 10 November 2010
--D. Thiebaut 13:15, 10 November 2010 (UTC)
What's wrong with the following code?
compute:
pushad
mov ecx, N ;loop some number of times
mov eax, data1 ;get some data
mov ebx, data2
.for: call doSomething ;operate on eax and ebx
; on return, eax contains
; result we're interested in
push eax ;save result in stack
loop .for
;;; we're done
popad
ret
What's tricky about the following code?
compute:
pushad
push ebp
mov ebp, esp
;;; get parameters from the stack
mov ecx,[ebp+XX] ;XX is some offset
mov eax,[ebp+YY] ;YY is some offset
mov ebx,[ebp+ZZ] ;ZZ is some offset
.for: call doSomething ;operate on eax and ebx
; on return, eax contains
; result we're interested in
loop .for
;;; we're done
pop ebp
popad
ret 3*4
Helpful Trick
- We can use the %define directive to assign names to our parameters living in the stack.
- Example:
- --------------------------------------------------------------
- openFile( filename, handle )
- opens a file for reading, puts handle in dword whose address
- is passed in stack.
- Does not modify the registers, but modifies flags.
openFile: push ebp mov ebp, esp pushad %define of_fileName dword[ebp+12] %define of_handle dword[ebp+8] mov eax,SYS_OPEN mov ebx, of_fileName mov ecx, O_RDONLY mov edx, S_IRUSR|S_IWUSR|S_IXUSR int 0x80
test eax,eax jns .fileOk print2 "Error opening file" mov eax, SYS_EXIT mov ebx, 1 int 0x80
.fileOk:
mov ebx, of_handle mov [ebx], eax ; save handle clc ; clear carry if ok
.done: popad ; restore registers
pop ebp ret 8
</pre></code>