С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: MASM64, х64/long mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 22.05.2018
Сообщений: 84
1
MASM64

Вывести значение Unsigned Int 64

11.09.2022, 13:33. Показов 1273. Ответов 11
Метки asm, masm, win (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый день!

Народ, кто подскажет, как в MASM64 инициализировать 64-разрядную переменную, чтобы при помещении в регистр и дальнейшем сложении с другим числом она не обращалась в отрицательное значение, а добросовестно достигала величины ffffffffffffffffh

Заранее всем благодарен!

Троликов и "хохотунчиков-юморных-сатиристов" прошу следовать далее...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2022, 13:33
Ответы с готовыми решениями:

Как исправить ошибку невозможно преобразовать аргумент 1 из "unsigned int" в "unsigned int []"?
Ребят, срочно прошу вас помочь.. Есть ошибка (невозможно преобразовать аргумент 1 из "unsigned...

Размерность int или как из signed int сделать unsigned int?
Добрый день. Есть старая база уже с некоторыми данными. При развёртывании её на одном из тестовых...

Не умещается значение = 4млрд, в переменной типа unsigned long int
Всем привет. В Си я новичек. Пользуюсь VS6. Написал вот это: #include <stdio.h> main() {...

Определить для какого наибольшего n, можно вычислить значение (2n + 1) пользуясь типом unsigned int в C++
Определить для какого наибольшего n, можно вычислить значение (2n + 1) пользуясь типом unsigned int...

11
Ушел с форума
Автор FAQ
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
11.09.2022, 16:53 2
SergeClause,
variant_name dq число
1
Asm/C++/Delphi/Py/PHP/VBA
6750 / 1997 / 231
Регистрация: 14.12.2014
Сообщений: 4,200
Записей в блоге: 12
11.09.2022, 17:54 3
SergeClause, в асме нет "знаковости" чисел. Любое число можно представить как знаковое, так и беззнаковое.
Т.е. -5 может быть представлено как 0FFFFFFFFFFFFFFFBh, и это будет одно и то же значение.
Инструкциям add, sub нет разницы с какими числами работать – знаковыми или беззнаковыми.
А вот mul, imul и div, idiv сделано по 2 пары, т.к. там знак имеет значения. И они рассматривают исходные числа и результаты как знаковые или как беззнаковые. А вы можете рассматривать их по-своему.
1
1 / 1 / 0
Регистрация: 22.05.2018
Сообщений: 84
11.09.2022, 18:27  [ТС] 4
Mikl___, Увы, прога сменила знак и покатилась вниз...

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
;-------------------------------------------------------
include \masm64\include64\masm64rt.inc
 
    .data
 
    szHello db  "Hello, Serge!",0
    szDone  db  "Done, Serge!", 0
    s0              dq  7ffffffffffffffeh
 
    longNumb    TBYTE   7ffffffffffffffffffeh       ; 10-байтовое число
 
    .code
 
entry_point proc
 
    call main
    waitkey
    ret
 
entry_point endp
 
main proc
 
    conout ADDR szHello, lf
    
    conout "1 ",str$(s0),lf
 
    inc s0
    conout "2 ",str$(s0),lf
 
    inc s0
    conout "3 ",str$(s0),lf
 
    inc s0
    conout "4 ",str$(s0),lf
 
    inc s0
    conout "5 ",str$(s0),lf
    
    conout ADDR szDone, lf
    ret
 
main endp
end
 
;---------------------------------
Добавлено через 11 минут
Jin X,
Странно, а как же это:
Directive Description of Initializers
BYTE, DB (byte) Allocates unsigned numbers from 0 to 255.
SBYTE (signed byte) Allocates signed numbers from -128 to +127.
WORD, DW (word = 2 bytes) Allocates unsigned numbers from 0 to 65,535 (64K).
SWORD (signed word) Allocates signed numbers from -32,768 to +32,767.
DWORD, DD (doubleword = 4 bytes), Allocates unsigned numbers from 0 to 4,294,967,295 (4 megabytes).
SDWORD (signed doubleword) Allocates signed numbers from -2,147,483,648 to +2,147,483,647.

Дальше пошли пляски со знаком
FWORD, DF (farword = 6 bytes) Allocates 6-byte (48-bit) integers. These values are normally used only as pointer variables on the 80386/486 processors.
QWORD, DQ (quadword = 8 bytes) Allocates 8-byte integers used with 8087-family coprocessor instructions.
TBYTE, DT (10 bytes), Allocates 10-byte (80-bit) integers if the initializer has a radix specifying the base of the number.

Взято отсюда:
http://www.sxlist.com/TECHREF/... asmc04.htm

Или Майкрософт перестало сопровождать длинные целые переменные?

Добавлено через 13 минут
Когда объявляю s0 как dd, все работает как надо
0
Модератор
Эксперт по электронике
8541 / 4393 / 1651
Регистрация: 01.02.2015
Сообщений: 13,649
Записей в блоге: 9
11.09.2022, 18:44 5
Видимо, str$ преобразует в строку числа с учётом знака.
Используйте вызов другой функции, например, wsprintf с форматной строкой "%llu"
1
1 / 1 / 0
Регистрация: 22.05.2018
Сообщений: 84
11.09.2022, 19:14  [ТС] 6
ФедосеевПавел,
Полагаете, реагирует на большие числа? Проверю!
Но когда я объявляю s0 как dd, все работает нормально.
0
Модератор
Эксперт по электронике
8541 / 4393 / 1651
Регистрация: 01.02.2015
Сообщений: 13,649
Записей в блоге: 9
11.09.2022, 19:16 7
Ошибся с форматной строкой.
Нужно %I64u
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.data
        titl            db      "Test", 0
        ifmt            db      "Какой-то текст %I64u", 0
        N               dq      0FFFFFFFFFFFFFFFFh
 
.data?
        buffer          db      4096 dup(?)
 
.code
 
WinMain proc
        sub     rsp,    28h
        mov     rbp,    rsp
 
        ;диагностический вывод результата
    lea rcx,    [buffer]
    lea rdx,    [ifmt]
    mov r8, [N]
    call    wsprintf
    mov rcx,    0
    lea rdx,    [buffer]
    lea r8, [titl]
    mov r9, MB_ICONINFORMATION
    call    MessageBox
        ;invoke  MessageBox,     0, ADDR buffer, ADDR titl, MB_ICONINFORMATION
        ;завершение программы
        invoke  ExitProcess,    0
WinMain endp
 
end
1
Asm/C++/Delphi/Py/PHP/VBA
6750 / 1997 / 231
Регистрация: 14.12.2014
Сообщений: 4,200
Записей в блоге: 12
11.09.2022, 19:34 8
Цитата Сообщение от SergeClause Посмотреть сообщение
Jin X,
Странно, а как же это:
Это всё абстракции диалекта языка ассемблера. Для процессора нет никакой разницы какого типа данные вы храните. Это может быть signed byte, unsigned byte, char, bool или массив битов.

К примеру, можно использовать SBYTE в макросе .IF при сравнении, чтобы компилятор понимал какую инструкцию условного перехода использовать: ja или jg, к примеру.
Опять же, даже при сравнении используется cmp для всех типов, а уже далее – знаковые или беззнаковые условные переходы, которые вы можете даже перемешать.

Добавлено через 13 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
; ----------------
; character macros
; ----------------
  str$ MACRO value
    LOCAL buffer,pbuf
    .data?
      buffer db 32 dup (?)
    .data
      pbuf dq buffer
    .code
    invoke vc__i64toa,value,pbuf,10
    EXITM <pbuf>
  ENDM
i64toa – явно знаковая функция.

Пробуйте:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
;-------------------------------------------------------
include \masm64\include64\masm64rt.inc
 
ustr$ MACRO value
  LOCAL buffer,pbuf
  .data?
    buffer db 32 dup (?)
  .data
    pbuf dq buffer
  .code
  invoke vc__ui64toa,value,pbuf,10
  EXITM <pbuf>
ENDM 
 
    .data
 
    szHello db  "Hello, Serge!",0
    szDone  db  "Done, Serge!", 0
    s0              dq  7ffffffffffffffeh
 
    longNumb    TBYTE   7ffffffffffffffffffeh       ; 10-байтовое число
 
    .code
    
WinMain proc
 
    call main
    waitkey
    ret
 
WinMain endp
 
main proc
 
    conout ADDR szHello, lf
    
    conout "1 ",ustr$(s0),lf
 
    inc s0
    conout "2 ",ustr$(s0),lf
 
    inc s0
    conout "3 ",ustr$(s0),lf
 
    inc s0
    conout "4 ",ustr$(s0),lf
 
    inc s0
    conout "5 ",ustr$(s0),lf
    
    conout ADDR szDone, lf
    ret
 
main endp
end
 
;---------------------------------
1
1 / 1 / 0
Регистрация: 22.05.2018
Сообщений: 84
12.09.2022, 17:37  [ТС] 9
Jin X Большое спасибо!
Замечательно все заработало, но мне немного непонятно, если не затруднит, объясните пожалуйста
длина buffer 32 байта, а 10 в invoke - это что такое?
И если длина числа заранее неизвестна?
Например, вот файл number.dec - в нем сидит одно единственное десятичное число, мне надо его использовать для арифметических операций, потом загнать в файл и вывести на консоль, но, ладно, за арифметику возьмусь чуть позже, а сейчас как его вывести на консоль?
Вложения
Тип файла: zip number.zip (11.40 Мб, 3 просмотров)
0
1 / 1 / 0
Регистрация: 22.05.2018
Сообщений: 84
12.09.2022, 18:18  [ТС] 10
Федосеев Павел, большое спасибо!
Но что-то не получается выполнить. Компилируется-линкуется нормально,
а при выполнении выскакивает быстроисчезающая консоль... И всё...
Вложения
Тип файла: zip Simple.zip (996 байт, 3 просмотров)
0
Модератор
Эксперт по электронике
8541 / 4393 / 1651
Регистрация: 01.02.2015
Сообщений: 13,649
Записей в блоге: 9
12.09.2022, 20:29 11
Затрудняюсь сказать.
Полный текст программы
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.nolist
OPTION DOTNAME
option casemap: none
include \masm64\Include\temphls.inc
include \masm64\Include\win64.inc
include \masm64\Include\kernel32.inc
include \masm64\Include\user32.inc
includelib \masm64\Lib\kernel32.lib
includelib \masm64\Lib\user32.lib
 
OPTION PROLOGUE: none
OPTION EPILOGUE: none
 
.list
 
.data
        titl            db      "Test", 0
        ifmt            db      "Какой-то текст %I64u", 0
        N               dq      0FFFFFFFFFFFFFFFFh
 
.data?
        buffer          db      4096 dup(?)
 
.code
 
WinMain proc
        sub     rsp,    28h
        mov     rbp,    rsp
 
        ;диагностический вывод результата
    lea rcx,    [buffer]
    lea rdx,    [ifmt]
    mov r8, [N]
    call    wsprintf
    mov rcx,    0
    lea rdx,    [buffer]
    lea r8, [titl]
    mov r9, MB_ICONINFORMATION
    call    MessageBox
        ;invoke  MessageBox,     0, ADDR buffer, ADDR titl, MB_ICONINFORMATION
        ;завершение программы
        invoke  ExitProcess,    0
WinMain endp
 
end
Компилирую пакетным файлом. При пуске даю имя исходника в качестве параметра.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
 
@set AsmSourceName=main
@if [%1]==[] goto :EXIST
@set AsmSourceName=%~dpn1
 
:EXIST
@del %AsmSourceName%.obj > NUL
@del %AsmSourceName%.exe > NUL
@del %AsmSourceName%.com > NUL
@echo on
 
@set mlpath="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\bin\Hostx64\x64\"
%mlpath%\ml64 /Cp /Fl %AsmSourceName%.asm /link /subsystem:console /entry:WinMain /OUT:%AsmSourceName%.exe
@pause
Надо бы мне обновить пакет masm64, но всё руки не доходят - пока обхожусь старым - а в новом доработали макросы.

Разбираться пока нет времени, поверьте - исходник рабочий.
Я не программирую на ассемблере, поэтому макросы так и не запомнил и не пользуюсь. Код привожу в том виде, который будет идентично выглядеть в отладчике x64dbg.
1
Asm/C++/Delphi/Py/PHP/VBA
6750 / 1997 / 231
Регистрация: 14.12.2014
Сообщений: 4,200
Записей в блоге: 12
13.09.2022, 11:48 12
Цитата Сообщение от SergeClause Посмотреть сообщение
10 в invoke - это что такое?
Основание системы счисления.
https://docs.microsoft.com/en-... t(v=vs.140)

Цитата Сообщение от SergeClause Посмотреть сообщение
Например, вот файл number.dec - в нем сидит одно единственное десятичное число, мне надо его использовать для арифметических операций, потом загнать в файл и вывести на консоль, но, ладно, за арифметику возьмусь чуть позже, а сейчас как его вывести на консоль?
Оно у вас в виде строки, вот в виде строки и выводите.
invoke conout, ADDR Number, lf

Добавлено через 22 минуты
При работе с большими числами, числа можно хранить в разном виде:
– в виде отдельных цифр (1 цифра в 1 байте):
а) значениями от 0 до 9,
б) прямо-таки в виде символа цифры ('0');
– в BCD-виде (1 цифра в 1 полубайте, т.е. 2 цифры в байте);
– в двоичном виде, причём:
а) в дополнительном коде (как обычно числа хранятся),
б) в прямом коде (где знаку отводится отдельный бит, а абсолютное значение числа не меняется – это может быть удобнее при делении, например).

Так что, ввод и вывод будет зависеть от того, в каком формате вы числа будете хранить.
1
13.09.2022, 11:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2022, 11:48
Помогаю со студенческими работами здесь

Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.
Пользователь вводит двоичную строку (32 символа). Поместить двоичный код, в веденной строке, в...

Как перевести сишный unsigned int в явский int?
Кто-нибудь занимался подобным переводом кода? Поначалу я думал, что разницы вообще нет, просто ...

Почему результат сравнения int и unsigned int равен 1?
Почему результат сравнения в выводе равен 1? int i = -5; unsigned u = 5; printf(&quot;int...

Ошибка конвертирования from 'quint32 (*)() {aka unsigned int (*)()}' to 'quint32 {aka unsigned int}'
Программа создаёт TCP сервер и использует внутренний ip адрес, вот код: quint32 LocalIp() {...

Определение типов. Приведение int к unsigned int
При таком определении 5 рассматривается как int. Как при определении указать что 5 будет именно...

Разница int, short, unsigned int, unsigned short
Есть например цикл который проходит по массиву в котором 100 элементов. В чем практическая выгода...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru