📄 aoutso.asm
字号:
; test source file for assembling to NetBSD/FreeBSD a.out shared library; build with:; nasm -f aoutb aoutso.asm; ld -Bshareable -o aoutso.so aoutso.o; test with:; cc -o aoutso aouttest.c aoutso.so; ./aoutso; This file should test the following:; [1] Define and export a global text-section symbol; [2] Define and export a global data-section symbol; [3] Define and export a global BSS-section symbol; [4] Define a non-global text-section symbol; [5] Define a non-global data-section symbol; [6] Define a non-global BSS-section symbol; [7] Define a COMMON symbol; [8] Define a NASM local label; [9] Reference a NASM local label; [10] Import an external symbol; [11] Make a PC-relative call to an external symbol; [12] Reference a text-section symbol in the text section; [13] Reference a data-section symbol in the text section; [14] Reference a BSS-section symbol in the text section; [15] Reference a text-section symbol in the data section; [16] Reference a data-section symbol in the data section; [17] Reference a BSS-section symbol in the data section BITS 32 EXTERN __GLOBAL_OFFSET_TABLE_ GLOBAL _lrotate:function ; [1] GLOBAL _greet:function ; [1] GLOBAL _asmstr:data _asmstr.end-_asmstr ; [2] GLOBAL _textptr:data 4 ; [2] GLOBAL _selfptr:data 4 ; [2] GLOBAL _integer:data 4 ; [3] EXTERN _printf ; [10] COMMON _commvar 4 ; [7] SECTION .text; prototype: long lrotate(long x, int num);_lrotate: ; [1] push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12].label rol eax,1 ; [4] [8] loop .label ; [9] [12] mov esp,ebp pop ebp ret; prototype: void greet(void);_greet push ebx ; we'll use EBX for GOT, so save it call .getgot.getgot: pop ebx add ebx,__GLOBAL_OFFSET_TABLE_ + $$ - .getgot wrt ..gotpc mov eax,[ebx+_integer wrt ..got] ; [14] mov eax,[eax] inc eax mov [ebx+localint wrt ..gotoff],eax ; [14] mov eax,[ebx+_commvar wrt ..got] push dword [eax] mov eax,[ebx+localptr wrt ..gotoff] ; [13] push dword [eax] mov eax,[ebx+_integer wrt ..got] ; [1] [14] push dword [eax] lea eax,[ebx+_printfstr wrt ..gotoff] push eax ; [13] call _printf wrt ..plt ; [11] add esp,16 pop ebx ret SECTION .data; a string_asmstr db 'hello, world', 0 ; [2].end; a string for Printf_printfstr db "integer==%d, localint==%d, commvar=%d" db 10, 0; some pointerslocalptr dd localint ; [5] [17]_textptr dd _greet wrt ..sym ; [15]_selfptr dd _selfptr wrt ..sym ; [16] SECTION .bss; an integer_integer resd 1 ; [3]; a local integerlocalint resd 1 ; [6]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -