diff --git a/scapy/packet.py b/scapy/packet.py
index 04fb3346916f37efab4f016271117c2a99d484a9..56267b2262ef1040825260598a6994c2a1f74989 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -574,12 +574,11 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
         return s
 
     def do_dissect(self, s):
-        flist = self.fields_desc[:]
-        flist.reverse()
         raw = s
         self.raw_packet_cache_fields = {}
-        while s and flist:
-            f = flist.pop()
+        for f in self.fields_desc:
+            if not s:
+                break
             s, fval = f.getfield(self, s)
             # We need to track fields with mutable values to discard
             # .raw_packet_cache when needed.
@@ -587,10 +586,7 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
                 self.raw_packet_cache_fields[f.name] = f.do_copy(fval)
             self.fields[f.name] = fval
         assert(raw.endswith(s))
-        if s:
-            self.raw_packet_cache = raw[:-len(s)]
-        else:
-            self.raw_packet_cache = raw
+        self.raw_packet_cache = raw[:-len(s)] if s else raw
         self.explicit = 1
         return s