1 Востаннє редагувалося kerimov_e (20.03.2021 21:41:19)

Тема: Помилки в Асемблерному коді

В мене завдання написати код на асемблері та на С++ за наступною формулою https://replace.org.ua/uploads/images/8036/083a4f0fbbcff67b65064d43e96c4173.png, де а=-4, b=10, c=5, d=-7. На С++ я написав, а на Асемблері не вдається. Різні результати.
Код на С++

int main()
{
    double X;
    int a = -4,
        b = 10,
        c = 5,
        d = -7;
    X = pow(d, 3) +((b * b) - 3 * c * b) / (pow(a, 2) + 9) + 350;
    std::cout << "X= "<<X;
}

Вивід: X=5

На асемблері я написав наступний код:

.686P
.MODEL         FLAT, STDCALL
.STACK         4096
.DATA
MB_OK        EQU    0
m        EQU        481h    ;m = 350d
str_format      DB     "X = %d",0
str_buffer     DB    256 dup (0)
m_title        DB    "Lab #5",0
A            DB      0Ch     ;a = -4
B            DB         0FCh    ;b = 10
C1                DB      0F0h    ;c = 5
D            DB         02h     ;d = -7
X            DD      ?

    extern MessageBoxA@16:NEAR
    extern wsprintfA:NEAR
.CODE
Start:
            XOR     eax, eax    ;ax = 0
            MOV     al, C1       ;al = b
            CBW                    ;ax = b
        
            XOR     ebx, ebx     ;bx = 0
            MOV     bl, A          ;bl = b
            IMUL    bx             ;ax = b^2
            IMUL    bx             ;ax = c*b
            IMUL    bx             ;ax=b^2-3*c*b

            SUB     eax, eax       ;ax = ax-3
            
            XOR     ebx, ebx       ;bx = 0
            MOV     bl, D            ;bl = a
            IDIV    bx                ;ax = a^2+9
            XOR     ebx, ebx       ;ebx = 0
            MOV     ebx, eax       ;bx = ax = (ax-3*c) / a^2+9
        
            XOR     eax, eax        ;ax = 0
            MOV     al, D             ;al = d
            IMUL    ax                 ;ax = d^3

            ADD      ebx, eax     ;bx = d*3 + ((b^2-3*c*b) / a^2+9) 
            ADD      ebx, m       ;bx =  d*3 + ((b^2-3*c*b) / a^2+9) +350
            MOV     BYTE PTR[X], bl
  

            PUSH    X
            PUSH    OFFSET str_format
            PUSH    OFFSET str_buffer
            CALL    wsprintfA
            ADD     esp, 12

            PUSH    MB_OK
            PUSH    OFFSET m_title
            PUSH    OFFSET str_buffer
            PUSH    0
            CALL    MessageBoxA@16

            RET
END Start

а на асемблері вивід Х=144

2

Re: Помилки в Асемблерному коді

Що це за кумедія? Далі не дивився.

A            DB      0Ch         ;a = -4
B            DB         0FCh           ;b = 10
C1            DB      0F0h        ;c = 5
D            DB         02h         ;d = -7
Подякували: koala1

3 Востаннє редагувалося kerimov_e (20.03.2021 21:42:39)

Re: Помилки в Асемблерному коді

Ви про форматування чи що? Я не розумію чому воно таке... В VS воно рівне
Я в асемблері повний нуль, але щось намагався написати...

4

Re: Помилки в Асемблерному коді

Ні, чому 0FCh дорівнює 10

5

Re: Помилки в Асемблерному коді

В прикладі до завданню був наступний код для початку:

.686P
.MODEL         FLAT, STDCALL
.STACK         4096
.DATA
MB_OK        EQU        0
m            EQU        481h                ;m = 1153d
str_format          DB           "X = %d",0
str_buffer         DB        256 dup (0)
m_title        DB        "Lab #5",0
A            DB          0Ch                 ;a = 12
B            DB         0FCh               ;b = -4
C1                DB          0F0h                ;c = -16
D            DB         02h                 ;d = 2
X            DD          ?

    extern MessageBoxA@16:NEAR
    extern wsprintfA:NEAR
.CODE
Start:

а 10 - це значення, згідно завданню де а=-4, b=10, c=5, d=-7.

6

Re: Помилки в Асемблерному коді

В прикладі все правильно, а у вас порнографія:

B            DB         0FCh           ;b = 10
Подякували: leofun011

7 Востаннє редагувалося tchort (20.03.2021 21:55:22)

Re: Помилки в Асемблерному коді

Прихований текст
g++ -S main.cpp

8

Re: Помилки в Асемблерному коді

А як тоді правильно? Я не розумію

9

Re: Помилки в Асемблерному коді

kerimov_e написав:

А як тоді правильно? Я не розумію

Перетворіть шістнадцяткове 0FCh на десяткове число. Покажіть свої міркування.

10

Re: Помилки в Асемблерному коді

Отак:

B            DB         0Ah           ;b = 10

11

Re: Помилки в Асемблерному коді

Ще трохи комедії:

            MOV     bl, A          ;bl = b

12

Re: Помилки в Асемблерному коді

Я повний нуль в асемблері, так що дуже прошу не сміятися, а допомогти виправити помилки, я знаю, що їх тут дуже багато.

Як я зрозумів, то

A            DB      0F4h     ;a = -4
B            DB         0Аh     ;b = 10
C1                DB      05h    ;c = 5
D            DB         0F7h     ;d = -7
X            DD      ?

повинно бути так?

13

Re: Помилки в Асемблерному коді

