Assembler dodawanie 2 liczb

Odpowiedz Nowy wątek
2011-10-23 17:34
0

Witam
Chciałem poznać całkowite podstawy języka assembler ale już na początku mam problem.Chciałem dodać do siebie 2 liczby i wyświetlić je na ekranie.Korzystam z NASM i robię to pod linuxem ale myślę ,że większej różnicy to nie robi.A oto kod.

section .text

global _start

_start:

mov al,liczba1
mov ah,liczba2
add ah,al
mov wynik,ah

mov eax,4
mov ebx,1
mov ecx,wynik
mov edx,wynik_ln
int 80h

mov eax,1
xor ebx,ebx
int 80h

section .data

liczba1 db 1
liczba2 db 2
wynik db 0
wynik_ln equ $ - wynik

Wyświetla mi błąd przy kompilacji w linijce mov wynik,ah i pisze invalid combination of opcode and operands nie mam pojęcia co zrobiłem źle.Prosiłbym o jakąś wskazówkę.

edytowany 1x, ostatnio: madmike, 2011-10-23 17:35

Pozostało 580 znaków

2011-10-23 19:25
msm
0
mov wynik,ah

Podejdź do tego na chłopski rozum - wynik to dla asemblera miejsce w pamięci. Miejsce w pamięci to dla asemblera liczba (wskaźnik) - dajmy na to wynosi 0x12345678. Czyli ten kod redukuje się podczas asemblacji do czegoś w rodzaju

mov 0x12345678, ah

Co z kolei oznaczałody w języku C-podobnym coś w rodzaju
0x12345678 = ah
Czyli jest oczywistym absurdem.

Nie chcesz przypisywać ah do etykiety wynik tylko do miejsca w pamięci oznaczonego tą etykietą. Czyli piszesz tak:

mov [wynik],ah

Pozostało 580 znaków

2011-10-23 19:48
0

I całkiem możliwe,że musisz podać wielkość w bajtach ile zapisujesz:

mov byte ptr [wynik],ah

"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB, 2011-10-23 19:49
W nasmie nie trzeba (zresztą jeśli już to mov byte [wynik], ah) bo i tak jedyną działającą opcją jest byte. Próby przeniesienia innej wielkości spowodują error mismatch in operand sizes - taka już po prostu specyfika architektury intela. - msm 2011-10-23 20:13
Całkiem możliwe,ja używałem MASMa i ów wymagał takiego zapisu jak podałem. - MasterBLB 2011-10-23 20:14

Pozostało 580 znaków

2011-10-23 20:20
0

Oki dziękuję za pomoc.Mam jeszcze takie pytanko.Próbowałem w prymitywny sposób wyświetlić jakąkolwiek liczbę i wyświetla mi krzaczki,Robię to tak.

section .text

global _start

_start:

mov eax,4
mov ebx,1
mov ecx,liczba1
mov edx,liczba1_ln

int 80h
mov eax,1

int 80h

section .data

liczba1 db 2
liczba1_ln equ $ - liczba1

Przydała by mi się wskazówka.

Pozostało 580 znaków

2011-10-23 20:23
0

Chcesz wypisać liczbę jak ciąg znaków, więc nie dziw się, że ci wypisuje jakieś krzaki.


Pozostało 580 znaków

2011-10-23 21:09
0

Nie rozumiem:P Chciałbym np dodać dwie liczby a potem wyświetlić wynik.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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