LINUX.ORG.RU

кто знает хорошо Assembler Gas

 ,


1

3

здрасьте , здрасьте люди добрые

помогите пожалуйста разобраться !

вот так я могу сделать на nasm

section .bss
sl resb 8

section .text
global start
start:

mov dword[sl], "111"
mov rax, 4
mov rbx, 1
mov rcx, sl
mov rdx, 8
int 0x80
mov rax, 1
int 0x80

это на nasm

а вот такое же я делал на Gas, но не помню как.



.section .bss
sl: 
.space 8
.section .text
global main
main:
// как это написать на  Gas чтобы вывести символьный массив?
mov $4, %rax
mov $1, %rbx
mov $  , %rcx
mov $8, %rdx

int $0x80
mov $1, %rax
int $0x80

р

чтобы вывести символьный массив

.intel_syntax noprefix

#.bss
#    .comm   sl  8

.data
    sl: .asciz  "Hello!\n"

.text
    .global _start
    
    _start:

        mov rax, 4
        mov rbx, 1
        mov rcx, offset sl
        mov rdx, 8
        int 0x80
        
        mov rax, 1
        mov rbx, 0
        int 0x80

mov dword[sl], «111»

Вот это фиг знает. У меня только так получилось:

mov dword ptr sl, ('H')+('e'<<8)+('l'<<16)+('l'<<24)
anonymous
()
Ответ на: комментарий от LGH

Например, так:

.intel_syntax noprefix

SYS_exit   = 60
SYS_write  = 1

.data
    some_numbers:   .8byte  80085, 317, 4071505
    
    buffer:         .zero   20
    newline_char:   .byte   '\n'

.text
    .global _start
    
    _start:
        mov     rax,    qword ptr [some_numbers + rbx*8]
        call    print_unsigned_64bit_decimal
        inc     rbx
        cmp     rbx,    (buffer - some_numbers) / 8
        jne     _start
        call    exit
    
    print_unsigned_64bit_decimal:
        mov     rsi,    offset newline_char         # buffer end
        mov     rcx,    10
        1:
            mov     rdx,    0
            div     rcx
            add     rdx,    0x30
            dec     rsi
            mov     byte ptr [rsi], dl
            cmp     rax,    0
            jne     1b
        mov     rax,    SYS_write
        mov     rdi,    1
        mov     rdx,    offset newline_char + 1
        sub     rdx,    rsi                         # length
        syscall
        ret

    exit:
        mov rax, SYS_exit
        mov rdi, 0
        syscall

$ as nums.S -o nums.o && ld nums.o -o nums && ./nums
80085
317
4071505
anonymous
()
Ответ на: комментарий от anonymous

не. Я не помню, но как-то смог нечаяно сделать так, что вывел число на экран типа вот таким способом. то ли при компиляции какой-то ключ настрочил, то ли блажь компилятора.

но может вы найдете еще время и терпение и подскажите как сделать это.

.section .bss
st:
.space 8


.section text
.global main
main:


push %rbp
mov %rsp, %rbp

sub $20, %rbp
mov $123, -8(%rbp)

add $789, -8(%rbp)

// теперь я просто хочу вывести на экран то что лежит в  стеке.
посредством этого
 
mov -8(%rbp), %r13
mov %r13,  (st)


mov $4, %rax
mov $1, %rbx
mov $8, %rdx
int $0x80
mov $1, %rax
int $0x80

что и как положить в регистр  rcx, чтобы вывести на экран?
Assembler
() автор топика
Ответ на: комментарий от Assembler
push %rbp
...
int $0x80

Начнём с того, что ты мешаешь 64-битные регистры и 32-битные вызовы ядра. У тебя sp, получается, указывает в одно место, а когда ты делаешь вызов ядра для меньшей разрядности, то, по естественным причинам, 32-битный указатель указывает не пойми куда.

Для 64-битных процессоров используется другой ABI и другие номера системных вызовов. Также, вместо int $0x80 используется специнструкция syscall.

Так что ты определись, для какой архитектуры ты делаешь свою программу. Если для 32 бит, то используй 32-битные регистры и собирай с соответствующими ключами компилятора и линкера.

push %rbp
mov %rsp, %rbp
sub $20, %rbp

И что будет в результате? Может ты какой-то другой регистр имел в виду в третьей инструкции, м?

что и как положить в регистр rcx, чтобы вывести на экран?

Чтобы «вывести на экран», в rcx ничего не надо класть. В соответствии с ABI для x86-64, тебе нужно заполнить регистры rax, rdi, rsi и rdx. Вместо rcx тут используется rsi, поэтому инструкция будет такая: lea -8(%rbp), %rsi.

mov $123, -8(%rbp)
add $789, -8(%rbp)

В AT&T’шном синтаксисе, для указания размера операнда используются суффиксы, если нельзя однозначно определить размер. Вот эти две инструкции выше — как раз такой случай.

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

.text
    .global _start
    
    _start:
        push %rbp
        mov %rsp, %rbp
        sub $20, %rsp
        movl $0xa6968, -8(%rbp)

    print:
        mov $1, %rax
        mov $1, %rdi
        lea -8(%rbp), %rsi
        mov $3, %rdx
        syscall

    exit:
        mov $60, %rax
        mov $0, %rdi
        syscall
$ as print.S -o print.o && ld print.o -o print && ./print
hi

Чтобы выводить прям числа, смотри пример из моего комента выше.

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