Родились сегодня:
FOXhunter


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

ID: 259041

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

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

311

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


ID: 401284

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

Советник

303

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


ID: 400669

epimkin

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

266


ID: 405049

vsetin

Студент

144


ID: 137394

Megaloman

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

123

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


ID: 325460

CradleA

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

77

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


ID: 226425

Konstantin Shvetski

Модератор

72

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


8.9.8

01.08.2021

JS: 2.9.16
CSS: 4.5.14
jQuery: 3.6.0
DataForLocalStorage: 2021-07-31 21:16:01-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

q_id

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

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

ID: 31795

1

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

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


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

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

q_id

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

4-й класс

ID: 400537

2

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

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


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

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

q_id

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

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

ID: 31795

3

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

'signature %u %Xh'


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

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

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

q_id

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

4-й класс

ID: 400537

4

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

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

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


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

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

q_id

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

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

ID: 31795

5

= общий =    14.04.2021, 22:15
Степанов Иван /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


nasm

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

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

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

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

q_id

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

4-й класс

ID: 400537

6

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

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


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

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

q_id

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

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

ID: 31795

7

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

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


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

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

q_id

Степанов Иван /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

q_id

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

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

ID: 31795

9

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

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


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

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



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

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


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

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


Я Вам писал:

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


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

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

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

q_id

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

4-й класс

ID: 400537

10

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

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

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

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

q_id

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

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

ID: 31795

11

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

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

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

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

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

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

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

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

Рейтинг: 131

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

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

Рейтинг: 9

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

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

Рейтинг: 0

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0

Kdsfofwe21

2-й класс

Рейтинг: 0