[Nasm-bugs] [Bug 3392602] git nasm: segmentation fault when assembling lmacros tests

noreply-nasm at gorcunov.org noreply-nasm at gorcunov.org
Wed Aug 21 10:04:13 PDT 2019


https://bugzilla.nasm.us/show_bug.cgi?id=3392602

--- Comment #10 from C. Masloch <pushbx at 38.de> ---
Did some more tests:

(nasm is
https://repo.or.cz/nasm.git/commitdiff/7eb18213b78f06b45c85e2b224613cce4a20304b
)


$ nasm -v
NASM version 2.15rc0 compiled on Aug 21 2019
$ ./tes.sh 0 nasm -DREPEAT=1 -DPARAM2
nasm test.asm -DP1 -DREPEAT=1 -DPARAM2
test.asm:38: warning: case p1 [-w+user]
nasm test.asm -DP2 -DREPEAT=1 -DPARAM2
test.asm:28: warning: case p2 [-w+user]
test.asm:69: warning: multi-line macro `call' exists, but not taking 1
parameter [-w+macro-params-multi]
test.asm:69: warning: multi-line macro `call' exists, but not taking 1
parameter [-w+macro-params-multi]
test.asm:69: warning: multi-line macro `call' exists, but not taking 1
parameter [-w+macro-params-multi]
nasm test.asm -DP3 -DREPEAT=1 -DPARAM2
test.asm:15: warning: case p3 [-w+user]
test.asm:69: warning: multi-line macro `call' exists, but not taking 1
parameter [-w+macro-params-multi]
test.asm:69: warning: multi-line macro `call' exists, but not taking 1
parameter [-w+macro-params-multi]
test.asm:69: warning: multi-line macro `call' exists, but not taking 1
parameter [-w+macro-params-multi]
nasm test.asm -DP4 -DREPEAT=1 -DPARAM2
test.asm:2: warning: case p4 [-w+user]


p3 with the call 2-* definition then call 1 causes the warnings about
non-matching mmacro. p4 (which reverses the definitions to call 1 then call
2-*) does not cause these warnings.


$ ./tes.sh 1 nasm -DPARAM2 -w-macro-params
time nasm test.asm -DP1 -DPARAM2 -w-macro-params
test.asm:38: warning: case p1 [-w+user]

real    0m10.176s
user    0m9.349s
sys     0m0.797s
time nasm test.asm -DP2 -DPARAM2 -w-macro-params
test.asm:28: warning: case p2 [-w+user]

real    0m5.739s
user    0m5.460s
sys     0m0.221s
time nasm test.asm -DP3 -DPARAM2 -w-macro-params
test.asm:15: warning: case p3 [-w+user]

real    0m7.264s
user    0m6.996s
sys     0m0.254s
time nasm test.asm -DP4 -DPARAM2 -w-macro-params
test.asm:2: warning: case p4 [-w+user]

real    0m7.427s
user    0m7.133s
sys     0m0.269s


p1 (call 1-*) takes the longest, p2 (only call 2-*) is the fastest (but causes
the warnings when not suppressed), p3 and p4 are about equal.


$ oldnasm -v
NASM version 2.15rc0 compiled on Dec 28 2018
$ ./tes.sh 0 oldnasm -DREPEAT=1 -DPARAM2
oldnasm test.asm -DP1 -DREPEAT=1 -DPARAM2
test.asm:38: warning: case p1 [-w+user]
oldnasm test.asm -DP2 -DREPEAT=1 -DPARAM2
test.asm:28: warning: case p2 [-w+user]
test.asm:69: warning: (call:1) macro `call' exists, but not taking 1 parameters
[-w+macro-params]
test.asm:69: warning: macro `call' exists, but not taking 1 parameters
[-w+macro-params]
test.asm:69: warning: macro `call' exists, but not taking 1 parameters
[-w+macro-params]
test.asm:69: warning: macro `call' exists, but not taking 1 parameters
[-w+macro-params]
oldnasm test.asm -DP3 -DREPEAT=1 -DPARAM2
test.asm:15: warning: case p3 [-w+user]
oldnasm test.asm -DP4 -DREPEAT=1 -DPARAM2
test.asm:2: warning: case p4 [-w+user]


This does not cause warnings for either p3 or p4.


$ ./tes.sh 1 oldnasm -DPARAM2 -w-macro-params
time oldnasm test.asm -DP1 -DPARAM2 -w-macro-params
test.asm:38: warning: case p1 [-w+user]

real    0m9.304s
user    0m8.563s
sys     0m0.728s
time oldnasm test.asm -DP2 -DPARAM2 -w-macro-params
test.asm:28: warning: case p2 [-w+user]

real    0m4.961s
user    0m4.743s
sys     0m0.203s
time oldnasm test.asm -DP3 -DPARAM2 -w-macro-params
test.asm:15: warning: case p3 [-w+user]

