структура на ассемблере - PullRequest
0 голосов
/ 18 декабря 2018

Мне нужно знать синтаксис структуры на ассемблере.Также мне нужно знать, как создать массив struct, и эта структура будет содержать 4 переменные, каждая из которых будет иметь целое число. Как я могу это сделать?

новое обновление:

можетВы говорите мне, что не так с этим кодом, пожалуйста, в строке mov arr [edx] .x1, [ebx] он дает мне ошибку, говоря недопустимый операнд инструкции, и это весь код ВКЛЮЧИТЕ Irvine32.inc ВКЛЮЧИТЕ macros.inc

.DATA
line struct 
x1 byte ?
x2 byte ?
x3 byte ?
x4 byte ?
line ends

arr2 byte 16 DUP (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
arr line 4 DUP (<0,0,0,0>)

.CODE

main PROC

mov ebx,offset arr2
mov edx ,type arr

mov ecx,4
l:
mov arr[edx].x1 , [ebx]
inc ebx
mov arr[edx].x2 , [ebx]
inc ebx
mov arr[edx].x3 , [ebx]
inc ebx
mov arr[edx].x4 , [ebx]
inc ebx
inc edx
loop l 
mov edx ,offset arr
mov ecx,4
l1:
movzx eax, byte PTR arr[edx].x1
call writeint
movzx eax, byte PTR arr[edx].x2
call writeint
movzx eax, byte PTR arr[edx].x3
call writeint
movzx eax, byte PTR arr[edx].x4
call writeint
inc edx
loop l1

exit
main ENDP

END main

1 Ответ

0 голосов
/ 18 декабря 2018

Пример исходного файла (Visual Studio 2015)

        title   xmpl
        .586p
        .model FLAT

;       include C libraries
        includelib      msvcrtd
        includelib      oldnames
        includelib      legacy_stdio_definitions.lib    ;for scanf, printf, ...

xmpl    struct                          ;delcare structure (nothing initialized)
x0      dword   ?
x1      dword   ?
x2      dword   ?
x3      dword   ?
xmpl    ends

        .data
axmpl   xmpl    30 dup ({0,0,0,0})      ;array of 30 structs (init to zeroes)

        .code
_main   proc    near
        lea     ebx,axmpl               ;ebx points to first instance in array
        mov     eax,(xmpl ptr [ebx]).x0 ;eax = axmpl[0].x0
;       ...
        xor     eax,eax                 ;exit from main
        ret
_main   endp

        end

обновленный пример:

line    struct 
x1      byte    ?
x2      byte    ?
x3      byte    ?
x4      byte    ?
line    ends

        .DATA
arr2    byte    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
arr     line    4 DUP ({0,0,0,0})

        .CODE

main    PROC

        mov     ebx,offset arr2
        mov     edx,offset arr

        mov     ecx,4
l:
        mov     al,[ebx]
        mov     [edx].line.x1,al
        inc     ebx
        mov     al,[ebx]
        mov     [edx].line.x2,al
        inc     ebx
        mov     al,[ebx]
        mov     [edx].line.x3,al
        inc     ebx
        mov     al,[ebx]
        mov     [edx].line.x4,al
        inc     ebx
        add     edx,sizeof line
        loop    l 
        mov     edx ,offset arr
        mov     ecx,4
l1:
        movzx   eax,[edx].line.x1
        call    writeint
        movzx   eax,[edx].line.x2
        call    writeint
        movzx   eax,[edx].line.x3
        call    writeint
        movzx   eax,[edx].line.x4
        call    writeint
        add     edx,sizeof line
        loop    l1
;       ...

альтернативный синтаксис, использованный перед обновлением:

        mov     (line ptr [edx]).x1,al

используя предположим:

        assume  edx:ptr line
;       ...
        mov     [edx].x1,al
;       ...
        loop    l1
        assume  edx:nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...