Assembler, gdzieś jest błąd

0

Witam serdecznie forumowiczów. Poniższy program ma obliczać sumę liczb ujemnych w tablicy. Lecz nie mogę go uruchomić na 64 bitowym windowsie, czy jest w ogóle taka opcja? Drugi problem dotyczy samego kodu, program wyświetla się i znika, nic nie wypisuje. To wina kodu czy ja nie potrafię go właściwie uruchomić? Bardzo proszę o pomoc. Z góry dziękuję.

;---------------------------------- 
; wejscie: 
; CX=ilosc slow w tablicy 
; DX=poczatek tablicy 
; wyjscie: 
; BX = suma liczb ujemnych 
;---------------------------------- 
format MZ 

entry main:start ; program entry point 

stack 100h ; stack size 

segment main ; main program segment 

start: 
mov ax,dane 
mov ds,ax 
mov dx,tablica 
mov cx,10 ;cx = ilosc slow w tablicy 
;------------------------------------ 
DodajUjemne: 
mov bx,bx ;bx=0 
cld ;zerowanie wskanika DF - wskaľnik kolejnej danej w tablicy 
;bedzie zwiekszany po kazdymodcycie 
next: 
lodsw ;AX = dana z tablicy 
test ah,ah ;ustaw znacznik czy SF - znak liczby 
;pomin jesli pobrana z tablicy liczba_ 
jns dodatnia ;liczba jest dodatnia 
add bx,ax 
dodatnia: 
loop next ;tablica=tablica-1 , jesli nie koniec to next 

;koniec 

mov ax,4C00h 
int 21h 

segment dane 

tablica dw -1,1,-2,-5,-7,0,-15,-13,-25,-110
1
  1. A czym to kompilujesz? Bo kod to 16bitowy assembler więc jak kompilujesz czymś do 16 bitowej binarki to na windowsie x64 nie odpalisz tego. Zostaje ci dosbox.
  2. Nie naipsałeś co to za assembler więc moje niektóre uwagi nie muszą być całkiem poprawne:
start: 
 mov ax,dane ; ja bym dał mov ax, seg tablica
 mov ds,ax 
 mov dx,tablica ;na moje oko raczej mov dx, offset tablica
 mov cx,10 ;cx = ilosc slow w tablicy 
 ;------------------------------------ 
 DodajUjemne: 
 mov bx,bx ;bx=0 

No chyba nie. Od kiedy przypisanie x=x powoduje zerowanie czegokolwiek? Pomieszałeś dwa różne rozwiązania.

xor bx, bx
;albo
mov bx, 0
 cld ;zerowanie wskanika DF - wskaľnik kolejnej danej w tablicy 
 ;bedzie zwiekszany po kazdymodcycie 
 next: 
     lodsw ;AX = dana z tablicy 
     test ah,ah ;ustaw znacznik czy SF - znak liczby 
     ;pomin jesli pobrana z tablicy liczba_ 
     jns dodatnia ;liczba jest dodatnia 
     add bx,ax 
     dodatnia: 
 loop next ;tablica=tablica-1 , jesli nie koniec to next

Pytanie: Od kiedy lodsw czyta z ds:dx? Bo rozumiem że takie poczynileś tu zalożenie. Bo dokumentacja mówi że jednak ds:si...

0

Staram się skompilować to na FASM assembler, ale nic z tego nie wychodzi. Czyli kod jest po prostu błędny, nie mam już na to siły... posiedzę nad tym jeszcze kilka godzin, nie będzie mi natomiast smutno, jak ktoś jest w stanie to poprawić :D Dzięki Shalom, twoje rady będą bardzo pomocne w mojej mordędze :D

1

No ale oprócz tych błędów które opisałem może to nawet jakośtam zadziałać. Chociaz ja osobiście zamiast cld i lodsw pisałbym ręcznie za pomocą mov, wtedy nie masz problemów z serii "nie ten rejestr" jak u ciebie z tym ds:dx zamiast ds:si

0

A czy mógłbyś mi przerobić ten kod tak aby to jakoś inaczej działało i po krótce wytłumaczyć jak ty się posługiwać?

1

Nie znam składni fasma tak dobrze, więc będzie masm-like ale może akurat będzie uniwersalnie :P

dane1	segment
	tablica dw -1,1,-2,-5,-7,0,-15,-13,-25,-110
dane1	ends

code1	segment

	start:	
		mov	ax, seg top1 ;inicjowanie stosu
		mov	ss, ax
		mov	sp, offset top1
		
		mov	ax, seg tablica
		mov	ds, ax
		mov	si, offset tablica
	 
		mov cx, 10
		mov bx, 0
		petla:
			mov ax, ds:[si]
			test ax, ax
			jns skip
			add bx, ax
			skip:
			inc si
		loop petla
		
		;jakieś wypisanie wyniku z bx?
		
		mov	ax,04c00h
		int	21h
 
code1	ends

stos1	segment STACK
	dw	200 dup(?)
	top	dw	?
stos1	ends

end start

Ale oczywiście jak to odpalisz to "nic sie nie stanie" bo nigdzie nie jest wypisywany wynik.

0

dziękuję bardzo, bardzo to pomocne, już się biorę do roboty

2

Nudy w pracy to masz ;) Pod fasm, aplikacja x86 takze na 64 bitach smiga.

format PE console 4.0
include "win32ax.inc"

shall_we_start:
        mov     ebx, [tablelength]
        mov     esi, 0

        loop_this_table:
                mov     eax, [table+esi*4]
                inc     esi

        should_we_add:
                test    eax, eax
                jns     nope
                add     [result], eax

        nope:
                dec     ebx
                test    ebx, ebx
                jnz     loop_this_table

        cinvoke printf, formatstring, [result]
        invoke  getch
        invoke  ExitProcess, 0

        ; data
        formatstring    db "%d",13,10,0
        table           dd -1,1,-2,-5,-7,0,-15,-13,-25,-110
        tablelength     dd 10
        result          dd 0


section '.idata' import data readable

library msvcrt,'msvcrt.dll',\
        kernel32,'kernel32.dll'

import  msvcrt, \
        printf, 'printf', \
        getch, 'getchar'
import  kernel32,ExitProcess, 'ExitProcess'

1 użytkowników online, w tym zalogowanych: 0, gości: 1