Juu, ehkä pitäisi pystyä itsekin selvittämään, mutta kun ei ole hyvä pienen ihmisen yksin olla.
.code16 mov $0, %ds mov $0, %ss mov $0x7d00, %bp mov $72, %di mov $0x7d50, %sp Loop: movb $0, (%bp, %di) dec %di test %di, %di jz Break jmp Loop Break: movb $1, 72(%bp) mov $72, %di mov $100, %si mov $100, %cx Fact: dec %cx jcxz Sum mov %cx, %si Multi: dec %si test %si, %si jz Fact Add: mov $72, %di push %di clc Add2: mov (%bp, %di), %ah adc %ah, %ah dec %di pushf mov %ah, (%bp, %di) test %di, %di jz Divide popf jmp Add2 Divide: mov $72, %di pop %cx Divide2: mov (%bp, %di), %ah divb $10 dec %di movb %ah, (%bp, %di) add %al, -1(%bp, %di) test %di, %di jz Multi jmp Divide2 Sum: mov $72, %di Sum2: add %dx, (%bp, %di) dec %di test %di, %di jz Print jmp Sum2 Print: mov $0, %bh mov $0xe, %ah mov %dh, %al add $48, %al int $0x10 mov %dl, %al add $48, %al int $0x10 Infin: jmp Infin
Yllä oleva ei suostu kääntymään. Ensimmäisiltä riveiltä "mov $0, %ds" ja "mov $0, %ss" sekä Divide:n alta "divb $10"stä tulee virhettä "suffix or operands invalid for mov/div". Mikä on pielessä? Voiko segmenttirekistereihin edes laittaa nollaa? (Aloita aina huipulta.)
Noissa tilanteissa lukuarvoa ei voi suoraan yhdistää komentoon, vaan luku täytyy ensin kopioida sopivaan rekisteriin.
En tunne tuota syntaksia, mutta idea on seuraava:
mov $0, %ax mov %ax, %ds
movb $10, %bh divb %bh
Muutenkin komennoissa on usein rajoituksia, millaisia operandeja (rekisteri, muistiosoite, suora lukuarvo) niille voi antaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.