practical session 6
DESCRIPTION
Practical Session 6. NASM Preprocessor. NASM contains a powerful macro processor, which supports conditional assembly multi-level file inclusion two forms of macro (single-line and multi-line) * a `context stack' mechanism for extra macro power - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/1.jpg)
Practical Session 6
![Page 2: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/2.jpg)
NASM Preprocessor
โข NASM contains a powerful macro processor, which supports โข conditional assemblyโข multi-level file inclusionโข two forms of macro (single-line and multi-line) *โข a `context stack' mechanism for extra macro power
โข Preprocessor directives all begin with a % sign
* We are going to cover only this subsection of NASM macro processor. Use http://www.nasm.us/doc/nasmdoc4.html link to read more.
![Page 3: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/3.jpg)
Macro - definitionโข Macro is a set of statements given a symbolic name
โข Macro is invoked, not called. A copy of the macro is inserted directly into the program
โข After being defined, NASM will substitute (expand) those statements whenever it finds the symbolic name
Source codemyMacro
.myMacro
.myMacro
.
Expanded code
.
.
.
NASM preprocessor
macro definition macro name
macro body (statements)
macro usage
![Page 4: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/4.jpg)
Single-line macrosโข %define โ defines single-line macro
โข a macro is expanded only when it is called
Example:%define ctrl 0x1F & %define param(a, b) ((a)+(a)*(b))
mov byte [param(2,ebx)], ctrl 'D' expands to by NASM preprocessor
mov byte [(2)+(2)*(ebx)], 0x1F & 'D'
Example:
%define a(x) 1+b(x)%define b(x) 2*x expands to mov ax,1+2*8 mov ax, a(8) by NASM preprocessor
![Page 5: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/5.jpg)
Single-line macros (cont)
โข We can overload single-line macros. The preprocessor will be able to handle both types of macro call, by counting the parameters you pass.
%define foo(x) 1+x %define foo(x, y) 1+x*y
โข Macros defined with %define are case sensitive. We use %idefine to define all the case variants of a macro at once.
โข There is a mechanism which detects when a macro call has occurred as a result of a previous expansion of the same macro, to guard against circular references and infinite loops.
%define foo 1+ ebx
A macro with no parameters prohibits the definition of the same name as a macro with parameters, and vice versa.
![Page 6: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/6.jpg)
Single-line macros (cont)
Example:%define isTrue 1 %xdefine isTrue 1 %define isFalse isTrue %xdefine isFalse isTrue %define isTrue 0 %xdefine isTrue 0 val1: db isFalse ; val1 = ? val1: db isFalse ; val1=?%define isTrue 1 %xdefine isTrue 1 val2: db isFalse ; val2 = ? val2: db isFalse; val2=?
โข %define - a macro resolved at the time that it is called (used)
โข %xdefine - a macro resolved at the time that it is defined
![Page 7: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/7.jpg)
Single-line macros (cont)โข In the left case, when โisFalseโ macro uses %define, so it is expanded only
when it is called. As โisFalseโ expands to โisTrueโ, the expansion will be the current value of โisTrueโ. The first time it is called that is 0, and the second time it is 1.
โข In the right case, each time that โisFalseโ is called, it expands to 1, as that is what the macro โisTrueโ expanded to at the time that โisFalseโ was defined.
%define isTrue 1 %xdefine isTrue 1 %define isFalse isTrue %xdefine isFalse isTrue %define isTrue 0 %xdefine isTrue 0 val1: db isFalse ; val1 = 0 val1: db isFalse ; val1=1%define isTrue 1 %xdefine isTrue 1 val2: db isFalse ; val2 = 1 val2: db isFalse; val2=1
![Page 8: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/8.jpg)
Single-line macros (cont)โข %undef โ undefines defined single-line macro
Example:
%define foo(x) 1+x %undef foo mov ax, foo(3) ; would not be expanded since
; after %undef the macro foo is no longer defined
![Page 9: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/9.jpg)
Multiple-line macrosโข Works with %macro โฆ %endmacro mechanism
โข Macro parameters would be referred to as %1, %2, %3 and so on
Example:
%macro foo 1 push ebp mov ebp, esp sub esp, %1 %endmacro
my_func: foo 12 my_func: push ebp
mov ebp, esp sub esp,12
first parameter of the macro
this macro gets one parameter
NASM preprocessor
![Page 10: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/10.jpg)
Multiple-line macros (cont)โข Multi-line macros are case-sensitive, unless we define them
using the alternative directive %imacro.
โข If we need to pass a comma as part of a parameter to a multi-line macro, we can do that by enclosing the entire parameter in braces.
Example: %macro foo 2
%2: db %1 %endmacro
foo 'a', letter_a letter_a: db 'a' foo 'ab', string_ab string_ab: db 'ab' foo {13,10}, crlf crlf: db 13,10
NASM preprocessor
![Page 11: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/11.jpg)
Multiple-line macros (cont)โข Multi-line macros can be overloaded by defining the same macro
name several times with different amounts of parameters. (This time, no exception is made for macros with no parameters.)
โข Reserved words can also be overloaded:
Example:%macro push 2
push %1push %2
%endmacro
push ebx ; this line is not a macro call push eax, ecx ; but this one is a macro call
Note: if define macro โpushโ with one parameter, the original โpushโ instruction would be overloaded.
![Page 12: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/12.jpg)
Multiple-line macros โ labelsDefining a macro with an internal label:
%macro retz 0 jnz %%skip ret %%skip:%endmacro
In every โretzโ invocation, the preprocessor creates some unique label of the form: [email protected] to substitute for the label %%skip, where the number 2345 changes with every macro call.
If a label begins with the special prefix ..@, then it doesnโt interfere with the local label mechanism.
label1: ; a non-local label..@ 2345.skip : ; this is a macro label.local: ; this is really label1.local
![Page 13: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/13.jpg)
Default Macro Parameters
We supply a minimum and maximum number of parameters for a macro of this type; the minimum number of parameters are required in the macro call, and we provide defaults for the optional ones.
Example:
%macro foo 1-3 eax, [ebx+2]
โข could be called with between one and three parametersโข %1 would always be taken from the macro call (minimal number of parameters)โข %2, if not specified by the macro call, would default to eaxโข %3, if not specified by the macro call, would default to [ebx+2]
We may omit parameter defaults from the macro definition, in which case the parameter default is taken to be blank. This can be useful for macros which can take a variable number of parameters, since the %0 token allows us to determine how many parameters were really passed to the macro call.
%macro name min - max <default parameters list>
![Page 14: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/14.jpg)
Greedy Macro ParametersIf invoke the macro with more parameters than it expects, all the spare parameters get lumped into the last defined one.
%macro macroName numOfParams +
The mark %numOfParams will be replaced with numOfParamsโs parameter and whatever follows it.
Example:%macro writefile 2+ jmp %%endstr %%str: db %2 %%endstr: mov dx, %%str mov cx, %%endstr - %%str mov bx, %1 mov ah, 0x40 int 0x21%endmacro
writefile [fileHandle],"hello, world",13,10
![Page 15: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/15.jpg)
Macro ExpansionUse โe option to get a source code with all your macros expanded.
> nasm -e sample.s
![Page 16: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/16.jpg)
Jump tableโข Jump table is
โ a graceful way to implement โswitch - caseโ mechanismโ used to select a function to be evoked
โข We will construct a array of the jump addresses.โข For each number will jump to the corresponding entry in the
jump table.switch ( letter ) { case 'A': upper ++; case โa': lower ++; default : total ++;}
![Page 17: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/17.jpg)
main.cextern void jumper(int);int main (int argc , char* argv){
jumper (0);jumper (1);jumper (2);return 0;
}
Jump table - example
jumper(i) should be implemented as follows:
printf (โnum = %dโ, i);switch (i) { case โ0': printf (โGot the number 0โ); case โ1': printf (โGot the number 1โ); default : printf (โOut of boundโ);}
Output:
num = 0Got the number 0num = 1Got the number 1num = 2Out of bound
![Page 18: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/18.jpg)
section .datajt: dd label_1
dd label_2
str0: db "Got the number 0",10,0str1: db "Got the number 1",10,0str2: db "Out of bound",10,0str3: db "num = %d",10,0
section .textglobal jumperextern printf
jumper:push ebpmov ebp, esppushamov ebx, dword [ebp+8]push ebxpush str3call printf ; print numadd esp, 8cmp ebx,0 ; check if num is in boundsjb out_ofcmp ebx , 1ja out_ofshl ebx,2 ; num = num * 4jmp dword [ebx + jt] ; jump according to address
; in table
label_1: push str0call printfadd esp, 4jmp end
label_2: push str1call printfadd esp, 4jmp end
out_of: push str2call printfadd esp, 4jmp end
end: popapop ebpret
Jump table - example
to b
e ab
le to
jum
p in
a ta
ble
of d
wor
ds
printf (โnum = %dโ, i);switch (i) { case โ0': printf (โGot the number 0โ); case โ1': printf (โGot the number 1โ); default : printf (โOut of boundโ);}
![Page 19: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/19.jpg)
ืืืืื ืืืจื ืฉืืืืช
![Page 20: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/20.jpg)
1ืฉืืื : ืืืืืช ืืืืืจืืช ื ืชืื ืืช
x: dw 1y: db 2z: db 3
ืืช ืืืืคืื -x,y,zืืฉ . 2ื ืืืช ืคืงืืื ืืืืฆืขืืชืฉืืื ืืื ืื overflowื ืืชื
![Page 21: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/21.jpg)
1ืฉืืื : ืืืืืช ืืืืืจืืช ื ืชืื ืืช
x: dw 1y: db 2z: db 3
ืืช ืืืืคืื -x,y,zืืฉ . 2ื ืืืช ืคืงืืื ืืืืฆืขืืชืฉืืื ืืื ืื overflowื ืืชื
- ืชืฉืืื: ื ืืืืื ืื ืืช :2ื ืืคืื
shl dword [x], 1
![Page 22: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/22.jpg)
2ืฉืืื , ืืจืืืื ืืื ืืื ืืคืื ืงืฆืื ืงืจืืื ืืืืฉ ืขืืื ื
ืืจืืืกืืจ ื ืืฆืืช ืืช. eaxืฉืืชืืืชื ืืกืื ืืฉืฉ .ืืืืงืื ื ืืื ืืืช ืืืฆืข
a) push next_apush eaxretnext_a:
b) push eaxpush eaxret
c) push next_ajmp eaxnext_a:
d) call eax
![Page 23: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/23.jpg)
2ืฉืืื , ืืจืืืื ืืื ืืื ืืคืื ืงืฆืื ืงืจืืื ืืืืฉ ืขืืื ื
ืืจืืืกืืจ ื ืืฆืืช ืืช. eaxืฉืืชืืืชื ืืกืื ืืฉืฉ .ืืืืงืื ื ืืื ืืืช ืืืฆืข
a) push next_apush eaxretnext_a:
b) push eaxpush eaxret
c) push next_ajmp eaxnext_a:
d) call eax
![Page 24: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/24.jpg)
3ืฉืืื ืืขืจื -eaxืืจืืืกืืจ ืืจืฉืื. 1ื ืืฆื 5ืืฉ
ืืื ืฉืื ืืชืคืงืืืืช ืชืืจืื ืืื ืืืช ืฉืืืืขืจื eaxืฉืืจืืืกืืจ .1ืืืื
![Page 25: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/25.jpg)
3ืฉืืื ืืขืจื -eaxืืจืืืกืืจ ืืจืฉืื. 1ื ืืฆื 5ืืฉ
ืืื ืฉืื ืืชืคืงืืืืช ืชืืจืื ืืื ืืืช ืฉืืืืขืจื eaxืฉืืจืืืกืืจ .1ืืืื
ืชืฉืืื
mov eax, 1add eax, 2neg eaxshr eax, 31and eax, 1
![Page 26: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/26.jpg)
4ืฉืืื ืืืืจืช :macroื ืชืื ื , ืืืืจืื ื ืชืื ืื ืืื ืืืื
%macro print 3pushamov eax, 4 ; writemov ebx, %1 ; file descriptormov ecx, %2 ; addressmov edx, %3 ; byte countint 0x80popa
%endmacrosection .rodataFile: dd 1MJ: db โBeat itโ, 10, 0
: ืืชืืื ืืช ืฉื ื ืืื ื ืื ืืคืขืืื ืืืจืื ืืืงืจื ืืืืื ืืืฉืืืืฉืื ืืืืa) mov ebx, MJ
print 1, ebx, 9b) print 1, MJ, 9c) print dword [File], MJ, 9d) mov edx, 9
print 1, MJ, edx
![Page 27: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/27.jpg)
4ืฉืืื ืืืืจืช :macroื ืชืื ื , ืืืืจืื ื ืชืื ืื ืืื ืืืื
%macro print 3pushamov eax, 4 ; writemov ebx, %1 ; file descriptormov ecx, %2 ; addressmov edx, %3 ; byte countint 0x80popa
%endmacrosection .rodataFile: dd 1MJ: db โBeat itโ, 10, 0
: ืืชืืื ืืช ืฉื ื ืืื ื ืื ืืคืขืืื ืืืจืื ืืืงืจื ืืืืื ืืืฉืืืืฉืื ืืืืa) mov ebx, MJ
print 1, ebx, 9b) print 1, MJ, 9c) print dword [File], MJ, 9d) mov edx, 9
print 1, MJ, edx
![Page 28: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/28.jpg)
5ืฉืืื : ืืื ืืงืื ืงืืข ืืช ืืืืฉ ืขืืื ืint a, b, x;x = blah(a,&b)
ื ืืื ? ืืืช ืฉืืืฆืข ืืงืื ืงืืข ืืืa) push a c) push dword b push b push dword [a] call blah call blah add esp, 8 add esp, 8 mov [x], eax mov [x], eax
b) push dword [b] d) push dword [b] push dword a push dword a call blah call blah add esp, 8 add esp, 8 mov [x], eax pop dword [x]
![Page 29: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/29.jpg)
5ืฉืืื : ืืื ืืงืื ืงืืข ืืช ืืืืฉ ืขืืื ืint a, b, x;x = blah(a,&b)
ื ืืื ? ืืืช ืฉืืืฆืข ืืงืื ืงืืข ืืืa) push a c) push dword b push b push dword [a] call blah call blah add esp, 8 add esp, 8 mov [x], eax mov [x], eax
b) push dword [b] d) push dword [b] push dword a push dword a call blah call blah add esp, 8 add esp, 8 mov [x], eax pop dword [x]
![Page 30: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/30.jpg)
6ืฉืืื Gloat: shl ebx, 2
jmp [ebx+Tab] Tab: dd F4
dd F3dd F2dd F1
F1: add ebx, 4F2: add ebx, 4F3: add ebx, 4F4: shr ebx, 2
ret
ืืคืื ืงืฆืื ืชืืืืจ - 0ืืื ebxืขืืืจ ) ebxืืจืืืกืืจ Gloatืื ( ?3ื
( 0ื( ( 2ืืืืงืช ebxื ( ebxืืืืงืช 2ื 2ืืคืื ebxื
![Page 31: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/31.jpg)
6ืฉืืื Gloat: shl ebx, 2
jmp [ebx+Tab] Tab: dd F4
dd F3dd F2dd F1
F1: add ebx, 4F2: add ebx, 4F3: add ebx, 4F4: shr ebx, 2
ret
ืืคืื ืงืฆืื ืชืืืืจ - 0ืืื ebxืขืืืจ ) ebxืืจืืืกืืจ Gloatืื ( ?3ื
( 0ื( ( 2ืืืืงืช ebxื 2ืืคืื ebxื( ebxืืืืงืช 2ื
![Page 32: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/32.jpg)
7ืฉืืื โข , - ืขืจื ืืช ืฉืืืคืื ืคืขืื ืจื ืืฉืืืืฉ ืงืื ืืืชืื : 2ืืืฆืขืืช. 3ืคื eaxืืจืฆืื ื ื ืืคืฉืจืืืืช
ืืืงืจื ืืคืื ืงืฆืื tripleืฉืืืืฉ ืงืจืืื : Tripleืืโข %macro triple 0
mov ebx, eaxadd eax, eaxadd eax, ebx
%endmacroโข Triple: mov ebx, eax
add eax, eax add eax, ebx
ret- ื( ืจืืฆื ืืืื .2ื ืืืฆืืข ืืื ืืืชื ืืืคืฉืจืืืืช
- ื( ืืฉืืืืฉ .macroื , ืืงืื ืืืืจืื ืืืชืจ ืืืจืฉ ืืื ืืืชืจ ืืืืจ. , ืืงืื( ืืืืจืื ืืืชืจ ืืืจืฉ ืืื ืืืชืจ ืืืืจ ืืคืื ืงืฆืื ืืฉืืืืฉ ื
ืืคืื ืงืฆืื( , Tripleื ืืืืืกื ืืช ืืฉืชื ืื ืืืฆืืื ืื ืืื ืื ืืขืืื ืืืืื ืื
![Page 33: Practical Session 6](https://reader036.vdocuments.us/reader036/viewer/2022062305/5681654a550346895dd7c0c9/html5/thumbnails/33.jpg)
7ืฉืืื โข , - ืขืจื ืืช ืฉืืืคืื ืคืขืื ืจื ืืฉืืืืฉ ืงืื ืืืชืื : 2ืืืฆืขืืช. 3ืคื eaxืืจืฆืื ื ื ืืคืฉืจืืืืช
ืืืงืจื ืืคืื ืงืฆืื tripleืฉืืืืฉ ืงืจืืื : Tripleืืโข %macro triple 0
mov ebx, eaxadd eax, eaxadd eax, ebx
%endmacroโข Triple: mov ebx, eax
add eax, eax add eax, ebx
ret- ื( ืจืืฆื ืืืื .2ื ืืืฆืืข ืืื ืืืชื ืืืคืฉืจืืืืช
- ื( ืืฉืืืืฉ .macroื , ืืงืื ืืืืจืื ืืืชืจ ืืืจืฉ ืืื ืืืชืจ ืืืืจ. , ืืงืื( ืืืืจืื ืืืชืจ ืืืจืฉ ืืื ืืืชืจ ืืืืจ ืืคืื ืงืฆืื ืืฉืืืืฉ ื
ืืคืื ืงืฆืื( , Tripleื ืืืืืกื ืืช ืืฉืชื ืื ืืืฆืืื ืื ืืื ืื ืืขืืื ืืืืื ืื