Wstawka asm do c+, problem/zlecenie?

0

Witam, mam problem ze wstawka asm do c++, wyskakuje mi taki błąd: "error C2415: improper operand type"
W jaki sposób mogę uporać się z tym problemem ?

Ps. Jeśli chciałby ktoś przyjąć napisanie programu jako zlecenia to proszę o pw.

1

Och i na pewno ktoś BEZ KODU będzie ci wstanie udzielić odpowiedzi. Szczęśliwie spamowałeś mi już tym wcześniej na PW więc widziałem kod. Na oko to masz zwyczajnie błąd w kodzie bo robisz

mov sum, a

zamiast jakiegoś

mov [sum], ax
0
#define N 4
const char k = N;
char tab[N] = { 1, 2, 3, 4};
unsigned short sum;
unsigned short srednia_cal;
unsigned short srednia_reszta;

int main()
{
    __asm{
        mov cl, 0
        mov ax, 0
            mov dh, 0
            mov ebx, offset tab
        start :
        mov dl, byte ptr[ebx]
            add ax, dx
            inc ebx
            inc cl
            cmp k, cl
            jg start
            mov [sum], ax

            mov edx, 0
            mov ecx, N
            div ecx
            mov [srednia_cal], eax

    };

    cout << sum << endl;
    cout << srednia_cal << endl;
    return 0;
} 

Suma działa dziękuje, a teraz robię średnią i mam taki problem: error C2443: operand size conflict
Wiem że działanie div ecx powinno wynik dzielenia zapisać w eax, reszta w rejestrze edx, ale pewnie coś pokręciłem bo mało to rozumiem, proszę o pomoc

1

Błąd masz taki że nie rozumiesz co robisz. To nie jest obojętne czy piszesz al czy ah czy ax czy eax a dla ciebie chyba jednak jest.
al -> 8 bitów - 1 bajt
ah -> 8 bitów - 1 bajt
ax to jest złożenie al i ah i ma 16 bitów - 2 bajty
eax ma 32 bity - 4 bajty

char ma 8 bitów - 1 bajt
short int ma 16 bitów - 2 bajty
int ma 32 bity - 4 bajty

Więc operacja

mov    [srednia_cal], eax

nie ma sensu bo eax to 32 bity a srednia_cal to zmienna short int która ma 16 bitów.

0

Dzięki,

mov dx, 0
      mov cx, N
      div cx
      mov[srednia_cal], ax
      mov[srednia_reszta], dx 

ale coś mi źle liczy reszte.

0

Niemożliwe ;] Robisz dzielenie dx:ax / cx i wynik masz w ax a resztę w dx. Dla jakiego przykładu ci nie działa?

0
#include <iostream>
using namespace std;

#define N 6
const char k = N;
char tab[N] = { 1, 2, 3, 4, 8,3};
unsigned short sum;
unsigned short srednia_cal;
unsigned short srednia_reszta;

int main()
{
    __asm{
        mov cl, 0
        mov ax, 0
            mov dh, 0
            mov ebx, offset tab
        start :
        mov dl, byte ptr[ebx]
            add ax, dx
            inc ebx
            inc cl
            cmp k, cl
            jg start
            mov [sum], ax

            mov dx, 0
            mov cx, N
            div cx
            mov[srednia_cal], ax
            mov[srednia_reszta], dx

    };

    cout << sum << endl;
    cout << srednia_cal << endl;
    cout << srednia_reszta << endl;

    return 0;
}

sum 21
srednia 3
reszta 3 a powinna być 5
Dla sumy 20 działa dobrze.

0

Że co? Robisz dzielenie 21/6 którego wynikiem jest 3 i 3 reszty, bo 3*6 + 3 = 21. Ty znasz matematykę? o_O

0

EHEHE LOL, a ja wbiłem sobie że tam ma być ta liczba po przecinku. ; ]
Dobra dzięki za pomoc.

0

A jak można obliczyć tą liczbę po przecinku ? gdy np. średnia wynosi 12.3452 jak obliczyć tą drugą cześć po przecinku ?

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