Консультация № 200646
14.04.2021, 15:34
0.00 руб.
0 12 1
Здравствуйте есть код на nasm который выводит сигнатуру процессора десятичным числом через фунцию call printf %u как мне вывести в двоичном числе?
x86 nasm windows консоль.
Код:
global main

extern printf

extern ExitProcess@4

segment .data
Not_Supp db 'CPUID not supported', 10, 0
Supp db 'CPUID supported', 10, 0
Strl db 'Number function: %d', 10
db 'ID: %s', 10, 0
ModelStr db 'signature %u %Xh', 10, 0
;Number dd 0
Buf times 32 db 0
Buf_Length equ $ - Buf - 1
db 0
endline db 13,10,'$'

segment .code
main:
pushfd
pop eax
mov ebx, eax
xor eax, 200000h
push eax
popfd
pushfd
pop eax
cmp eax, ebx
jne CPUIDSupp
push Not_Supp
call printf
jmp @exit
CPUIDSupp:
push Supp
call printf
mov eax, 0
cpuid
mov dword [Buf], ebx
mov dword [Buf+4], edx
mov dword [Buf+8], ecx
push Buf
push eax
push Strl
call printf

;push 32
;push dword 0
;push Buf
;call memset

mov eax, 1
cpuid
push eax
push eax
push ModelStr
call printf


@exit:
push dword 0
call ExitProcess@4

Обсуждение

давно
Старший Модератор
31795
6196
14.04.2021, 16:09
общий
Адресаты:
ак мне вывести в двоичном числе

В строку преобразовывать не пробывали?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400537
50
14.04.2021, 16:16
общий
Адресаты:
Цитата: Зенченко Константин Николаевич
В строку преобразовывать не пробывали?

Не понял немного, разве ModelStr уже не строка? Я по разному уже крутил и пытался вывести, не получилось.
Об авторе:
Твое внимание станет мой энергией
давно
Старший Модератор
31795
6196
14.04.2021, 16:48
общий
Адресаты:
Цитата: Степанов Иван /REDDS
'signature %u %Xh'

Это строка формата вывода.
printf - выводимое число(пусть будет 20210414) преобразовывает в строку и подставляет её вместо ключа %u
т.е на экране будет signature 20210414.

Но бинарного ключа у printf нет, т.к. он практически необходимости в нем нет.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400537
50
14.04.2021, 16:56
общий
Цитата: Зенченко Константин Николаевич
Это строка формата вывода.
printf - выводимое число(пусть будет 20210414) преобразовывает в строку и подставляет её вместо ключа %u
т.е на экране будет signature 20210414.

Но бинарного ключа у printf нет, т.к. он практически необходимости в нем нет.

Ну это я понимаю так и выводит "signature 20210414. ". Я думал может вывести eax без printf ,но не понял как. Или как eax перевести в двоичное число и вывести? Я что-то уже запутался.
Об авторе:
Твое внимание станет мой энергией
давно
Старший Модератор
31795
6196
14.04.2021, 22:15
общий
14.04.2021, 22:16
Адресаты:
Цитата: Степанов Иван /REDDS
extern ExitProcess@4

Код под Win'+
Код:
	mov	EBX,number
mov EDi, strOut
mov ECX,32
@@01: SHL EBX,1
XOR EAX,EAX
ADC AL,'0'
stosb
loop @@01


Цитата: Степанов Иван /REDDS
nasm
у меня нет. Кстати проверьте нужен конечный 0.
printf - это функция С.

Без обид, мне нравится Паскаль и Асм.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400537
50
14.04.2021, 23:05
общий
Цитата: Зенченко Константин Николаевич
Без обид, мне нравится Паскаль и Асм.

Не покажите данный пример на asm(если не сложно)?
Об авторе:
Твое внимание станет мой энергией
давно
Старший Модератор
31795
6196
15.04.2021, 18:28
общий
Цитата: Степанов Иван /REDDS
Не покажите данный пример на asm

см. выше. я не С/С++ писал.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400537
50
20.04.2021, 09:37
общий
[code lang=asm h=50] mov eax, 1 cpuid mov EBX,329443 mov EDi, ModelStr mov ECX,32@@: SHL EBX,1 XOR EAX,EAX ADC AL,'0' stosb loop @@[/code]Что то только 0 выводит. Или не что-то не понимаю?
Об авторе:
Твое внимание станет мой энергией
давно
Старший Модератор
31795
6196
23.04.2021, 18:09
общий
это ответ
Здравствуйте, Степанов Иван /REDDS!

Цитата: Зенченко Константин Николаевич
В строку преобразовывать не пробывали?


Смотрите код(FASM)
Код:
format PE
entry begin
include 'WIN32AX.INC'
section '.code' code readable executable
begin: mov eax,1
cpuid
mov ebx,eax
mov edi,dbBin
mov ecx,32
push edi
push eax
cld
@@01: xor eax,eax
shl ebx,1
adc al,'0'
stosb
loop @@01
xor eax,eax
stosb
pop eax
push eax
push eax
push dbFormat
call [printf]
xor eax,eax
call ExitProcess
section '.data' data readable writable
dbFormat db 'signature hex= %x oct= %o bin= %s this all',0
dbBin db 32 dup(?),0
section '.idata' import data readable

library kernel, 'kernel32.dll',\
msvcrt, 'msvcrt.dll'

import kernel,\
ExitProcess, 'ExitProcess'

import msvcrt,\
printf, 'printf'



Улачи!
5
Огромное спасибо за ответ и уделенное время.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
24.04.2021, 02:12
общий
Адресаты:
Цитата: Степанов Иван /REDDS
Огромное спасибо за ответ и уделенное время.

Практически с первого своего поста в мини-форуме я дал Вам правильный совет.
Цитата: Зенченко Константин Николаевич
В строку преобразовывать не пробывали?


Но Вы, так и не поняли как работает printf

Перевод MSDN(см. тут)
Код:
int printf(
const char *format [,argument]...
);


*format - параметр - обязательный, он определяет, что именно будет выведено.
[,argument] параметр - не обязательный, но его наличие определяется в строке [i]format[/i], в виде %<не важно, что именно>
Цитата: ссылка выше
Спецификации формата всегда начинаются со знака процента (%) и читается слева направо. Когда функция printf встречается с первой спецификацией формата (если она есть), то преобразует значение первого параметра после format и выводит его соответственно. Вторая спецификация формата заставляет второй параметр быть преобразованным и выведенным, и так далее. Если имеется больше параметров, чем есть их спецификаций, дополнительные параметры игнорируются. Результаты не определяются, если недостаточно параметров для всех спецификаций формата

Я Вам писал:
Цитата: Зенченко Константин Николаевич
printf - выводимое число(пусть будет 20210414) преобразовывает в строку и подставляет её вместо ключа %u
т.е на экране будет signature 20210414.

Вы на это тоже не обратили внимание.

Ещё, эта функция имеет такую опцию, как форматирование вывода(см тут).
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400537
50
24.04.2021, 11:59
общий
Адресаты:
Цитата: Зенченко Константин Николаевич
В строку преобразовывать не пробывали?
Я пытался через параметр %s выводить , но ошибся с регистрами(не туда клал) и он либо дублировал предыдущую переменную либо выводил 0.
Об авторе:
Твое внимание станет мой энергией
давно
Старший Модератор
31795
6196
24.04.2021, 12:51
общий
Адресаты:
Надеюсь Вы поняли, что если писать в ЯВУ, то компилятор может подсказать ошибку, если писать на асме, то тут, что написали, то и получили.

Удачи в изучении Ассемблера

Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа