mirror of
https://github.com/yasm/yasm
synced 2026-08-26 22:26:05 -04:00
x86/gas: Fix no-suffix push and pop.
Previously plain "push" and "pop" would always generate a 16-bit pop (for effective address versions). Reported by: Alexei Svitkine [#212 state:resolved]
This commit is contained in:
parent
f12d030f90
commit
0614dede9b
4 changed files with 533 additions and 0 deletions
|
|
@ -1132,6 +1132,10 @@ add_insn("movsxd", "movsxd", parser="nasm")
|
|||
#
|
||||
# Push instructions
|
||||
#
|
||||
add_group("push",
|
||||
def_opersize_64=64,
|
||||
opcode=[0x50],
|
||||
operands=[Operand(type="Reg", size="BITS", dest="Op0Add")])
|
||||
add_group("push",
|
||||
suffix="w",
|
||||
opersize=16,
|
||||
|
|
@ -1146,9 +1150,16 @@ add_group("push",
|
|||
operands=[Operand(type="Reg", size=32, dest="Op0Add")])
|
||||
add_group("push",
|
||||
suffix="q",
|
||||
only64=True,
|
||||
def_opersize_64=64,
|
||||
opcode=[0x50],
|
||||
operands=[Operand(type="Reg", size=64, dest="Op0Add")])
|
||||
|
||||
add_group("push",
|
||||
def_opersize_64=64,
|
||||
opcode=[0xFF],
|
||||
spare=6,
|
||||
operands=[Operand(type="RM", size="BITS", dest="EA")])
|
||||
add_group("push",
|
||||
suffix="w",
|
||||
opersize=16,
|
||||
|
|
@ -1165,10 +1176,12 @@ add_group("push",
|
|||
operands=[Operand(type="RM", size=32, dest="EA")])
|
||||
add_group("push",
|
||||
suffix="q",
|
||||
only64=True,
|
||||
def_opersize_64=64,
|
||||
opcode=[0xFF],
|
||||
spare=6,
|
||||
operands=[Operand(type="RM", size=64, dest="EA")])
|
||||
|
||||
add_group("push",
|
||||
cpu=["186"],
|
||||
parsers=["nasm"],
|
||||
|
|
@ -1339,6 +1352,10 @@ add_insn("pushaw", "onebyte", modifiers=[0x60, 16], cpu=["186"], not64=True)
|
|||
#
|
||||
# Pop instructions
|
||||
#
|
||||
add_group("pop",
|
||||
def_opersize_64=64,
|
||||
opcode=[0x58],
|
||||
operands=[Operand(type="Reg", size="BITS", dest="Op0Add")])
|
||||
add_group("pop",
|
||||
suffix="w",
|
||||
opersize=16,
|
||||
|
|
@ -1353,9 +1370,15 @@ add_group("pop",
|
|||
operands=[Operand(type="Reg", size=32, dest="Op0Add")])
|
||||
add_group("pop",
|
||||
suffix="q",
|
||||
only64=True,
|
||||
def_opersize_64=64,
|
||||
opcode=[0x58],
|
||||
operands=[Operand(type="Reg", size=64, dest="Op0Add")])
|
||||
|
||||
add_group("pop",
|
||||
def_opersize_64=64,
|
||||
opcode=[0x8F],
|
||||
operands=[Operand(type="RM", size="BITS", dest="EA")])
|
||||
add_group("pop",
|
||||
suffix="w",
|
||||
opersize=16,
|
||||
|
|
@ -1370,9 +1393,11 @@ add_group("pop",
|
|||
operands=[Operand(type="RM", size=32, dest="EA")])
|
||||
add_group("pop",
|
||||
suffix="q",
|
||||
only64=True,
|
||||
def_opersize_64=64,
|
||||
opcode=[0x8F],
|
||||
operands=[Operand(type="RM", size=64, dest="EA")])
|
||||
|
||||
# POP CS is debateably valid on the 8086, if obsolete and undocumented.
|
||||
# We don't include it because it's VERY unlikely it will ever be used
|
||||
# anywhere. If someone really wants it they can db 0x0F it.
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ EXTRA_DIST += modules/arch/x86/tests/gas32/gas-movdq32.asm
|
|||
EXTRA_DIST += modules/arch/x86/tests/gas32/gas-movdq32.hex
|
||||
EXTRA_DIST += modules/arch/x86/tests/gas32/gas-movsd.asm
|
||||
EXTRA_DIST += modules/arch/x86/tests/gas32/gas-movsd.hex
|
||||
EXTRA_DIST += modules/arch/x86/tests/gas32/gas-pop.asm
|
||||
EXTRA_DIST += modules/arch/x86/tests/gas32/gas-pop.hex
|
||||
EXTRA_DIST += modules/arch/x86/tests/gas32/gas32-jmpcall.asm
|
||||
EXTRA_DIST += modules/arch/x86/tests/gas32/gas32-jmpcall.hex
|
||||
|
||||
|
|
|
|||
50
modules/arch/x86/tests/gas32/gas-pop.asm
Normal file
50
modules/arch/x86/tests/gas32/gas-pop.asm
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
.code64
|
||||
push %cx # out: 66 51
|
||||
pop %cx # out: 66 59
|
||||
push %rcx # out: 51
|
||||
pop %rcx # out: 59
|
||||
pushw %cx # out: 66 51
|
||||
popw %cx # out: 66 59
|
||||
pushq %rcx # out: 51
|
||||
popq %rcx # out: 59
|
||||
|
||||
push -24(%rcx) # out: ff 71 e8
|
||||
pop -24(%rcx) # out: 8f 41 e8
|
||||
pushw -24(%rcx) # out: 66 ff 71 e8
|
||||
popw -24(%rcx) # out: 66 8f 41 e8
|
||||
pushq -24(%rcx) # out: ff 71 e8
|
||||
popq -24(%rcx) # out: 8f 41 e8
|
||||
|
||||
.code32
|
||||
push %cx # out: 66 51
|
||||
pop %cx # out: 66 59
|
||||
push %ecx # out: 51
|
||||
pop %ecx # out: 59
|
||||
pushw %cx # out: 66 51
|
||||
popw %cx # out: 66 59
|
||||
pushl %ecx # out: 51
|
||||
popl %ecx # out: 59
|
||||
|
||||
push -24(%ecx) # out: ff 71 e8
|
||||
pop -24(%ecx) # out: 8f 41 e8
|
||||
pushw -24(%ecx) # out: 66 ff 71 e8
|
||||
popw -24(%ecx) # out: 66 8f 41 e8
|
||||
pushl -24(%ecx) # out: ff 71 e8
|
||||
popl -24(%ecx) # out: 8f 41 e8
|
||||
|
||||
.code16
|
||||
push %cx # out: 51
|
||||
pop %cx # out: 59
|
||||
push %ecx # out: 66 51
|
||||
pop %ecx # out: 66 59
|
||||
pushw %cx # out: 51
|
||||
popw %cx # out: 59
|
||||
pushl %ecx # out: 66 51
|
||||
popl %ecx # out: 66 59
|
||||
|
||||
push -24(%bp) # out: ff 76 e8
|
||||
pop -24(%bp) # out: 8f 46 e8
|
||||
pushw -24(%bp) # out: ff 76 e8
|
||||
popw -24(%bp) # out: 8f 46 e8
|
||||
pushl -24(%bp) # out: 66 ff 76 e8
|
||||
popl -24(%bp) # out: 66 8f 46 e8
|
||||
456
modules/arch/x86/tests/gas32/gas-pop.hex
Normal file
456
modules/arch/x86/tests/gas32/gas-pop.hex
Normal file
|
|
@ -0,0 +1,456 @@
|
|||
7f
|
||||
45
|
||||
4c
|
||||
46
|
||||
01
|
||||
01
|
||||
01
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
01
|
||||
00
|
||||
03
|
||||
00
|
||||
01
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
01
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
34
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
28
|
||||
00
|
||||
05
|
||||
00
|
||||
01
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
66
|
||||
51
|
||||
66
|
||||
59
|
||||
51
|
||||
59
|
||||
66
|
||||
51
|
||||
66
|
||||
59
|
||||
51
|
||||
59
|
||||
ff
|
||||
71
|
||||
e8
|
||||
8f
|
||||
41
|
||||
e8
|
||||
66
|
||||
ff
|
||||
71
|
||||
e8
|
||||
66
|
||||
8f
|
||||
41
|
||||
e8
|
||||
ff
|
||||
71
|
||||
e8
|
||||
8f
|
||||
41
|
||||
e8
|
||||
66
|
||||
51
|
||||
66
|
||||
59
|
||||
51
|
||||
59
|
||||
66
|
||||
51
|
||||
66
|
||||
59
|
||||
51
|
||||
59
|
||||
ff
|
||||
71
|
||||
e8
|
||||
8f
|
||||
41
|
||||
e8
|
||||
66
|
||||
ff
|
||||
71
|
||||
e8
|
||||
66
|
||||
8f
|
||||
41
|
||||
e8
|
||||
ff
|
||||
71
|
||||
e8
|
||||
8f
|
||||
41
|
||||
e8
|
||||
51
|
||||
59
|
||||
66
|
||||
51
|
||||
66
|
||||
59
|
||||
51
|
||||
59
|
||||
66
|
||||
51
|
||||
66
|
||||
59
|
||||
ff
|
||||
76
|
||||
e8
|
||||
8f
|
||||
46
|
||||
e8
|
||||
ff
|
||||
76
|
||||
e8
|
||||
8f
|
||||
46
|
||||
e8
|
||||
66
|
||||
ff
|
||||
76
|
||||
e8
|
||||
66
|
||||
8f
|
||||
46
|
||||
e8
|
||||
00
|
||||
2e
|
||||
74
|
||||
65
|
||||
78
|
||||
74
|
||||
00
|
||||
2e
|
||||
73
|
||||
74
|
||||
72
|
||||
74
|
||||
61
|
||||
62
|
||||
00
|
||||
2e
|
||||
73
|
||||
79
|
||||
6d
|
||||
74
|
||||
61
|
||||
62
|
||||
00
|
||||
2e
|
||||
73
|
||||
68
|
||||
73
|
||||
74
|
||||
72
|
||||
74
|
||||
61
|
||||
62
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
2d
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
01
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
04
|
||||
00
|
||||
f1
|
||||
ff
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
03
|
||||
00
|
||||
04
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
17
|
||||
00
|
||||
00
|
||||
00
|
||||
03
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
a0
|
||||
00
|
||||
00
|
||||
00
|
||||
21
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
07
|
||||
00
|
||||
00
|
||||
00
|
||||
03
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
c4
|
||||
00
|
||||
00
|
||||
00
|
||||
03
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
0f
|
||||
00
|
||||
00
|
||||
00
|
||||
02
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
c8
|
||||
00
|
||||
00
|
||||
00
|
||||
30
|
||||
00
|
||||
00
|
||||
00
|
||||
02
|
||||
00
|
||||
00
|
||||
00
|
||||
03
|
||||
00
|
||||
00
|
||||
00
|
||||
04
|
||||
00
|
||||
00
|
||||
00
|
||||
10
|
||||
00
|
||||
00
|
||||
00
|
||||
01
|
||||
00
|
||||
00
|
||||
00
|
||||
01
|
||||
00
|
||||
00
|
||||
00
|
||||
06
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
40
|
||||
00
|
||||
00
|
||||
00
|
||||
60
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
10
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
00
|
||||
Loading…
Add table
Add a link
Reference in a new issue