Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

Asm, опять error

28.10.2014, 04:26. Показов 961. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
TLongInteger::  operator +   (const TLongInteger &Additional)
{
 TLongInteger Result;
 asm
 (
  "push %ebx"
  "pop %ebx"
 );
 return Result;
}
C:\Users\1BB3~1\AppData\Local\Temp\cczjyTAv.s|729|Error: bad register name `%ebxpop %ebx'|
Что ему нужно? По-одиночки строки работают.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2014, 04:26
Ответы с готовыми решениями:

Исправить ошибку в WxDev-C++: Error with debugging process: GDB Error: error, No source file named main.cpp
Здравствуйте товарищи! Новенький я в си, установил wxDev-C++, скомпилировал, запускаешь -...

Error LNK1120, error LNK2019, error LNK2028, queue
// свойство класса Parser queue<elem*>* postfix = new queue<elem*>; // строка, из-за...

Ошибка в тестовом примере: "Error 1 error C2143: syntax error : missing ';' before 'if'"
#include<iostream> using namespace std; int main(){ int x, a = 0, b = 10; (cin >> x).get(); ...

При сборке выдает ошибку "MASM: fatal error A1000: : 1.asm.asm"
"MASM : fatal error A1000: : 1.asm.asm :\1>link16 /TINY 1.asm.obj, 1.asm.com" Вопользовался...

5
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
28.10.2014, 08:06 2
GCC генерирует асм листинг и вставляет в него код из asm() как строку, затем отдает на компиляцию ассемблеру
строки
C++
1
2
"push %ebx"
  "pop %ebx"
сливаются в одну по правилам С++
C++
1
"push %ebxpop %ebx"
для указания что это несколько строк асм нужно добавлять \n в конце комманды
C++
1
2
3
4
5
asm
 (
  "push %ebx\n"
  "pop %ebx\n"
 );
P.S.: ИМХО,оставьте пока асм и напишите код на С++ и отдайте его на вход G++ с параметром -S(генерировать асм листинг, не компилировать) сравните то что выдал компилятор с тем что вы хотите сделать. Не понравилось что получилось? Попробуйте разные ключи оптимизации(их вагон и маленькая тележка), И только потом переписывайте на ассемблере.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.10.2014, 08:18  [ТС] 3
Цитата Сообщение от Cra3y Посмотреть сообщение
для указания что это несколько строк асм нужно добавлять \n в конце комманды
Цитата Сообщение от Cra3y Посмотреть сообщение
C++
1
2
asm ( "push %ebx\n"
"pop %ebx\n" );
Это работает, а
C++
1
2
3
4
5
6
7
8
9
10
11
TLongInteger
TLongInteger::  operator +   (const TLongInteger &Additional)
{
 TLongInteger Result;
 asm
 (
  "puch %ebx\n"
  "movl %0, %%ebx;" : : "r" (&Result.Data) : "%ebx"
 );
 return Result;
}
почему-то
C:\Projects\test\TLongInteger.cpp|159|error: invalid 'asm': operand number missing after %-letter|
Добавлено через 4 минуты
Цитата Сообщение от Cra3y Посмотреть сообщение
P.S.: ИМХО,оставьте пока асм и напишите код на С++ и отдайте его на вход G++ с параметром -S(генерировать асм листинг, не компилировать)
Это оператор сложения длинных целых, в нём мне нужен перенос флаг переноса, а если написать "загрузи байты в слова, сложи и за перенос юзай старшее слово суммы", то именно так он и скомпилит. Разве это хорошая замена аппаратному флагу?
0
шКодер самоучка
2227 / 1921 / 927
Регистрация: 09.10.2013
Сообщений: 4,262
Записей в блоге: 7
28.10.2014, 08:50 4
asm.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct test {
    int data;
};
 
test func(test a) {
    test r;
    asm(
    //"push %ebx\n"
    "movl (%0), %%ebx\n"
    :
    :"r" (&r.data) // поместить в любой свободный регистр указанное значение и использовать этот регистр как %0
    : "%ebx" // список затираемых регистров
    );
    return r;
}
Bash
1
g++ -S asm.cpp
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    .file   "as.cpp"
    .text
    .globl  _Z4func4test
    .type   _Z4func4test, @function
_Z4func4test:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    pushq   %rbx
    .cfi_offset 3, -24
    movl    %edi, -48(%rbp)
    leaq    -32(%rbp), %rax
#APP
# 13 "as.cpp" 1
    movl (%rax), %ebx
 
# 0 "" 2
#NO_APP
    movl    -32(%rbp), %eax
    popq    %rbx
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   _Z4func4test, .-_Z4func4test
    .ident  "GCC: (Debian 4.7.2-5) 4.7.2"
    .section    .note.GNU-stack,"",@progbits

Не по теме:

про ассемблер я знаю только что он есть



Добавлено через 1 минуту
Bash
1
g++ -O3 -S asm.cpp
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    .file   "as.cpp"
    .text
    .p2align 4,,15
    .globl  _Z4func4test
    .type   _Z4func4test, @function
_Z4func4test:
.LFB0:
    .cfi_startproc
    pushq   %rbx
    .cfi_def_cfa_offset 16
    .cfi_offset 3, -16
    leaq    -16(%rsp), %rax
#APP
# 13 "as.cpp" 1
    movl (%rax), %ebx
 
# 0 "" 2
#NO_APP
    movl    -16(%rsp), %eax
    popq    %rbx
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE0:
    .size   _Z4func4test, .-_Z4func4test
    .ident  "GCC: (Debian 4.7.2-5) 4.7.2"
    .section    .note.GNU-stack,"",@progbits
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
28.10.2014, 09:15 5
Цитата Сообщение от taras atavin Посмотреть сообщение
почему-то
Почему в первой строке один знак процента перед ebx, а во второй два?
В поле clobbered (третье поле в 8-й строке) знак процента не нужен.
Что за инструкция такая puch?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.10.2014, 09:24  [ТС] 6
Цитата Сообщение от castaway Посмотреть сообщение
Почему в первой строке один знак процента перед ebx, а во второй два?
Не знаю. По одной они компилятся.

Добавлено через 3 минуты
Цитата Сообщение от castaway Посмотреть сообщение
Что за инструкция такая puch?
push. Очепятка, в коде исправлено.
0
28.10.2014, 09:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2014, 09:24
Помогаю со студенческими работами здесь

опять Runtime Error!
Решал эту задачу, при проверке Wrong Answer 1 test. При компиляции Runtime error. {$R+}...

Опять I/O Error 105
program ProjectX; uses Windows, SysUtils; type telem=Integer; tlist=^Node; ...

Fatal error A1000: cannot open file : .\calc3.asm
Ситуация такая: в Visual Studio 2005 создан проект с двумя файлами: кодом c++ (main.cpp) и...

Опять "[Fatal Error] F2039 Could not create output file"
Здравствуйте, уважаемые форумчане!=) Много искал как решить подобную проблему, но так и не нашел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru