no copy

Friday, January 6, 2017

Tugas 4 Soft Skill Organisasi & Arsitektur Komputer

Nama : Amdi Ikhsan
NPM  : 10413780
Kelas  : 4IB03C
Dikerjakan untuk memenuhi tugas RHIYAN EDYAL, Skom., MMSI



Bentuk Perintah Dalam Bahasa Assembly




Bahasa assembly dikategorikan sebagai bahasa tingkat rendah (low level languange). Ini untuk menggambarkan kekhususannya sebagai bahasa yang berorientasi pada machine dependent. Bahasa assembly berbeda dengan bahasa mesin. Dia memiliki karakteristik yang membedakannya dengan  bahasa mesin, yaitu: 

1. Dalam penggunaan numeric operation code (opcodes) bahasa assembly menggantinya dengan mnemonic code

2. Memberikan kemudahan penulisannya dibandingkan dengan bahasa mesin 

3. Mendukung pelacakan kesalahan penulisan operation code

4. Bahasa assembly memberikan kemudahan dalam memodifikasi program karena menggunakan operand sebagai penamaan simbol yang biasa diasosiasikan sebagai data atau instruksi

5. Data yang dinyatakan bahasa assembly adalah dalam notasi desimal. Hal ini dilakukan untuk mencegah konversi secara manual dari konstanta ke dalam representasi internal mesin
Jenis Operand, Operasi, dan Bentuk Perintahnya
1. Komentar
Komentar diawali dengan tanda titik koma (;). 
; ini adalah komentar
2. Label
Label diakhiri dengan tanda titik dua (:).
main: ,loop: ,proses: ,keluar:
3. Assembler directives
Directives adalah perintah yang ditujukan kepada assembler ketika sedang menerjemahkan program kita ke bahasa mesin. Directive dimulai dengan tanda titik. .model : memberitahu assembler berapa memori yang akan dipakai oleh program kita. Ada model tiny, model small, model compact, model medium, model large, dan model huge. .data : memberitahu assembler bahwa bagian di bawah ini adalah data program. .code : memberitahu assembler bahwa bagian di bawah ini adalah instruksi program. .stack : memberitahu assembler bahwa program kita memiliki stack. Program EXE harus punya stack. Kira-kira yang penting itu dulu. Semua directive yang dikenal assembler adalah: .186 .286 .286c .286p .287 .386 .386c .386p .387 .486 .486p .8086 .8087 .alpha .break .code .const .continue .cref .data .data? .dosseg .else .elseif .endif .endw .err .err1 .err2 .errb .errdef .errdif .errdifi .erre .erridn .erridni .errnb .errndef .errnz .exit .fardata .fardata? .if .lall .lfcond .list .listall .listif .listmacro .listmacroall .model .no87 .nocref .nolist .nolistif .nolistmacro .radix .repeat .sall .seq .sfcond .stack .startup .tfcond .type .until .untilcxz .while .xall .xcref .xlist.
4. Definisi data
DB : define bytes. Membentuk data byte demi byte. Data bisa data numerik maupun teks. catatan: untuk membentuk data string, pada akhir string harus diakhiri tanda dolar ($). sintaks: {label} DB {data} contoh: teks1 db "Hello world $" 
DW : define words. Membentuk data word demi word (1 word = 2 byte). sintaks: {label} DW {data} contoh: kucing dw ?, ?, ? ;mendefinisikan tiga slot 16-bit yang isinya don’t care (disimbolkan dengan tanda tanya) 
DD : define double words. Membentuk data doubleword demi doubleword (4 byte). sintaks: {label} DD {data} 
EQU : equals. Membentuk konstanta. sintaks: {label} EQU {data} contoh: sepuluh EQU 10 untuk assembly yang melibatkan bilangan pecahan (floating point) saya belum belajar, jadi dalam tutorial ini saya hanya memakai bilangan bulat (integer). Sebenarnya masih ada DF (define far words), DQ (define quad words), dan DT (define ten bytes).
5. Perpindahan data
MOV : move. Memindahkan suatu nilai dari register ke memori, memori ke register, atau register ke register. sintaks: MOV {tujuan}, {sumber} contoh:mov AX, 4C00h ;mengisi register AX dengan 4C00(hex). mov BX, AX ;menyalin isi AX ke BX. mov CL, [BX] ;mengisi register CL dengan data di memori yang alamatnya ditunjuk BX. mov CL, [BX] + 2 ;mengisi CL dengan data di memori yang alamatnya ditunjuk BX lalu geser maju 2 byte. mov [BX], AX ;menyimpan nilai AX pada tempat di memori yang ditunjuk BX. mov [BX] – 1, 00101110b ;menyimpan 00101110(bin) pada alamat yang ditunjuk BX lalu geser mundur 1 byte.
LEA : load effective address. Mengisi suatu register dengan alamat offset sebuah data. sintaks: LEA {register}, {sumber} contoh: lea DX, teks1
XCHG : exchange. Menukar dua buah register langsung. sintaks: XCHG {register 1}, {register 2} Kedua register harus punya ukuran yang sama. Bila sama-sama 8 bit (misalnya AH dengan BL) atau sama-sama 16 bit (misalnya CX dan DX), maka pertukaran bisa dilakukan. Sebenarnya masih banyak perintah perpindahan data, misalnya IN, OUT, LODS, LODSB, LODSW, MOVS, MOVSB, MOVSW, LDS, LES, LAHF, SAHF, dan XLAT. Tapi semua ini ribet dan bikin pusing pembaca.
6. Operasi logika
AND : melakukan bitwise and. sintaks: AND {register}, {angka} AND {register 1}, {register 2} hasil disimpan di register 1. contoh: mov AL, 00001011b mov AH, 11001000b and AL, AH ;sekarang AL berisi 00001000(bin), sedangkan AH tidak berubah. 
OR : melakukan bitwise or. sintaks: OR {register}, {angka} OR {register 1}, {register 2} hasil disimpan di register 1. 
NOT : melakukan bitwise not (one’s complement) sintaks: NOT {register} hasil disimpan di register itu sendiri. 
XOR : melakukan bitwise eksklusif or. sintaks: XOR {register}, {angka} XOR {register 1}, {register 2} hasil disimpan di register 1. Tips: sebuah register yang di-XOR-kan dengan dirinya sendiri akan menjadi berisi nol. 
SHL : shift left. Menggeser bit ke kiri. Bit paling kanan diisi nol. sintaks: SHL {register}, {banyaknya} 
SHR : shift right. Menggeser bit ke kanan. Bit paling kiri diisi nol. sintaks: SHR {register}, {banyaknya} 
ROL : rotate left. Memutar bit ke kiri. Bit paling kiri jadi paling kanan kali ini. sintaks: ROL {register}, {banyaknya} Bila banyaknya rotasi tidak disebutkan, maka nilai yang ada di CL akan digunakan sebagai banyaknya rotasi. 
ROR : rotate right. Memutar bit ke kanan. Bit paling kanan jadi paling kiri. sintaks: ROR {register}, {banyaknya} Bila banyaknya rotasi tidak disebutkan, maka nilai yang ada di CL akan digunakan sebagai banyaknya rotasi. Perintah menarik yang tidak dijelaskan di sini: RCL dan RCR.
7. Operasi matematika
ADD : add. Menjumlahkan dua buah register. sintaks: ADD {tujuan}, {sumber} operasi yang terjadi: tujuan = tujuan + sumber. carry (bila ada) disimpan di CF. 
ADC : add with carry. Menjumlahkan dua register dan carry flag (CF). sintaks: ADC {tujuan}, {sumber} operasi yang terjadi: tujuan = tujuan + sumber + CF. carry (bila ada lagi) disimpan lagi di CF. 
INC : increment. Menjumlah isi sebuah register dengan 1. Bedanya dengan ADD, perintah INC hanya memakan 1 byte memori sedangkan ADD pakai 3 byte. sintaks: INC {register} 
SUB : substract. Mengurangkan dua buah register. sintaks: SUB {tujuan}. {sumber} operasi yang terjadi: tujuan = tujuan – sumber. borrow (bila terjadi) menyebabkan CF bernilai 1. 
SBB : substract with borrow. Mengurangkan dua register dan carry flag (CF). sintaks: SBB {tujuan}, {sumber} operasi yang terjadi: tujuan = tujuan – sumber – CF. borrow (bila terjadi lagi) menyebabkan CF dan SF (sign flag) bernilai 1. 
DEC : decrement. Mengurang isi sebuah register dengan 1. Jika SUB memakai 3 byte memori, DEC hanya memakai 1 byte. sintaks: DEC {register} 
MUL : multiply. Mengalikan register dengan AX atau AH. sintaks: MUL {sumber} Bila register sumber adalah 8 bit, maka isi register itu dikali dengan isi AL, kemudian disimpan di AX. Bila register sumber adalah 16 bit, maka isi register itu dikali dengan isi AX, kemudian hasilnya disimpan di DX:AX. Maksudnya, DX berisi high order byte-nya, AX berisi low order byte-nya.
IMUL : signed multiply. Sama dengan MUL, hanya saja IMUL menganggap bit-bit yang ada di register sumber sudah dalam bentuk two’s complement. sintaks: IMUL {sumber} 
DIV : divide. Membagi AX atau DX:AX dengan sebuah register. sintaks: DIV {sumber} Bila register sumber adalah 8 bit (misalnya: BL), maka operasi yang terjadi: -AX dibagi BL, -hasil bagi disimpan di AL, -sisa bagi disimpan di AH. Bila register sumber adalah 16 bit (misalnya: CX), maka operasi yang terjadi: -DX:AX dibagi CX, -hasil bagi disimpan di AX, -sisa bagi disimpan di DX. 
IDIV : signed divide. Sama dengan DIV, hanya saja IDIV menganggap bit-bit yang ada di register sumber sudah dalam bentuk two’s complement. sintaks: IDIV {sumber}
NEG : negate. Membuat isi register menjadi negatif (two’s complement). Bila mauone’s complement, gunakan perintah NOT. sintaks: NEG {register} hasil disimpan di register itu sendiri.
8. Pengulangan
LOOP : loop. Mengulang sebuah proses. Pertama register CX dikurangi satu. Bila CX sama dengan nol, maka looping berhenti. Bila tidak nol, maka lompat ke label tujuan. sintaks: LOOP {label tujuan} Tips: isi CX dengan nol untuk mendapat jumlah pengulangan terbanyak. Karena nol dikurang satu sama dengan -1, atau dalam notasi two’s complement menjadi FFFF(hex) yang sama dengan 65535(dec).
LOOPE : loop while equal. Melakukan pengulangan selama CX ≠ 0 dan ZF = 1. CX tetap dikurangi 1 sebelum diperiksa. sintaks: LOOP {label tujuan} 
LOOPZ : loop while zero. Identik dengan LOOPE.
LOOPNE : loop while not equal. Melakukan pengulangan selama CX ≠ 0 dan ZF = 0. CX tetap dikurangi 1 sebelum diperiksa. sintaks: LOOPNE {label tujuan} 
LOOPNZ : loop while not zero. Identik dengan LOOPNE. 
REP : repeat. Mengulang perintah sebanyak CX kali. sintaks: REP {perintah assembly} contoh:mov CX, 05 rep inc BX ;register BX ditambah 1 sebanyak 5x.
REPE : repeat while equal. Mengulang perintah sebanyak CX kali, tetapi pengulangan segera dihentikan bila didapati ZF = 1. sintaks: REPE {perintah assembly}
REPZ : repeat while zero. Identik dengan REPE.
REPNE : repeat while not equal. Mengulang perintah sebanyak CX kali, tetapi pengulangan segera dihentikan bila didapati ZF = 0. sintaks: REPNE {perintah assembly} 
REPNZ : repeat while not zero. Identik dengan REPNE.
9. Perbandingan
CMP : compare. Membandingkan dua buah operand. Hasilnya mempengaruhi sejumlah flag register. sintaks: CMP {operand 1}, {operand 2}. Operand ini bisa register dengan register , register dengan isi memori, atau register dengan angka. CMP tidak bisa membandingkan isi memori dengan isi memori. Hasilnya adalah:
10. Lompat
JMP: jump. Lompat tanpa syarat. Lompat begitu saja. sintaks: JMP {label tujuan} 
Lompat bersyarat sintaksnya sama dengan JMP, yaitu perintah jump diikuti label tujuan.
JAjump if aboveCF = 0 ∧ ZF = 0unsignedlompat bila op 1 > op 2ya
JNBEjump if not below or equal
JBjump if belowCF = 1 ∧ ZF = 0unsignedlompat bila op 1 < op 2ya
JNAEjump if not above or equal
JAEjump if above or equalCF = 0 ∨ ZF = 1unsignedlompat bila op 1 ≥ op 2ya
JNBjump if not below
JBEjump if below or equalCF = 1 ∨ ZF = 1unsignedlompat bila op 1 ≤ op 2ya
JNAjump if not above
JGjump if greaterOF = 0 ∧ ZF = 0signedlompat bila op 1 > op 2ya
JNLEjump if not less or equal
JGEjump if greater or equalOF = 0 ∨ ZF = 1signedlompat bila op 1 ≥ op 2ya
JNLjump if not less than
JLjump if less thanOF = 1 ∧ ZF = 0signedlompat bila op 1 < op 2ya
JNGEjump if not greater or equal
JLEjump if less or equalOF = 1 ∨ ZF = 1signedlompat bila op 1 ≤ op 2ya
JNGjump if not greater
JEjump if equalZF = 1keduanyalompat bila op 1 = op 2ya
JZjump if zeroZF = 1keduanyalompat bila op 1 = op 2ya
JNEjump if not equalZF = 0keduanyalompat bila op 1 ≠ op 2ya
JNZjump if not zeroZF = 0keduanyalompat bila op 1 ≠ op 2ya
JCjump if carryCF = 1N/Alompat bila carry flag = 1tidak
JNCjump if not carryCF = 0N/Alompat bila carry flag = 0tidak
JPjump on parityPF = 1N/Alompat bila parity flag = 1tidak selalu
JPEjump on parity evenlompat bila bilangan genap
JNPjump on not parityPF = 0N/Alompat bila parity flag = 0tidak selalu
JPOjump on parity oddlompat bila bilangan ganjil
JOjump if overflowOF = 1N/Alompat bila overflow flag = 1tidak
JNOjump if not overflowOF = 0N/Alompat bila overflow flag = 0tidak
JSjump if signSF = 1N/Alompat bila bilangan negatiftidak
JCXZjump if CX is zeroCX = 0000N/Alompat bila CX berisi noltidak
11. Operasi stack
PUSH : push. Menambahkan sesuatu ke stack. Sesuatu ini harus register berukuran 16 bit (pada 386+ harus 32 bit), tidak boleh angka, tidak boleh alamat memori. Maka Anda tidak bisa mem-push register 8-bit seperti AH, AL, BH, BL, dan kawan-kawannya. sintaks: push {register 16-bit sumber} contoh: push DX push AX Setelah operasi push, register SP (stack pointer) otomatis dikurangi 2 (karena datanya 2 byte). Makanya, “top” dari stack seakan-akan “tumbuh turun”. 
POP : pop. Mengambil sesuatu dari stack. Sesuatu ini akan disimpan di register tujuan dan harus 16-bit. Maka Anda tidak bisa mem-pop menuju AH, AL, dkk. sintaks: POP {register 16-bit tujuan} contoh: POP BX Setelah operasi pop, register SP otomatis ditambah 2 (karena 2 byte), sehingga “top” dari stack “naik” lagi. Tip: karena register segmen tidak bisa diisi langsung nilainya, Anda bisa menggunakan stack sebagai perantaranya. Contoh kodenya: mov AX, seg teks1 push AX pop DS 
PUSHF : push flags. Mem-push semua isi register flag ke dalam stack. Biasa dipakai untuk membackup data di register flag sebelum operasi matematika. Sintaks: PUSHF ;(saja). 
POPF : pop flags. Lawan dari pushf. Sintaks: POPF ;(saja).
POPA : pop all general-purpose registers. Adalah ringkasan dari sejumlah perintah dengan urutan:
pop DI pop SI pop BP pop SP pop BX pop DX pop CX pop AX
PUSHA : push all general-purpose registers. Lawan dari POPA, dimana PUSHA adalah singkatan dari sejumlah perintah dengan urutan yang sudah ditetapkan:
push AX push CX push DX push BX push SP push BP push SI push DI
12. Operasi pada register flag
CLC : clear carry flag. Menjadikan CF = 0. Sintaks: CLC ;(saja). 
STC : set carry flag. Menjadikan CF = 1. Sintaks: STC ;(saja). 
CMC : complement carry flag. Melakukan operasi NOT pada CF. Yang tadinya 0 menjadi 1, dan sebaliknya. 
CLD : clear direction flag. Menjadikan DF = 0. Sintaks: CLD ;(saja). 
STD : set direction flag. Menjadikan DF = 1. 
CLI : clear interrupt flag. Menjadikan IF = 0, sehingga interrupt ke CPU akan di-disable. Biasanya perintah CLI diberikan sebelum menjalankan sebuah proses penting yang riskan gagal bila diganggu. 
STI : set interrupt flag. Menjadikan IF = 1.
13. Perintah Lainnya
ORG : origin. Mengatur awal dari program (bagian static data). Analoginya seperti mengatur dimana letak titik (0, 0) pada koordinat Cartesius. sintaks: ORG {alamat awal} Pada program COM (program yang berekstensi .com), harus ditulis “ORG 100h” untuk mengatur alamat mulai dari progam pada 0100(hex), karena dari alamat 0000(hex) sampai 00FF(hex) sudah dipesan oleh sistem operasi (DOS). 
INT : interrupt. Menginterupsi prosesor. Prosesor akan: 1. Membackup data registernya saat itu, 2. Menghentikan apa yang sedang dikerjakannya, 3. Melompat ke bagian interrupt-handler (entah dimana kita tidak tahu, sudah ditentukan BIOS dan DOS), 4. Melakukan interupsi, 5. Mengembalikan data registernya, 6. Meneruskan pekerjaan yang tadi ditunda. sintaks: INT {nomor interupsi}
IRET : interrupt-handler return. Kita bisa membuat interrupt-handler sendiri lho! Ada caranya. Perintah IRET adalah perintah yang menandakan bahwa interrupt-handler kita selesai, dan prosesor boleh melanjutkan pekerjaan yang tadi tertunda. 
CALL : call procedure. Memanggil sebuah prosedur. Soal ini saya belum mengerti benar, jadi penjelasannya sementara tidak ada dulu. sintaks: CALL {label nama prosedur} 
RET : return. Tanda selesai prosedur. Setiap prosedur harus memiliki RET di ujungnya. Soal ini saya belum mengerti benar, jadi penjelasannya sementara tidak ada dulu. sintaks: RET ;(saja) 
HLT : halt. Membuat prosesor menjadi tidak aktif. Prosesor harus mendapat interupsi dari luar atau di-reset supaya aktif kembali.  Sintaks: HLT ;(saja). 
NOP : no operation. Perintah ini memakan 1 byte di memori tetapi tidak menyuruh prosesor melakukan apa-apa selama 3 clock prosesor. Berikut contoh potongan program untuk melakukan delay selama 0,1 detik pada prosesor Intel 80386 yang berkecepatan 16 MHz.
mov ECX, 533333334d ;ini adalah bilangan desimal idle: nop loop idle

sumber:
https://end4su.wordpress.com/2009/06/18/assembler/

1 comment:

  1. youtube channel - youtube.com
    youtube channel · youtube channel youtube channel youtube channel YouTube channel youtube channel. YouTube channel youtube channel. youtube channel youtube youtube to mp3 iphone channel. youtube channel channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. youtube channel. YouTube channel. youtube channel.

    ReplyDelete