My answer to this question has evolved relatively recently. The existing answers cover what I would have said in the past. Actually, this is still covered by the top answer - the "appreciate the constructs in higher-level programming" point, but it's a special-case that I think is worth mentioning...
According to this Jeff Atwood blog post, which references a study, understanding assignment is a key issue in understanding programming. Learner programmers either understand that the notation just represents steps that the computer follows, and reasons by the steps, or else gets perpetually confused by misleading analogies to mathematical equations etc.
Well, if you understand the following from 6502 assembler...
LDA variable
CLC
ADC #1
STA variable
That really is just the steps. Then when you learn to translate that to an assignment statement...
variable = variable + 1;
You don't need an misleading analogy to a mathematical equation - you already have a correct mental model to map it to.
EDIT - of course if the explanation you get of LDA variable
is basically ACCUMULATOR = variable
, which is exactly what you get from some tutorials and references, you end up back where you started and it's no help at all.
I learned 6502 assembler as my second language, the first being Commodore Basic, and I hadn't really learned much of that at the time - partly because there was so little to learn, but also because assembler just seemed so much more interesting back then. Partly the times, partly because I was a 14 year old geek.
I don't recommend doing what I did, but I wonder if studying a few very simple examples in a very simple assembler language might be a worthwhile preliminary to learning higher-level languages.
for
loop by declaring variables outside of it. example