mirror of
https://github.com/netwide-assembler/nasm.git
synced 2024-11-27 08:10:07 +08:00
a7b6bfca68
Make the internal handling of segment numbers just a little more sane. The whole use of when we have done ofmt->segbase or not is crazy, though... In the meantime, add a few more hacks to the dbg output format to make it more useful. Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
88 lines
2.1 KiB
NASM
88 lines
2.1 KiB
NASM
;Testname=unoptimized; Arguments=-O0 -fobj -oobj.o; Files=stdout stderr obj.o
|
|
;Testname=optimized; Arguments=-Ox -fobj -oobj.o; Files=stdout stderr obj.o
|
|
|
|
; test source file for assembling to Microsoft 16-bit .OBJ
|
|
; build with (16-bit Microsoft C):
|
|
; nasm -f obj objtest.asm
|
|
; cl /AL objtest.obj objlink.c
|
|
; other compilers should work too, provided they handle large
|
|
; model in the same way as MS C
|
|
|
|
; This file should test the following:
|
|
; [1] Define and export a global symbol
|
|
; [2] Define a non-global symbol
|
|
; [3] Define a common symbol
|
|
; [4] Define a NASM local label
|
|
; [5] Reference a NASM local label
|
|
; [6] Import an external symbol
|
|
; [7] Make a PC-relative relocated reference
|
|
; [8] Reference a symbol in the same section as itself
|
|
; [9] Reference a symbol in a different segment from itself
|
|
; [10] Define a segment group
|
|
; [11] Take the offset of a symbol in a grouped segment w.r.t. its segment
|
|
; [12] Reserve uninitialised data space in a segment
|
|
; [13] Directly take the segment address of a segment
|
|
; [14] Directly take the segment address of a group
|
|
; [15] Use SEG on a non-external
|
|
; [16] Use SEG on an external
|
|
|
|
bits 16
|
|
|
|
global _bsssym ; [1]
|
|
global _function ; [1]
|
|
global _selfptr ; [1]
|
|
global _selfptr2 ; [1]
|
|
common _commvar 2 ; [3]
|
|
extern _printf ; [6]
|
|
|
|
group mygroup mybss mydata
|
|
group mygroup2 mycode mycode2
|
|
|
|
segment mycode private
|
|
|
|
_function push bp
|
|
mov bp,sp
|
|
push ds
|
|
mov ax,mygroup ; [14]
|
|
mov ds,ax
|
|
inc word [_bsssym] ; [9]
|
|
mov ax,seg _commvar
|
|
mov ds,ax
|
|
dec word [_commvar]
|
|
pop ds
|
|
mov ax,[bp+6]
|
|
mov dx,[bp+8]
|
|
push dx
|
|
push ax
|
|
push dx
|
|
push ax
|
|
call far [cs:.printf] ; [5] [8]
|
|
pop ax
|
|
pop ax
|
|
call trampoline ; [7]
|
|
pop ax
|
|
pop ax
|
|
mov sp,bp
|
|
pop bp
|
|
retf
|
|
|
|
.printf dw _printf, seg _printf ; [2] [4] [16]
|
|
.printfd dd _printf, seg _printf ; [2] [4] [16]
|
|
.printfq dq _printf, seg _printf ; [2] [4] [16]
|
|
|
|
segment mycode2 private
|
|
|
|
trampoline: pop ax
|
|
push cs
|
|
push ax
|
|
jmp far _printf
|
|
|
|
segment mybss private
|
|
|
|
_bsssym resw 64 ; [12]
|
|
|
|
segment mydata private
|
|
|
|
_selfptr dw _selfptr, seg _selfptr ; [8] [15]
|
|
_selfptr2 dw _selfptr2 wrt mydata, mydata ; [11] [13]
|