2016-10-14 5 views
2

Мне удалось перебрать массив и распечатать значения. Однако я также хотел распечатать строку «Длина моего массива равна 7», причем 7 - это длина (количество элементов) в массиве. Однако я не могу объединить строку с длиной массивов. Пожалуйста помоги. Спасибо.Объединение строки и размера массива в сборке x86 MASM

INCLUDE Irvine32.inc 
.data 
    myarray byte 23, 2, 3, 40, 5, 16, 7 
    x byte 5 
    l dword lengthof myarray 
    msg1 byte "The length of my array is ",0 
    msg2 byte "-------------------------------",0 
    i byte 0 
    .code 
    main PROC 

     mov eax, 0 
     mov esi, offset myarray; 
     mov ecx, l 



     myloop: 
     mov al, [esi] 
     call writedec 
     call crlf 
     inc esi 
     mov edx, OFFSET msg1 
     mov edx, l 

     loop myloop 

     call writestring 
     call crlf 
     call crlf 

     exit 

     main ENDP 
     end main 

В результате я получаю следующее:

23 
2 
3 
40 
5 
16 
7 

"esimovarray.asm has stopped working" 

Пожалуйста, помогите. Спасибо.

+1

Шаг через код в отладчике. Следите за значениями регистра. Временное использование более короткого массива для ускорения отладки. –

ответ

1

Я думаю, что нам нужно только изменить порядок нескольких строк кода:

INCLUDE Irvine32.inc 
.data 
    myarray byte 23, 2, 3, 40, 5, 16, 7 
    x byte 5 
    l dword lengthof myarray 
    msg1 byte "The length of my array is ",0 
    msg2 byte "-------------------------------",0 
    i byte 0 
    .code 
    main PROC 

     mov eax, 0 
     mov esi, offset myarray; 
     mov ecx, l 

     myloop: 
     mov al, [esi] 
     call writedec 
     call crlf 
     inc esi 
     ;mov edx, OFFSET msg1   ;◄■■■ NOT HERE. 
     ;mov edx, l     ;◄■■■ NOT HERE. 
     loop myloop 

     mov edx, OFFSET msg1   ;◄■■■ RIGHT HERE! 
     call writestring 

     mov eax, l     ;◄■■■ RIGHT HERE! MUST BE EAX. 
     call writedec 

     exit 

     main ENDP 
     end main