http://courses.cs.vt.edu/csonline/MachineArchitecture/Lessons/CPU/ http://www.emu8086.com/assembler_tutorial/tutorials.html C code: C程式碼 n = 10; n = n+23; 6502 assembler: 組合語言(8 bit) 0500 lda #23 Load載入 the byte value 23h into the accumulator累加器(ACC=23) 0502 add $2043 Add加 the byte of data found at memory 2043h (ACC=ACC+n) 0505 sta $2043 Store儲存於 at memory 2043h (n=ACC) .. 2043 10 (int n) As 6502 machine code in memory: 機器碼 9a 23 8a 43 20 84 44 20 .. Note that 6502 uses little-endian, so adc $2043 is 8a 43 20 lda #23 (2 cycles) Fetch: PC=0500 // addr of next instruction MAR=PC // memory address register MDR=memory[MAR] // memory data register IR=MDR // instruction(lda) PC++ Decode: operand (#23) needed MAR=PC // PC=0501 MDR=memory[MAR] // operand #23 PC++ Execute: ACC=MDR // #23 PSR updated adc $2043 (4 cycles) Fetch: PC=0502 MAR=PC MDR=memory[MAR] IR=MDR // instruction(adc) PC++ Decode: next 2 bytes are addresses (T=$2043) MAR=PC MDR=memory[MAR] // addr 43 T[1]=MDR PC++ MAR=PC MDR=memory[MAR] // addr 20 T[0]=MDR PC++ Execute: MAR=T // addr 2043 MDR=memory[MAR] // data(10) ACC=ACC+MDR // 23+10 PSR updated sta $2043 (4 cycles) Fetch: PC=0505 MAR=PC MDR=memory[MAR] IR=MDR // instruction(sta) PC++ Decode: next 2 bytes are addresses (T=$2043) MAR=PC MDR=memory[MAR] // addr 43 T[1]=MDR PC++ MAR=PC MDR=memory[MAR] // addr 20 T[0]=MDR PC++ Execute: MAR=T // addr 2043 MDR=ACC // memory[MAR]=MDR Example 2: for n in range(6): … for(n=0;n<=5;n++)… 0001 LOAD #5 // ACC=5 0002 STORE 0020 // MAX=5 0003 LOAD #0 // ACC=0 0004 STORE 0030 // n=ACC 0005 SUB 0020 // ACC=ACC-5 0006 JPZ 0010 // if(ACC==0) jump to 0010 (STOP) 0007 LOAD 0030 // ACC=n 0008 ADD #1 // ACC++ 0009 JMP 4 0010 STOP … 0020 ? // MAX … 0030 ? // n …