2015-11-12 2 views
1

В настоящее время я пытаюсь изучить сборку, и одна из заданий, которую я даю, - это ввести целые числа ввода и вставить эти числа в массив. После того, как массив имеет 7 целых чисел, я пройду через массив и распечатаю номера. Тем не менее, я сейчас зациклился на том, как вставлять числа в массив. Вот код, я прямо сейчас:Неисправность вставки вещей в массив в сборке

.DATA 

inputIntMessage BYTE "Enter an integer: ", 0 
inputStringMessage BYTE "Enter a string: ", 0 


intArray DWORD 0,0,0,0,0,0,0 
intCounter DWORD 0 
user_input DWORD ? 

.CODE 

main PROC 

mov eax, intCounter 
mov edx, 0 

top: 
    cmp eax, 7  
    je final1 
    jl L1 

L1: intInput inputIntMessage, user_input 
    mov ebx, user_input 
    mov intArray[edx], ebx ;This is where I think the problem is. 
    add edx, 4 
    inc eax 
    jmp top 

final1: 

mov ecx, 0 
mov edx, 0 
printarrayloop: 
      cmp edx,7 
      jl L2 
      je next 
L2: intOutput intArray[ecx] 
    add ecx, 4 
    inc edx 
next: 

next: просто переходит к следующей задаче; не имеет значения для этой вставки в проблему массива. Я думаю, что я должен использовать смещение массива, поэтому я могу получить доступ к адресу каждого элемента в массиве и напрямую изменить его, но я не знаю, как это сделать. Может ли кто-нибудь указать мне в правильном направлении?

EDIT: Когда я запустил программу, окно предложит пользователю ввести целое число 7 раз (по назначению), а затем распечатать первый введенный пользователем номер. Однако в окне должно быть указано все введенные пользователем номера.

+0

Вы ступенчатой ​​через код в отладчике, чтобы посмотреть, что происходит? –

+0

В чем смысл 'jl L1; L1: '? Сохраняет ли макрос 'intInput' то, что находится в' eax'? –

+0

Да, но, к сожалению, я не мог получить от него никакой информации. Все переменные растут правильно, все регистры - это то, что они должны быть. – MistFTW

ответ

0

Основная причина, почему ваш код печатает только один номер, потому что код, который отображает массив чисел делает это:

mov ecx, 0 
mov edx, 0 
printarrayloop: 
    cmp edx,7 
    jl L2 
    je next 
L2: intOutput intArray[ecx] 
    add ecx, 4 
    inc edx 
next: 

Чего не хватает в том, что вы не продолжить цикл после вывода первого номера , Вам нужно вернуться к printarrayloop для обработки следующего номера. Добавьте это право ниже inc edx:

 jmp printarrayloop 

Есть некоторые другие вещи, которые вы, возможно, пожелает рассмотреть. В этом коде:

top: 
    cmp eax, 7  
    je final1 
    jl L1 

L1: intInput inputIntMessage, user_input 
[snip] 
final1: 

Вы делаете cmp eax, 7. Если он равен, вы выпрыгиваете. Если это меньше, вы просто введете ярлык L1 в любом случае. Вы можете изменить этот код, удалив внешнюю ветвь и метку jl L1. Таким образом, вы бы это:

top: 
    cmp eax, 7  
    je final1  
    intInput inputIntMessage, user_input 

В этом коде есть некоторые дополнительные инструкции, которые могут быть удалены:

mov ecx, 0 
mov edx, 0 
printarrayloop: 
    cmp edx,7 
    jl L2 
    je next 
L2: intOutput intArray[ecx] 
    add ecx, 4 
    inc edx 
    jmp printarrayloop 
next: 

Аналогично предыдущему комментарию я сделал для сравнения EDX до 7, используя cmp edx,7. Вы можете просто сказать, что после сравнения, если он равен 7, вы выпрыгиваете из цикла до next. Если он меньше 7, он просто продолжит и распечатает номер. Так что ваш код может выглядеть следующим образом:

mov ecx, 0 
mov edx, 0 
printarrayloop: 
    cmp edx,7 
    je next 
    intOutput intArray[ecx] 
    add ecx, 4 
    inc edx 
    jmp printarrayloop 
next: 

x86 32-битный код имеет уменьшенный режим адресации (с смещением). Вы можете найти все режимы адресации, описанные в этом резюме here и более подробное описание here.

При выполнении адресации можно использовать коэффициент масштабирования (умножить регистр на 1,2,4 или 8). У вас есть код, который выглядит следующим образом:

mov intArray[edx], ebx 
    add edx, 4 

EDX указывает на номера элемента, который вы хотите отобразить, умножив его на 4 будет учитывать тот факт, что размер DWORD составляет 4 байта.Таким образом, вы можете удалить add edx, 4 и изменить код с доступом к массиву:

mov intArray[edx*4], ebx 

intArray[edx*4] является адрес, который эквивалентен intArray+(edx*4)

Вы можете сделать аналогичные изменения при выводе. Удалить эту строку:

add ecx, 4 

и использование масштабируется адресация с:

intOutput intArray[ecx*4] 
+0

спасибо. Ответ обширен! – MistFTW

Смежные вопросы