2015-12-09 5 views
-1

меня это назначение, и х, у, г двойные переменные типа:x87 команд с плавающей запятой в код C

fldl x 
fldl y 
fmulp st, st(1) 
fldl z 
faddp st, st (1) 
fstpl z 

Переводя это в C, я получил это:

z+= x*y 

Я не уверен в этом? Правильно ли я перевел его? Спасибо, любая помощь оценена.

+0

Нет, я попытался загрузить некоторые компиляторы, которые поддерживают сборку, но похоже, что для этого требуется весь код, а не часть. Я не мог понять, как проверить фрагмент кода :( –

+0

https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html –

+0

Какой компилятор вы бы предложили? –

ответ

2

Да, вы правильно поняли значение.

Для дальнейшего использования вы можете просто вставить такой код в файл сборки и выполнить его в отладчике. От синтаксиса & t я предполагаю, что он предназначен для gas, ассемблера gnu. Вы можете проверить это следующим образом:

$ cat > test.s 
.att_syntax noprefix 
.globl _start 
_start: 
fldl x 
fldl y 
fmulp st, st(1) 
fldl z 
faddp st, st (1) 
fstpl z 
.data 
x: .double 2 
y: .double 3 
z: .double 4 
$ gcc -m32 -nostdlib -g test.s 
$ gdb ./a.out 
(gdb) b _start 
Breakpoint 1 at 0x80480b8: file test.s, line 4. 
(gdb) r 
Starting program: /var/tmp/./a.out 

Breakpoint 1, _start() at test.s:4 
4  fldl x 
(gdb) s 
5  fldl y 
(gdb) 
6  fmulp st, st(1) 
(gdb) 
7  fldl z 
(gdb) 
8  faddp st, st(1) 
(gdb) 
9  fstpl z 
(gdb) 
0x080480d4 in ??() 
(gdb) x/gf &z 
0x80490e4:  10 

Примечание я добавил некоторые тестовый вход в конце, и некоторые необходимые вещи на самом верху.

Вы можете, конечно же, изучить все регистры во время выполнения в любой точке, см. Справку gdb для других команд.

+0

Спасибо, это было очень полезно, я обязательно буду использовать его для дальнейшего использования. –