[#14]
Re: Asembler for dumies - czyli pytania poczatkujacego
@asman,
post #7
Chcialbym tu odpowiedzciec na posty kolegow Asmana i Don Adana, bo zaczyna sie robic ciekawie :)
Na poczatek funkcja o ktora prosil Asman (forum obcina spacje wiec moze byc troche nieczytelnie)
void RysujLiniePozioma(int x1, int x2, int y, int kolor)
{
unsigned char *ptr;
if(y < 0) return;
ptr = Tab_Mapa + y * 320;
x1 >>= 8;
x2 >>= 8;
if(x1 < x2)
{
x2++;
if(x1 < 0) x1 = 0;
if(x2 > 319) x2 = 319;
ptr += x1;
for(; x1<x2; x1++)
{
*ptr++ = kolor;
}
return;
}
x1++;
if(x2 < 0) x2 = 0;
if(x1 > 319) x1 = 319;
ptr += x2;
for(; x2<x1; x2++)
{
*ptr++ = kolor;
}
}
Opis: funkcja ma na zadanie wyrysowac linie pozioma od puntu x1 do x2, na wysokosci y, o kolorze "kolor". Wpis nastepuje do kolejnych komorek tablicy UBYTE Tab_Mapa.
Deasemblacja (tutaj dopiero bedzie balagan)
; 319: void RysujLiniePozioma(int x1, int x2, int y, int kolor)
| 05CC 48E7 0304 MOVEM.L D6-D7/A5,-(A7)
| 05D0 222F 001C MOVE.L 001C(A7),D1
| 05D4 202F 0018 MOVE.L 0018(A7),D0
| 05D8 2C2F 0014 MOVE.L 0014(A7),D6
| 05DC 2E2F 0010 MOVE.L 0010(A7),D7
; 320: {
; 321: unsigned char *ptr;
; 322:
; 323: if(y < 0) return;
| 05E0 4A80 TST.L D0
| 05E2 6B62 BMI.B 0646
; 324:
; 325: ptr = Tab_Mapa + y * 320;
| 05E4 4C3C 0800 0000 0140 MULS.L #00000140,D0
| 05EC 4BF9 0000 8A74-02 LEA 02.00008A74,A5
| 05F2 DBC0 ADDA.L D0,A5
; 326:
; 327: x1 >>= 8;
| 05F4 E087 ASR.L #8,D7
; 328: x2 >>= 8;
| 05F6 E086 ASR.L #8,D6
; 329:
; 330: if(x1 < x2)
| 05F8 BE86 CMP.L D6,D7
| 05FA 6C26 BGE.B 0622
; 331: {
; 332: x2++;
| 05FC 5286 ADDQ.L #1,D6
; 333:
; 334: if(x1 < 0) x1 = 0;
| 05FE 4A87 TST.L D7
| 0600 6A02 BPL.B 0604
| 0602 7E00 MOVEQ #00,D7
; 335: if(x2 > 319) x2 = 319;
| 0604 0C86 0000 013F CMPI.L #0000013F,D6
| 060A 6F06 BLE.B 0612
| 060C 2C3C 0000 013F MOVE.L #0000013F,D6
; 336:
; 337: ptr += x1;
| 0612 DBC7 ADDA.L D7,A5
; 338:
; 339: for(; x1<x2; x1++)
| 0614 6006 BRA.B 061C
; 340: {
; 341: *ptr++ = kolor;
| 0616 2001 MOVE.L D1,D0
| 0618 1AC0 MOVE.B D0,(A5)+
| 061A 5287 ADDQ.L #1,D7
| 061C BE86 CMP.L D6,D7
| 061E 6DF6 BLT.B 0616
; 342: }
; 343:
; 344: return;
| 0620 6024 BRA.B 0646
; 345: }
; 346:
; 347: x1++;
| 0622 5287 ADDQ.L #1,D7
; 348:
; 349: if(x2 < 0) x2 = 0;
| 0624 4A86 TST.L D6
| 0626 6A02 BPL.B 062A
| 0628 7C00 MOVEQ #00,D6
; 350: if(x1 > 319) x1 = 319;
| 062A 0C87 0000 013F CMPI.L #0000013F,D7
| 0630 6F06 BLE.B 0638
| 0632 2E3C 0000 013F MOVE.L #0000013F,D7
; 351:
; 352: ptr += x2;
| 0638 DBC6 ADDA.L D6,A5
; 353:
; 354: for(; x2<x1; x2++)
| 063A 6006 BRA.B 0642
; 355: {
; 356: *ptr++ = kolor;
| 063C 2001 MOVE.L D1,D0
| 063E 1AC0 MOVE.B D0,(A5)+
| 0640 5286 ADDQ.L #1,D6
| 0642 BC87 CMP.L D7,D6
| 0644 6DF6 BLT.B 063C
; 357: }
; 358: }
| 0646 4CDF 20C0 MOVEM.L (A7)+,D6-D7/A5
| 064A 4E75 RTS
A teraz najciekawsze. Zamienilem intrukcje tak jak polecil Don Adan i program dzialal dalej tak jak nalezy. Z ciekawosci zmienilem ten skok $6DF6 na $6DF8 i po tej zmianie (uwaga) program dalej dzialal poprawnie (!!!) tyle ze jak mi wyszlo z pomiarow o wiele szycbiej, co chyba nie jest zaskoczeniem.
Wiec pytanie dalej otwarte: co z tym nieszczesnym rejestrem D0?
Ostatnia aktualizacja: 06.05.2014 14:55:45 przez Phibrizzo