Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly-ongelma

Nher [30.03.2008 18:08:54]

#

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.)

Antti Laaksonen [31.03.2008 07:40:19]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta