Ответы пользователя по тегу Языки программирования
  • Для чего на ZX Spectrum сделали USR функцией?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Смысл функции - возвращать результат обработки аргументов, а здесь просто запускается программа в машинных кодах по заданному адресу.

    Ну вообще она может возвращать значение записанное вызванным кодом в регистровую пару BC:
    poke 30000, 1
    poke 30001, 99
    poke 30002, 0
    poke 30003, 201
    print usr 30000
    > 99

    можно проверить в онлайн-эмуляторе.
    spoiler
    poke == o
    print == p
    usr == ctrl+shift l
    Ответ написан
  • Описание грамматики, где ошибка?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вот описание

    Это описание не компилируется в силу его неполноты. Приведи полный, собирающийся текст.
    Ответ написан
    Комментировать
  • Как сказать процессору "выполни это"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как сказать процессору «выполни это»?

    Превратить это в бинарник для начала и посмотреть, что там. Это можно (было бы) сделать командой xxd -r dump, но в твоём дампе странный порядок байтов в словах. Можно сначала перевернуть байты, а потом прогнать через xxd:
    sed 's/\([^ ]*\)/\1/;s/ \(..\)\(..\)/ \2\1/g' < dump | xxd -r > bin
    . Прогнав полученный код через дизассемблер можно понять (по переходу к адресу 0x7c05), что это код для бут-сектора:
    $ objdump -b binary -m i8086 -D bin        
    
    bin1:     file format binary
    
    Disassembly of section .data:
    
    00000000 <.data>:
       0:   ea 05 7c 00 00          ljmp   $0x0,$0x7c05
       5:   31 c0                   xor    %ax,%ax
    ...

    Дальше можно записать этот код в образ диска и попытаться загрузиться с него:
    $ head -c 254 /dev/zero >> bin
    $ printf "\x55\xaa" >> bin
    $ qemu-system-i386 -hda bin -d in_asm,exec -D log

    Поискав в созданном логе адрес 7c00 можно увидеть, что код делает при выполнении:
    ----------------
    IN:
    0x00007c00:  ea 05 7c 00 00           ljmpw    $0x0:$0x7c05
    
    Trace 0: 0x7f7a98164f00 [00000000/00007c00/0x40]
    ----------------
    IN:
    0x00007c05:  31 c0                    xorw     %ax, %ax
    0x00007c07:  8e d8                    movw     %ax, %ds
    0x00007c09:  8e d0                    movw     %ax, %ss
    
    Trace 0: 0x7f7a98165040 [00000000/00007c05/0x40]
    ----------------
    IN:
    0x00007c0b:  bc 00 7c                 movw     $0x7c00, %sp
    
    Trace 0: 0x7f7a98165180 [00000000/00007c0b/0x48]
    ----------------
    IN:
    0x00007c0e:  88 16 db 7c              movb     %dl, 0x7cdb
    0x00007c12:  31 c0                    xorw     %ax, %ax
    0x00007c14:  8e c0                    movw     %ax, %es
    0x00007c16:  bb 00 80                 movw     $0x8000, %bx
    0x00007c19:  8a 16 db 7c              movb     0x7cdb, %dl
    0x00007c1d:  b6 00                    movb     $0, %dh
    0x00007c1f:  b1 02                    movb     $2, %cl
    0x00007c21:  b5 00                    movb     $0, %ch
    0x00007c23:  b0 30                    movb     $0x30, %al
    0x00007c25:  e8 53 00                 callw    0x7c7b
    
    Trace 0: 0x7f7a98165280 [00000000/00007c0e/0x40]
    ----------------
    IN:
    0x00007c7b:  b4 02                    movb     $2, %ah
    0x00007c7d:  cd 13                    int      $0x13

    -- он хочет загрузить 48 секторов начиная со второго с текущего диска в память по адресу 0x8000, потом делает какую-то скучную фигню, а потом…
    ----------------
    IN:
    0x00007c2f:  fa                       cli
    0x00007c30:  0f 01 16 f4 7c           lgdtw    0x7cf4
    0x00007c35:  0f 20 c0                 movl     %cr0, %eax
    0x00007c38:  66 83 c8 01              orl      $1, %eax
    0x00007c3c:  0f 22 c0                 movl     %eax, %cr0
    
    Linking TBs 0x7f7a98167580 [00007c2b] index 0 -> 0x7f7a981676c0 [00007c2f]
    Trace 0: 0x7f7a981676c0 [00000000/00007c2f/0x40]
    ----------------
    IN:
    0x00007c3f:  ea 44 7c 08 00           ljmpw    $0x8:$0x7c44
    
    Trace 0: 0x7f7a981678c0 [00000000/00007c3f/0xc0]
    ----------------
    IN:
    0x00007c44:  66 b8 10 00              movw     $0x10, %ax
    0x00007c48:  8e d8                    movl     %eax, %ds
    
    Trace 0: 0x7f7a98167a00 [00000000/00007c44/0x90]
    ----------------
    IN:
    0x00007c4a:  8e c0                    movl     %eax, %es
    
    Trace 0: 0x7f7a98167b40 [00000000/00007c4a/0x90]
    ----------------
    IN:
    0x00007c4c:  8e e0                    movl     %eax, %fs
    0x00007c4e:  8e e8                    movl     %eax, %gs
    0x00007c50:  8e d0                    movl     %eax, %ss
    
    Trace 0: 0x7f7a98167c80 [00000000/00007c4c/0x90]
    ----------------
    IN:
    0x00007c52:  bc 00 c0 07 00           movl     $0x7c000, %esp
    
    Trace 0: 0x7f7a98167dc0 [00000000/00007c52/0xb8]
    ----------------
    IN:
    0x00007c57:  e8 a4 03 00 00           calll    0x8000

    …переключается в защищённый режим и вызывает только что загруженный код.

    как например запихнуть это в exe файл?

    в exe-файл это запихнуть можно, но в таком виде как есть -- это бесполезно, потому что этот код привязан к абсолютным адресам.
    Ответ написан
    Комментировать
  • При x = x + 1 чему будет равно х?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    при x = x + 1 будет x равняться "2"

    x = x + 1 -- это не уравнение. Это запись следующей команды: "прибавить к текущему значению переменной x единицу и поместить результат в переменную x". Соответственно результат будет зависеть от значения переменной x перед этой командой.

    если я объявляю переменную через int x; и потом ничего в неё не кладу, то там хранится ноль на Си?

    Если вы определяете переменную как int x; вне всех функций, то в С и С++ там изначально хранится 0. Если вы делаете то же самое внутри функции, то начальное значение не определено. Технически там будет либо мусор находящийся в стеке или в регистре процессора ассоциированном с данной переменной, либо какое-нибудь отладочное значение записанное туда компилятором специально для отлова обращений к неинициализированным переменным.
    Ответ написан
    Комментировать
  • Как в yacc описать WHILE?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В чём заключается ваш вопрос?
    Если в "не могу понять - как тут описать цикл", то в этом месте вам нужно создать узел AST (или какое у вас внутреннее представление структуры программы), описывающий цикл, ссылающийся на тело цикла (line, $2) и условие окончания (condition, $4).
    Ответ написан
    Комментировать
  • Тип с плавающей запятой — Real или Float?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    На данный момент в языке уже есть типы Integer[n] и Word[n]

    Word -- тоже ни разу не однозначное слово, особенно на всяких забавных ABI типа x32 или мипсового n32: хотя регистры процессора при этом 64-битные, указатели, инты и лонги -- 32-битные.
    Ответ написан
    3 комментария
  • Что значит REF в языках программирования?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    <вид>::=BOOL|INT|REF<вид>

    Выходит что возможны как просто BOOL, INT но и записи вида REF BOOL/REF INT.

    Из процитированного вами фрагмента это никак не следует.
    Ответ написан
    3 комментария
  • Задачки на "дробление чисел" для бенчмарков?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Странные у вас ассоциации с "дроблением чисел": ваши примеры сплошь целочисленные.
    Я бы предложил обращение матриц, численное решение дифур, рейтрейсинг.
    Ответ написан
    Комментировать
  • Почему реализовать C настолько сложно?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Компилятор С написать несложно. Сложно написать его так, чтобы он генерировал качественный код. Подавляющее большинство багов gcc связано с оптимизацией.
    Ответ написан
    5 комментариев