Как вывести строку, число определенного типа STRUCT - Assembler
Формулировка задачи:
Здравствуйте! Использую MASM. Начал разбираться со структурами данных и возникли проблемы.
Допустим имеется структура:
Нужно вывести содержимое полей name и group (через WriteConsoleA), то есть что-то вроде:
К сожалению получаю ошибки:
student struc name db 30 dup(' ') group dw 0 student ends
student struc name db 30 dup(' ') group dw 0 student ends .data stdout dd ? cWritten dd ? stud student <'name_name_name', 461d> .code start: invoke GetStdHandle, STD_OUTPUT_HANDLE mov stdout, eax invoke WriteConsoleA, stdout, stud.name, 30d, addr cWritten, NULL invoke ExitProcess, 0 end start
MyProg.asm(17) : error A2008: syntax error : group
MyProg.asm(23) : error A2159: structure cannot be instanced
MyProg.asm(29) : error A2008: syntax error : name
Решение задачи: «Как вывести строку, число определенного типа STRUCT»
textual
Листинг программы
buffSize equ 6d nameLen equ 30d Student struc _name db 30 dup(" ") _group dw 0 Student ends .data stdout dd ? cWritten dd ? ifmt db "%d", 00 buf db buffSize dup(?) student1 Student {"name_name_name", 373} .code start: invoke GetStdHandle, STD_OUTPUT_HANDLE mov stdout, eax invoke WriteConsoleA, stdout, addr student1._name, nameLen, addr cWritten, NULL mov ax, student1._group invoke wsprintf, addr buf, addr ifmt, ax invoke WriteConsoleA, stdout, addr buf, buffSize, addr cWritten, NULL invoke ExitProcess, 0 end start
Объяснение кода листинга программы
- Переменная
buffSize
содержит размер буфера в байтах (6). - Переменная
nameLen
содержит длину строки в символах (30). - Определён тип структуры
Student
. - В разделе
.data
инициализированы переменные: —stdout
— дескриптор стандартного вывода (41). —cWritten
— количество успешно записанных байт (42). —ifmt
— строка формата для вывода (43). —buf
— буфер для вывода (44). —student1
— структураStudent
с именемname_name_name
и группой 373 (45). - В разделе
.code
определена точка входаstart
. - Выполняется вызов функции
GetStdHandle
с аргументомSTD_OUTPUT_HANDLE
для получения дескриптора стандартного вывода (46). - Результат вызова функции
GetStdHandle
сохраняется в переменнойstdout
(47). - Выполняется вызов функции
WriteConsoleA
с аргументами: —stdout
— дескриптор стандартного вывода (47). — адрес поляstudent1._name
— адрес строки, которую необходимо вывести (48). —nameLen
— количество символов в строке (49). — адрес переменнойcWritten
— адрес переменной, в которую будет записано количество успешно записанных байт (50). —NULL
— указывает, что используется стандартный режим передачи строки (51). - Результат вызова функции
WriteConsoleA
сохраняется в переменнойcWritten
(52). - Выполняется вызов функции
wsprintf
с аргументами: — адрес переменнойbuf
— адрес буфера для вывода строки (44). — адрес переменнойifmt
— адрес строки формата (43). — переменнаяstudent1._group
— значение поля структурыStudent
, которое необходимо отформатировать (53). - Результат вызова функции
wsprintf
сохраняется в переменнойbuf
(44). - Выполняется вызов функции
WriteConsoleA
с аргументами: —stdout
— дескриптор стандартного вывода (47). — адрес переменнойbuf
— адрес буфера с отформатированной строкой (44). —buffSize
— размер буфера в байтах (54). — адрес переменнойcWritten
— адрес переменной, в которую будет записано количество успешно записанных байт (55). —NULL
— указывает, что используется стандартный режим передачи строки (56). - Результат вызова функции
WriteConsoleA
сохраняется в переменнойcWritten
(57). - Выполняется вызов функции
ExitProcess
с аргументом0
для завершения работы программы (58). - Код программы завершается (59).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д