Я дуже вас прошу: почитайте хоч щось по асемблеру. Хоч Абеля. Ви не відгадаєте.

14

Re: Помилки в Асемблерному коді

Я тільки починаю вчити асемблер, а на дистанційному навчанні нічого не пояснили навіть не навели приклади літератури, лише дали завдання та дедлайн. Я дуже прошу допомогти, щоб в подальшому не виникали проблеми, бо таких завдань ще 10 штук.

15 Востаннє редагувалося tchort (20.03.2021 23:36:53)

Re: Помилки в Асемблерному коді

kerimov_e написав:

Я тільки починаю вчити асемблер, а на дистанційному навчанні нічого не пояснили навіть не навели приклади літератури, лише дали завдання та дедлайн. Я дуже прошу допомогти, щоб в подальшому не виникали проблеми, бо таких завдань ще 10 штук.

Ну то і зробіть як я написав, такому разі, і нічого їм не пояснюйте взамін, коли і на вивчення часу не дали.

https://godbolt.org/
Флажки компілятору можна передати справа зверху.

16 Востаннє редагувалося kerimov_e (21.03.2021 02:48:25)

Re: Помилки в Асемблерному коді

Після двох годин пошуку прикладів я написав наступне, але відповідь завжди різна. Не можу знайти помилку.

.686P
.MODEL      FLAT, STDCALL
.STACK      4096
.DATA
MB_OK       EQU     0
m           EQU     848h        ;m = 350d
str_format  DB     "X = %d",0
str_buffer  DB      256 dup (0)
m_title     DB      "Lab #5",0
A           DB      0F4h    ;a = -4
B           DB      0Ah    ;b = 10
C1          DB      05h      ;c = 5
D           DB      0F7h     ;d = -7
X           DD      ?

    extern MessageBoxA@16:NEAR
    extern wsprintfA:NEAR
.CODE
Start:

movsx           edx, A
imul            ecx, ecx    ;ecx = a^2
add             ecx, edx     ;ecx = a^2+9

movsx           ecx, B   
imul            ebx, ecx   ;ebx = b^2
imul            ecx, ecx

movsx           edx, C1
imul            edx, edx    ;edx =(-3*c)
sub             ecx, edx    ;ebx=b^2-3*c*b

movsx           eax, D
imul            eax, eax    ;eax = d^3
cdq                         
idiv            ecx           ;eax = (b^2-3*c*b)/(a^2+9)

add         eax, ebx     ;eax = d^3 +(b^2-3*c*b)/(a^2+9)
add         eax, m     ;eax = d^3 +(b^2-3*c*b)/(a^2+9)+350

push            eax

PUSH            OFFSET str_format
PUSH            OFFSET str_buffer
CALL            wsprintfA
ADD             esp, 12
PUSH            MB_OK
PUSH            OFFSET m_title
PUSH            OFFSET str_buffer
PUSH            0
CALL            MessageBoxA@16
RET
END START

17

Re: Помилки в Асемблерному коді

От мені реально цікаво - скільки вам ще часу знадобиться, щоб написати

A            DB            -4  ;a = -4

замість усієї цієї маячні? 0F4h - це -12.
І нащо DB? Ви ж 32-бітні числа використовуєте?

A            DD            -4  ;a = -4

І до біса всі ці MOVSX - це тепер звичайний MOV.

movsx           edx, A   ;edx тепер містить A
imul            ecx, ecx    ;ecx = a^2 - з чого б це? ecx тепер ecx^2; а оскільки ви його перед цим не почистили, то там якесь сміття
add             ecx, edx     ;ecx = a^2+9 - а тепер сміття плюс A, а не плюс 9. Чому ви вирішили, що A=9?

Прочитайте нарешті книжку.

Подякували: wander, leofun012

18

Re: Помилки в Асемблерному коді

я зробив :) тему можна закривати

.686P
.MODEL      FLAT, STDCALL
.STACK      4096
.DATA
MB_OK       EQU     0
str_format  DB     "X = %d",0
str_buffer  DB      256 dup (0)
m_title     DB      "Lab #1",0
A           DB      -4    ;a = -4
B           DB      10    ;b = 10
C1          DB      5      ;c = 5
D           DB      -7     ;d = -7
X           DD      ?

    extern MessageBoxA@16:NEAR
    extern wsprintfA:NEAR
.CODE
Start:

movsx eax, A
imul eax    ; a^2 
add eax, 9     ;eax = a^2+9
mov    ecx,eax        ;ecx = a^2+9
mov eax,3        ;3
movsx edx,c1
imul edx        ;3c
movsx edx,b
imul edx        ;3cb
mov ebx,eax        ;ebx=3cb
movsx eax,b        ;b
imul eax        ;b^2
sub eax,ebx        ;eax=b^2-3cb
cdq
idiv ecx           ;eax = (b^2-3*c*b)/(a^2+9)
mov ecx,eax     ;ecx = (b^2-3*c*b)/(a^2+9)
movsx eax,d        ;d
mov ebx,eax        ;d
imul eax        ;d^2
imul ebx        ;d^3
add eax,ecx        ;d^3-(b^2-3*c*b)/(a^2+9)
add eax,350
mov x,eax
push            eax
PUSH            OFFSET str_format
PUSH            OFFSET str_buffer
CALL            wsprintfA
ADD             esp, 12
PUSH            MB_OK
PUSH            OFFSET m_title
PUSH            OFFSET str_buffer
PUSH            0
CALL            MessageBoxA@16
RET
END START
Подякували: 0xDADA11C71