LINUX.ORG.RU

assembler AT&T as, GCC вопросики


0

0

Помогите разобраться.

Мне нужно вывести строку на экран из программы на assembler- gas.
строка может меняться - служит для отладки, является параметром.

1. можно ли в коде программы в сегменте .text как то определить
переменную и указать, что эта переменная есть адрес нужной мне строки.

про секцию .data я знаю, но это наверное не то что нужно.

2. Возможно можно определить переменную в секции .bss как массив байт,
но не знаю как потом её инициализировать в тексте программы.


char * p = "нужная строка";
Как это сделать на as ?


.segment .text

.global _start
.code 32

_start:
....
??


.end

Перерыл массу разных программ и доков, пока не нашел,
если не сложно подскажите.

Ответ на: комментарий от Davidov

.data
hello_str:
    .string "Hello, world!\n"
goodbye_str:
    .string "Goodbye, world!\n"
p:
    .quad hello_str

(я синтаксис точно не знаю, но идея, думаю такая)

Davidov ★★★★
()
Ответ на: комментарий от tzukko

Спасибо за ссылочки и "p: .quad hello_str"
интересно, но это все когда в сегменте .data

Возможно плохо или неправильно написал,
Мне нужно чтобы можно было в коде, в секции .text
в идеале хотелось бы создать похожее на

.segment .text
...
fn_macros_print "нужная строка 1"
...
fn_macros_print "нужная строка 2"

или

определить/инициализировать здесь не в .data
p ?? "нужная строка F" ??
mov $p, %eax
fn_function_print

.end


fn_macros_print - макрос
"нужная строка 1" - параметр
"нужная строка 2" - параметр

в данной ситуации я не знаю как в макросе определить параметр
как строку да ещё и разого размера
И как эту строку определять в секции .text

.macro fn_macros_print msg
...... ?

.endm


Может у кого есть соображения, может кто знает как это сделать под 'as'.

user209
() автор топика

$ as -alm a.s GAS LISTING a.s page 1 1 .macro fn_macros_print msg 2 call 1f 3 .asciz "\msg" 4 .align 5 1: 6 pop %eax 7 # Use address as want 8 .endm 9 .text 10 fn_macros_print "abc" 10 0000 E8040000 > call 1f 10 00 10 0005 61626300 > .asciz "abc" 10 > .align 10 > 1: 10 > 10 0009 58 > pop %eax 10 > 11

io ★★
()
Ответ на: комментарий от io

$ as -alm a.s
GAS LISTING a.s                         page 1
 
 
   1                            .macro  fn_macros_print msg
   2                            call    1f
   3                            .asciz  "\msg"
   4                            .align
   5                    1:
   6                            pop     %eax
   7                            # Use address as want
   8                            .endm
   9                            .text
  10                            fn_macros_print "abc"
  10 0000 E8040000      > call 1f
  10      00
  10 0005 61626300      > .asciz "abc"
  10                    > .align
  10                    > 1:
  10                    >
  10 0009 58            > pop %eax
  10                    >
  11

io ★★
()
Ответ на: комментарий от user209

call позволяет одновременно обойти вставленную строку 
(не выполнять же ее) и запомнить ее адрес.
После call адрес в стеке! 
Соответственно pop грузит в eax, есть желание - смени регистр.
Зачем еще mov?

io ★★
()
Ответ на: комментарий от io

 У меня другая архитектура, ARM, там нет call,
я использую безусловный переход, поэтому нужно строчку сохранить.
Я понял то что Вы мне написали, красиво, не уверен что есть аналог.
Я сделал так:

.macro  macro_print_msg  msg
	@; call 1f
	b    1f
ms_macro:	.asciz  "\msg"
	.align
	.byte   13,13,13,13
1:
        ldr    R0, =ms_macro   // адрес строчки в регистр 
        использование строчки
        .....

.endm
 

но макрос работает только 1 раз,  при многократном использовании
компилятор выдает ошибку повторного использования  'ms_macro'
Теперь мне нужно как то сделать так чтобы  'ms_macro' менялась
при использовании  предполагаю что это должен делать препроцессор,
но как его попросить ?
 
 Параметр = Параметр + 1  
 ms_macro_Параметр :	.asciz  "\msg"

Не знаете можно так сделать ?

user209
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.