Pemrograman Z80 dengan assembler

H

Hammer111

Guest
Hi all

Tugas universitas saya adalah untuk membuat kode yang akan mengurutkan (dari terkecil hingga terbesar) 10 data (nomor) dari memori disimpan di adresses dari 50H ke 60H.Saya telah bekerja di ini selama 5 jam dan tidak berhasil.
Saya pikir sisi logika saya yang baik tapi entah bagaimana instruksi JP selalu dilakukan.

Ini adalah representasi teks dari apa yang saya (baris demi baris):
Aku dimuat HL mendaftar untuk alamat 50H, kemudian dimuat akumulator A dengan data pada memori pada alamat 50H, aku meningkat HL mendaftar dengan satu sehingga mengarah ke 51H, dimuat register B dengan data 51H.Masukkan DAN A ke reset membawa bendera.Dikurangkan AB regster, penurunan HL mendaftar agar menunjuk ke alamat 50H.Loaded A lagi dengan data pada 50H (karena setelah pengurangan mendaftar A ditimpa, tapi aku membawa bendera), meningkat HL (51H),
kemudian
Seruan ini adalah tempat program saya meninggal, baris JP C, MEM harus melompat ke titik MEM ketika membawa bendera set ke 1 tapi bagi saya selalu melompat (tanpa membawa bendera) Exclamation
di MEM:
beban alamat 51H dengan data di A mendaftar, penurunan HL (50H) dan beban 50H dengan B mendaftar

Pada dasarnya di MEM aku switched data dari 50H ke 51H dan dari 51H ke 50H karena pengurangan menunjukkan membawa bendera.
Sekali lagi, masalah saya adalah apakah pengurangan adalah positif atau negatif (membawa bendera di set ke 1 ATAU 0) Aku punya pelaksanaan sub MEM.

Kode:

LD HL, 50H
LD A, (HL)
INC HL
LD B, (HL)
DAN
SBC A, B
Desember HL
LD A, (HL)
INC HL
JP C, MEM
MEM:
LD (HL), A
Desember HL
LD (HL), B
Menghentikan
END

 
Anda tidak dapat menggunakan urutan berikut:
Kode:

JP C, MEM

MEM:
 
Untuk menyortir data, Anda perlu perulangan.Tapi ia tidak ada loop pada program Anda!

Cobalah untuk belajar metode pengurutan yang paling sederhana - Bubble Sort Algoritma.

 
IANP THANK YOU VERY MUCH IT WORKS

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />
Ini hanyalah awal dari program ini bukan program lengkap untuk penyortiran.
Aku teringat 2 loading data dulu kemudian membandingkan mereka dan menempatkan mereka dalam memori diurutkan maka loading data berikutnya dan membandingkan mereka dengan dua sebelumnya dan mengirimkannya pada posisi appropirate.
Apakah itu yang seperti gelembung tidak?

TERIMA KASIH UNTUK REPLY GUYS!!

 
Sepuluh angka untuk membandingkan => 9 loop ..

Iterasi pertama akan memberikan nomor terkecil di tempat parkir ..
Iterasi kedua (9 nomor untuk berurusan dengan) akan memberikan nomor terkecil kedua ..dan seterusnya ..
Iterasi terakhir, yang sebenarnya akan membandingkan hanya 2 angka, akan memberikan Anda jumlah terbesar di tempat parkir ..

Salam,
IanP

 
Saya membuat program yang dari 10 angka dalam memori terkecil menemukan satu.
i memasukkan nomor itu pada alamat pertama (50H) dan angka pertama untuk disimpan di tempat itu.
Aku alamat 70H digunakan untuk menyimpan alamat dari nomor terkecil di antara mereka yang angka 10

here's the code:

LD HL, 50H
LD D, 9
LOOP1:
LD A, (HL)
INC HL
LOOP:
LD B, (HL)
CP B
CALL NC, FLAG0
CALL C, FLAG1
Desember D
JR NZ, LOOP
LD HL, 50H
LD C, (HL)
LD HL, (70H)
LD (HL), C
LD HL, 50H
LD (HL), A
Menghentikan

FLAG0:
LD A, B
LD (70H), HL
INC HL
LD B, (HL)
RET

FLAG1:
INC HL
LD B, (HL)
RET

LANGKAH BERIKUTNYA ADALAH UNTUK LAKUKAN PROSEDUR YANG SAMA TAPI HARUS SAYA DI NOMOR MENGECUALIKAN PERTAMA KARENA ALAMAT 50H adalah yang terkecil SEHINGGA AKU TIDAK INGIN MENJADI IT UNTUK MENCARI LAGI.
SARANA YANG KEDUA POINT LINE HARUS KE 8 DAN MULAI HARUS ALAMAT 51H (PERTAMA DUA GARIS DI KODE).

