Как вывести строку, число определенного типа STRUCT - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Использую MASM. Начал разбираться со структурами данных и возникли проблемы. Допустим имеется структура:
    student struc
    name db 30 dup(' ')
    group dw 0
    student ends
Нужно вывести содержимое полей name и group (через WriteConsoleA), то есть что-то вроде:
    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

Объяснение кода листинга программы

  1. Переменная buffSize содержит размер буфера в байтах (6).
  2. Переменная nameLen содержит длину строки в символах (30).
  3. Определён тип структуры Student.
  4. В разделе .data инициализированы переменные: — stdout — дескриптор стандартного вывода (41). — cWritten — количество успешно записанных байт (42). — ifmt — строка формата для вывода (43). — buf — буфер для вывода (44). — student1 — структура Student с именем name_name_name и группой 373 (45).
  5. В разделе .code определена точка входа start.
  6. Выполняется вызов функции GetStdHandle с аргументом STD_OUTPUT_HANDLE для получения дескриптора стандартного вывода (46).
  7. Результат вызова функции GetStdHandle сохраняется в переменной stdout (47).
  8. Выполняется вызов функции WriteConsoleA с аргументами: — stdout — дескриптор стандартного вывода (47). — адрес поля student1._name — адрес строки, которую необходимо вывести (48). — nameLen — количество символов в строке (49). — адрес переменной cWritten — адрес переменной, в которую будет записано количество успешно записанных байт (50). — NULL — указывает, что используется стандартный режим передачи строки (51).
  9. Результат вызова функции WriteConsoleA сохраняется в переменной cWritten (52).
  10. Выполняется вызов функции wsprintf с аргументами: — адрес переменной buf — адрес буфера для вывода строки (44). — адрес переменной ifmt — адрес строки формата (43). — переменная student1._group — значение поля структуры Student, которое необходимо отформатировать (53).
  11. Результат вызова функции wsprintf сохраняется в переменной buf (44).
  12. Выполняется вызов функции WriteConsoleA с аргументами: — stdout — дескриптор стандартного вывода (47). — адрес переменной buf — адрес буфера с отформатированной строкой (44). — buffSize — размер буфера в байтах (54). — адрес переменной cWritten — адрес переменной, в которую будет записано количество успешно записанных байт (55). — NULL — указывает, что используется стандартный режим передачи строки (56).
  13. Результат вызова функции WriteConsoleA сохраняется в переменной cWritten (57).
  14. Выполняется вызов функции ExitProcess с аргументом 0 для завершения работы программы (58).
  15. Код программы завершается (59).

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы