Объединение строк из регистров и их печать (CPUID)

Начав изучать ассемблер NASM, я просматривал некоторые вопросы по ассемблеру здесь, в Stack Overflow, и нашел вот этот: Объединение строк из регистров и их печать

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

Я решил воспроизвести этот код в NASM, но не совсем понял рассматриваемый код MASM.
Я узнал о CPUID и протестировал несколько программ.

По порядку, я хотел бы знать, как мы можем объединить регистры, а затем вывести их на экран, ИСПОЛЬЗУЯ NASM.

Я хочу напечатать 'ebx' + 'edx' + 'ecx', потому что так организован вывод CPUID то, что я вижу в GDB.

Я позвонил CPUID с eax=1


person PySnake    schedule 21.10.2018    source источник


Ответы (1)


"Струна" - не очень точный термин. Строка идентификации поставщика CPUID/EAX=0 содержит только 12 символов ASCII, упакованных в 3 регистра типа DWORD. Нет ни символа завершения, как в C, ни информации о длине, как в PASCAL. Но это всегда одни и те же регистры и всегда 3*4=12 байт. Это идеально подходит для системного вызова записи:

section .bss

    buff resb 12

section .text
global _start

_start:

    mov eax, 0
    cpuid

    mov dword [buff+0], ebx     ; Fill the first four bytes
    mov dword [buff+4], edx     ; Fill the second four bytes
    mov dword [buff+8], ecx     ; Fill the third four bytes


    mov eax, 4                  ; SYSCALL write
    mov ebx, 1                  ; File descriptor = STDOUT
    mov ecx, buff               ; Pointer to ASCII string
    mov edx, 12                 ; Count of bytes to send
    int 0x80                    ; Call Linux kernel

    mov eax, 1                  ; SYSCALL exit
    mov ebx, 0                  ; Exit Code
    int 80h                     ; Call Linux kernel
person rkhb    schedule 21.10.2018
comment
Спасибо, но не могли бы вы рассказать мне больше о том, зачем использовать сеанс .bss для хранения этой переменной буфера. - person PySnake; 21.10.2018
comment
@PySnake: две причины: 1) буфер не инициализирован и 2) определение массива из 12 пустых байтов в разделе .data выглядит ужасно. В исполняемом файле есть только информация о длине раздела BSS, никаких значений типа DATA или TEXT. Весь сегмент строится при запуске программы. - person rkhb; 21.10.2018