MASALAH ADALAH BAHWA SAYA TIDAK TAHU CARA UNTUK PENURUNAN MEREKA DI AWAL SEBUAH KODE DAN PADA AKHIR AKAN PUT IT WHERE terkecil NOMOR KEDUA ATAS SAMA PERTAMA ALAMAT SEBAGAI SATU.Aku melakukannya secara manual BISA TAPI TIDAK'S USEFUL.

 
Hammer111:
Silakan tes sub-rutin, saya belum mencobanya
Kode:

; Memory daerah 50h sampai 60h (17 bytes)BubbleSort:

LD DE, 0050h

Scan

LD A, (DE)

PUSH DE

POP HL

INC HL; HL = DE 1

Membandingkan:

LD B, (HL)

CP A, B: A => B

JR NC, NoSwap; ya, jangan swap

LD C, B

LD B, A

LD A, C; Swap A: B

LD (DE), A; Simpan ke atas sebagian besar lokasi

NoSwap:

INC HL; Next byte untuk membandingkan

LD A, 61h

CP A, L; akhir array?

JR NZ, Bandingkan; belum, membandingkan berikutnyaINC DE; Berikutnya lokasi paling atas

LD A, 60h

CP A, E; akhir scan?

JR NZ, Scan; belum, Scan berikutnya

RET
 
Acumulator terjebak dengan alamat 61H dalam kode Anda.

Aku membuat kode menggunakan beberapa baris yang Anda membantu saya.
Satu-satunya hal adalah bahwa saya tidak tahu bagaimana menghentikan lingkaran pada baris terakhir (JR LOOP), saya ingin berhenti saat mencapai alamat 5AH
Aku mencoba memasukkan bukannya ini LOOP JR line

LD A, 5AH
CP L
JR NZ LOOP
bekerja selama beberapa siklus (untuk 3 atau 4 angka) dan kemudian berhenti (berhenti di suatu tempat di sekitar 54H

Kode:; load alamat 50HLD DE, 50HLOOP:LD A, (DE)

PUSH DE

POP HLCOMPARE:INC HL

LD B, (HL)

CP B; a> = b

CALL NC, SWAP; jika membawa = 0 switch data

LD C, A

LD A, 5AH

CP L

LD A, C

CALL NZ, COMPARE

JP SwapnoSWAP:

PUSH HL

POP IX

LD C, A

LD A, B

LD B, C

RETSwapno:

PUSH DE

POP HL

LD C, (HL)

LD (DE), A

PUSH IX

POP HL

LD L, H

LD H, 0

LD (HL), C

INC DE

JP LOOP

Menghentikan

 
Quote:

Acumulator terjebak dengan alamat 61H dalam kode Anda.
 
Yeah it works, saya sangat menyesal tetapi tidak tahu mengapa tidak bekerja untuk pertama kalinya, mungkin beberapa program sebelumnya terjebak itu.

ONCE AGAIN I'M SORRY, IT Works perfectly TERIMA KASIH BANYAK

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" /><img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />Satu pertanyaan, ketika aku pop alamat 50H dalam register IX itu diisi dengan alamat 5000H mengapa?

 
Quote:

ketika aku pop alamat 50H dalam register IX itu diisi dengan alamat 5000H
 
off topic:
jika Anda menyukai Z8 Anda mungkin Anda akan tertarik untuk mempelajari Microcontrollers Zilog keluarga yang memiliki free c compiler i think setelah Anda menulis dalam perakitan Anda akan menemukan ca pemrograman napas

 
Hammer111 menulis di posting pertama:
Quote:

Tugas universitas saya adalah untuk membuat kode yang akan mengurutkan (dari terkecil hingga terbesar) 10 data (nomor) dari memori disimpan di adresses dari 50H ke 60H.
 
Well, ya itu hanya sebuah tugas universitas dan kemarin kami bekerja pada perangkat lunak dan eZ80Acclaim Zilog beralih ke C programming.

Terima kasih banyak untuk bantuan.

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />
 
buat program untuk mengisi alamat memory 20 dengan 26H..kemudian mengisi alamat 21 dengan 2H,,kemudian mengurangkan isi alamat 20 dengan 2H menggunakan AL..kemudian menanmbahkan isi alamat 21 dengan 3H menggunakan BL,,memindahkan isi AL ke DL kemudian kalikan isi AL dengan BL dan hasilnya disimpan pada alamat 20...

help me.....
 

Welcome to EDABoard.com

Sponsor

Back
Top