real    0m5.905s
user    0m5.690s
sys     0m0.191s
time oldnasm test.asm -DP4 -DPARAM2 -w-macro-params
test.asm:2: warning: case p4 [-w+user]

real    0m5.887s
user    0m5.700s
sys     0m0.181s


The timing is roughly the same for all cases! The times are slightly shorter
though.


$ /usr/bin/nasm -v
NASM version 2.12.01
$ ./tes.sh 0 /usr/bin/nasm -DREPEAT=1 -DPARAM2
/usr/bin/nasm test.asm -DP1 -DREPEAT=1 -DPARAM2
/usr/bin/nasm test.asm -DP2 -DREPEAT=1 -DPARAM2
test.asm:69: warning: (call:1) macro `call' exists, but not taking 1 parameters
test.asm:69: warning: macro `call' exists, but not taking 1 parameters
test.asm:69: warning: macro `call' exists, but not taking 1 parameters
test.asm:69: warning: macro `call' exists, but not taking 1 parameters
/usr/bin/nasm test.asm -DP3 -DREPEAT=1 -DPARAM2
/usr/bin/nasm test.asm -DP4 -DREPEAT=1 -DPARAM2


Again p3 and p4 both do not cause any warnings. (So, the git nasm's warnings
for p3 are regressions.) p2 causes a warning even for the "%? %1" call in the
2-* macro.


$ ./tes.sh 1 /usr/bin/nasm -DPARAM2 -w-macro-params
time /usr/bin/nasm test.asm -DP1 -DPARAM2 -w-macro-params

real    0m8.540s
user    0m8.510s
sys     0m0.007s
time /usr/bin/nasm test.asm -DP2 -DPARAM2 -w-macro-params

real    0m4.344s
user    0m4.329s
sys     0m0.005s
time /usr/bin/nasm test.asm -DP3 -DPARAM2 -w-macro-params

real    0m6.357s
user    0m6.337s
sys     0m0.008s
time /usr/bin/nasm test.asm -DP4 -DPARAM2 -w-macro-params

real    0m5.912s
user    0m5.897s
sys     0m0.007s


The timing is relatively the same.


$ cat tes.sh
#! /bin/bash

usetime="$1"
shift

asm="$1"
shift

if (( "$usetime" )); then {
        echo time "$asm" test.asm -DP1 "$@"
        time "$asm" test.asm -DP1 "$@"
        echo time "$asm" test.asm -DP2 "$@"
        time "$asm" test.asm -DP2 "$@"
        echo time "$asm" test.asm -DP3 "$@"
        time "$asm" test.asm -DP3 "$@"
        echo time "$asm" test.asm -DP4 "$@"
        time "$asm" test.asm -DP4 "$@"
} fi

if (( "$usetime" == 0 )); then {
        echo "$asm" test.asm -DP1 "$@"
        "$asm" test.asm -DP1 "$@"
        echo "$asm" test.asm -DP2 "$@"
        "$asm" test.asm -DP2 "$@"
        echo "$asm" test.asm -DP3 "$@"
        "$asm" test.asm -DP3 "$@"
        echo "$asm" test.asm -DP4 "$@"
        "$asm" test.asm -DP4 "$@"
} fi
$ cat test.asm
%ifdef P4
%warning case p4
        %imacro call 1.nolist
                %? %1
        %endmacro
                ; Call with word parameters behind opcode
        %imacro call 2-*.nolist
                %? %1
%rep %0 - 1
%rotate 1
                dw %1
%endrep
        %endmacro
%elifdef P3
%warning case p3
                ; Call with word parameters behind opcode
        %imacro call 2-*.nolist
                %? %1
%rep %0 - 1
%rotate 1
                dw %1
%endrep
        %endmacro
        %imacro call 1.nolist
                %? %1
        %endmacro
%elifdef P2
%warning case p2
                ; Call with word parameters behind opcode
        %imacro call 2-*.nolist
                %? %1
%rep %0 - 1
%rotate 1
                dw %1
%endrep
        %endmacro
%else
%warning case p1
                ; Call with word parameters behind opcode
        %imacro call 1-*.nolist
                %? %1
%rep %0 - 1
%rotate 1
                dw %1
%endrep
        %endmacro
%endif

%ifndef REPEAT
 %assign REPEAT 100_000
%endif

%ifndef PARAM1
 %define PARAM1 , 26h
%endif
%ifndef PARAM2
 %define PARAM2 , 26h
%endif

        cpu 386
        bits 32
        org 0

%rep REPEAT
        call alpha PARAM1
        call beta PARAM2
        call gamma PARAM2
        call delta PARAM2
%endrep

alpha:
        nop
        nop
        nop
beta:
        nop
        nop
        nop
gamma:
        nop
        nop
        nop
delta:
        nop
        nop
        nop

$

-- 
You are receiving this mail because:
You are on the CC list for the bug.
You are watching all bug changes.


More information about the Nasm-bugs mailing list