The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск языка программирования Rust 1.54, opennews (??), 29-Июл-21, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


322. "Выпуск языка программирования Rust 1.54"  +2 +/
Сообщение от Аноним (-), 30-Июл-21, 12:44 
> Сколько весит хелло ворд на русте с зависимостями?

500 байт


$ cat hello.rs
#![no_std]
#![no_main]
use core::panic::PanicInfo;
use syscall::syscall;

#[panic_handler]
fn panic(_info: &PanicInfo) -> ! { loop {} }

#[no_mangle]
pub extern fn _start() -> ! {
    let message = "Hello World\n".as_bytes();
    unsafe {
        syscall!(WRITE, 0, message.as_ptr(), message.len());
        syscall!(EXIT,0);
    }
    loop {}
}


$ ./hello
Hello World

$ ll hello
-rwxr-x---   496B 30 Jul. 12:41 hello*
$  readelf -d hello  
There is no dynamic section in this file.
$ objdump -d  hello


Disassembly of section .text:

00000000004000b0 <.text>:
  4000b0:    55                       push   %rbp
  4000b1:    48 89 e5                 mov    %rsp,%rbp
  4000b4:    6a 04                    pushq  $0x4
  4000b6:    58                       pop    %rax
  4000b7:    6a 09                    pushq  $0x9
  4000b9:    5a                       pop    %rdx
  4000ba:    be cc 00 40 00           mov    $0x4000cc,%esi
  4000bf:    31 ff                    xor    %edi,%edi
  4000c1:    0f 05                    syscall
  4000c3:    6a 01                    pushq  $0x1
  4000c5:    58                       pop    %rax
  4000c6:    31 ff                    xor    %edi,%edi
  4000c8:    0f 05                    syscall
  4000ca:    eb fe                    jmp    0x4000ca

Ответить | Правка | К родителю #293 | Наверх | Cообщить модератору

331. "Выпуск языка программирования Rust 1.54"  +2 +/
Сообщение от n00by (ok), 30-Июл-21, 13:41 
Интересный листинг.

00000000004000b0 <.text>:
  4000b0:    55                       push   %rbp
  4000b1:    48 89 e5                 mov    %rsp,%rbp
  4000b4:    6a 04                    pushq  $0x4           ; #define __NR_stat 4
  4000b6:    58                       pop    %rax
  4000b7:    6a 09                    pushq  $0x9           ; строка Hello World занимает 11 байт.
  4000b9:    5a                       pop    %rdx
  4000ba:    be cc 00 40 00           mov    $0x4000cc,%esi
  4000bf:    31 ff                    xor    %edi,%edi
  4000c1:    0f 05                    syscall
  4000c3:    6a 01                    pushq  $0x1           ; #define __NR_write 1
  4000c5:    58                       pop    %rax
  4000c6:    31 ff                    xor    %edi,%edi
  4000c8:    0f 05                    syscall
  4000ca:    eb fe                    jmp    0x4000ca

#define __NR_exit 60

Вот как выглядит корректный и с претензией минимальность


; fasm demonstration of writing 64-bit ELF executable
; (thanks to Franti.ek G.bri.)

; syscall numbers: /usr/src/linux/include/asm-x86_64/unistd.h
; parameters order:
; r9    ; 6th param
; r8    ; 5th param
; r10   ; 4th param
; rdx   ; 3rd param
; rsi   ; 2nd param
; rdi   ; 1st param
; eax   ; syscall_number
; syscall

format ELF64 executable 3

segment readable executable

entry $

           mov     edx,msg_size    ; CPU zero extends 32-bit operation to 64-bit
                                   ; we can use less bytes than in case mov rdx,...
           lea     rsi,[msg]
           mov     edi,1           ; STDOUT
           mov     eax,1           ; sys_write
           syscall

           xor     edi,edi         ; exit code 0
           mov     eax,60          ; sys_exit
           syscall

segment readable writeable

msg db 'Hello 64-bit world!',0xA
msg_size = $-msg


Ответить | Правка | Наверх | Cообщить модератору

333. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от Владимирemail (??), 30-Июл-21, 14:12 
push 1 / pop edi занимает меньше байт, чем mov edi, 1. mov eax, 1 то же самое. Да и mov eax, 60.
Ответить | Правка | Наверх | Cообщить модератору

336. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от n00by (ok), 30-Июл-21, 14:34 
Речь не об опкодах, а о номерах системных вызовов. См. комментарии в первом листинге.
Ответить | Правка | Наверх | Cообщить модератору

346. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от Аноним (-), 30-Июл-21, 15:04 
> Интересный листинг.
>
 
>     pushq  $0x4    
>       ; #define __NR_stat 4
>     pushq  $0x1    
>       ; #define __NR_write 1

> #define __NR_exit 60
> Вот как выглядит корректный и с претензией минимальность

Вы там поаккуратнее с ярлыками и суждениями о "корректности":


head -14 /usr/src/sys/sys/syscall.h
/*
* System call numbers.
*
* DO NOT EDIT-- this file is automatically @generated.
* $FreeBSD$
*/

#define    SYS_syscall    0
#define    SYS_exit    1
#define    SYS_fork    2
#define    SYS_read    3
#define    SYS_write    4
#define    SYS_open    5
#define    SYS_close    6

Ответить | Правка | К родителю #331 | Наверх | Cообщить модератору

355. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от n00by (ok), 30-Июл-21, 16:07 
>[оверквотинг удален]
>  * $FreeBSD$
>  */
> #define SYS_syscall 0
> #define SYS_exit 1
> #define SYS_fork 2
> #define SYS_read 3
> #define SYS_write 4
> #define SYS_open 5
> #define SYS_close 6
>

Да, это получился зачётный конфуз.

Тем не менее вопрос по размеру строки в силе. "Hello World\n" 12 байт без терминатора, а в листинге 9. В оригинале было "Hello BSD"?

Ответить | Правка | Наверх | Cообщить модератору

358. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от Аноним (-), 30-Июл-21, 16:16 
> Тем не менее вопрос по размеру строки в силе. "Hello World\n" 12
> байт без терминатора, а в листинге 9. В оригинале было "Hello BSD"?

Подловил. Просто "sometext\n"

Ответить | Правка | Наверх | Cообщить модератору

409. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от n00by (ok), 30-Июл-21, 18:59 
Это ещё кто кого подловил. Если бы не эта разница в длине, я бы не обратил внимания, или может даже догадался про другую систему подумать. А так нашёл лишнее подтверждение, что код какой-то "не тот". :)
Ответить | Правка | Наверх | Cообщить модератору

432. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от Аноним зеленый (?), 30-Июл-21, 19:56 
Нужно понимать, что минимальный не значит быстрый. Он может быть сильно медленней при исполнении.
Ответить | Правка | К родителю #346 | Наверх | Cообщить модератору

345. "Выпуск языка программирования Rust 1.54"  +/
Сообщение от Аноним (345), 30-Июл-21, 15:01 
Можно ссылку на собираемый проектик?
Ответить | Правка | К родителю #322 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру