Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

768

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

343

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

278

Россия, Санкт-Петербург


ID: 325460

CradleA

Мастер-Эксперт

209

Беларусь, Минск


ID: 137394

Megaloman

Мастер-Эксперт

158

Беларусь, Гомель


ID: 400815

alexleonsm

6-й класс

130


ID: 400669

epimkin

Профессионал

120


8.8.15

09.05.2021

JS: 2.8.21
CSS: 4.5.5
jQuery: 3.6.0
DataForLocalStorage: 2021-05-15 03:46:17-standard


Создание программ на языке Assembler.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 200646

Раздел: Assembler
Автор вопроса: Степанов Иван /REDDS (4-й класс)
Дата: 14.04.2021, 15:34 Консультация закрыта
Поступило ответов: 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

Здравствуйте, Степанов Иван /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'



Улачи!

Зенченко Константин Николаевич

Старший модератор
23.04.2021, 18:09
5


Огромное спасибо за ответ и уделенное время.

Мини-форум консультации # 200646

Зенченко Константин Николаевич

Зенченко Константин Николаевич

Старший модератор

ID: 31795

1

= общий =    14.04.2021, 16:09
Степанов Иван /REDDS:

ак мне вывести в двоичном числе


В строку преобразовывать не пробывали?

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

Зенченко Константин Николаевич

Степанов Иван /REDDS

4-й класс

ID: 400537

2

= общий =    14.04.2021, 16:16
Зенченко Константин Николаевич:

В строку преобразовывать не пробывали?

Зенченко Константин Николаевич

Не понял немного, разве ModelStr уже не строка? Я по разному уже крутил и пытался вывести, не получилось.

=====
Твое внимание станет мой энергией smile

Степанов Иван /REDDS

Зенченко Константин Николаевич

Старший модератор

ID: 31795

3

= общий =    14.04.2021, 16:48
Степанов Иван /REDDS:

'signature %u %Xh'

Степанов Иван /REDDS

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

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

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

Зенченко Константин Николаевич

Степанов Иван /REDDS

4-й класс

ID: 400537

4

= общий =    14.04.2021, 16:56

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

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

Зенченко Константин Николаевич

Ну это я понимаю так и выводит "signature 20210414. ". Я думал может вывести eax без printf ,но не понял как. Или как eax перевести в двоичное число и вывести? Я что-то уже запутался.

=====
Твое внимание станет мой энергией smile

Степанов Иван /REDDS

Зенченко Константин Николаевич

Старший модератор

ID: 31795

5

= общий =    14.04.2021, 22:15
Степанов Иван /REDDS:

extern ExitProcess@4

Степанов Иван /REDDS

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


nasm

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

Без обид, мне нравится Паскаль и Асм.

Последнее редактирование 14.04.2021, 22:16 Зенченко Константин Николаевич (Старший модератор)

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

Зенченко Константин Николаевич

Степанов Иван /REDDS

4-й класс

ID: 400537

6

= общий =    14.04.2021, 23:05

Без обид, мне нравится Паскаль и Асм.

Зенченко Константин Николаевич

Не покажите данный пример на asm(если не сложно)?

=====
Твое внимание станет мой энергией smile

Степанов Иван /REDDS

Зенченко Константин Николаевич

Старший модератор

ID: 31795

7

= общий =    15.04.2021, 18:28

Не покажите данный пример на asm

Степанов Иван /REDDS

см. выше. я не С/С++ писал.

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

Степанов Иван /REDDS

Степанов Иван /REDDS

4-й класс

ID: 400537

8

= общий =    20.04.2021, 09:37

Код [Assembler]
mov eax, 1	cpuid    mov	EBX,329443	mov	EDi, ModelStr	mov	ECX,32@@:	SHL	EBX,1	XOR	EAX,EAX	ADC	AL,'0'	    stosb	loop	@@
Что то только 0 выводит. Или не что-то не понимаю?

=====
Твое внимание станет мой энергией smile

Зенченко Константин Николаевич

Зенченко Константин Николаевич

Старший модератор

ID: 31795

9

= общий =    24.04.2021, 02:12
Степанов Иван /REDDS:

Огромное спасибо за ответ и уделенное время.

Степанов Иван /REDDS

Практически с первого своего поста в мини-форуме я дал Вам правильный совет.

В строку преобразовывать не пробывали?

Зенченко Константин Николаевич


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

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


*format - параметр - обязательный, он определяет, что именно будет выведено.
[,argument] параметр - не обязательный, но его наличие определяется в строке format, в виде %<не важно, что именно>

Спецификации формата всегда начинаются со знака процента (%) и читается слева направо. Когда функция printf встречается с первой спецификацией формата (если она есть), то преобразует значение первого параметра после format и выводит его соответственно. Вторая спецификация формата заставляет второй параметр быть преобразованным и выведенным, и так далее. Если имеется больше параметров, чем есть их спецификаций, дополнительные параметры игнорируются. Результаты не определяются, если недостаточно параметров для всех спецификаций формата

ссылка выше

Я Вам писал:

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

Зенченко Константин Николаевич

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

Ещё, эта функция имеет такую опцию, как форматирование вывода(см тут).
smile

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

Зенченко Константин Николаевич

Степанов Иван /REDDS

4-й класс

ID: 400537

10

= общий =    24.04.2021, 11:59
Зенченко Константин Николаевич:

В строку преобразовывать не пробывали?

Зенченко Константин Николаевич
Я пытался через параметр %s выводить , но ошибся с регистрами(не туда клал) и он либо дублировал предыдущую переменную либо выводил 0.

=====
Твое внимание станет мой энергией smile

Зенченко Константин Николаевич

Зенченко Константин Николаевич

Старший модератор

ID: 31795

11

= общий =    24.04.2021, 12:51
Степанов Иван /REDDS:

Надеюсь Вы поняли, что если писать в ЯВУ, то компилятор может подсказать ошибку, если писать на асме, то тут, что написали, то и получили.

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

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

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 74

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 74

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0

Kdsfofwe21

2-й класс

Рейтинг: 0