как получить доступ к массиву строк в цикле, чтобы сохранить строку в массиве в соответствии с - PullRequest
0 голосов
/ 04 мая 2019

Моя проблема в том, что я пытаюсь ввести пользовательский ввод в цикле, и каждый раз, когда я хочу сохранить этот ввод в определенном месте в памяти, чтобы позже получить к нему доступ и распечатать его с некоторыми изменениями.И меня смущает вопрос о том, как сначала объявить массив, который может содержать, например, мои 5 слов, а потом, как каждый раз сохранять входные данные в этот массив.

Точно я беру имена субъектов: ицикл в c ++ будет выглядеть примерно так:

string subjects_code[5]
for(int i=0; i<5; i++)
    cin>>subjects_code[i];   
   // like AFJS421 , CSFA424, SCSJ1023 and so on

Я провел исследование по всему Интернету и на YouTube, обнаружил, что вы не можете объявить массив строк в сборке, у вас в основном один массивбайтов, за которыми следует нулевой терминатор.Я понимаю это, и я сделал свой код с ним, и он работает, но проблема в том, что мне действительно нужно хранить коды 5 предметов в 5 различных переменных (или, по крайней мере, в ячейках памяти), потому что позже после некоторых вычислений мне нужно распечатать обратноэти предметы.

    ;taking input from user: in a Loop   
    ;in .data I have subjects_code BYTE MAX DUP(?)
    MAX = 20
mov ebx,0
mov count, 5   ; cuz ReadString uses ecx as buffersize

InputLoop:
            ; This is just a prompt out, no need to worry about it

    mov ecx, MAX    
    mov edx, OFFSET Enter_code       ;  setting offset for prompt   


            ; temp variable to read into it, use it for assgining
    mov edx, OFFSET temp_subject_code  
    call ReadString                 ; reading the code into temp
    mov subjects_code+[ebx], temp_subject_code


    add ebx, 4
    mov ecx, count
    dec count

    Loop InputLoop

;---------------------------------------------------------------

После сохранения каждой строки я ожидаю сделать в конце программы:

subject1: SCSJ134
subject2: SCSR231
Subject3: SCSI392

вплоть до Subject5.

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Вот другой подход. Это эквивалент кода C:

char *subject_code[5];
for(int i=0; i<5; i++) {
    subject_code[i] = malloc(20);
    ReadString(subject_code[i]);
}

.

    MAXLEN = 20
    COUNT = 5
    mov ebx,0

InputLoop:
    mov ecx, MAXLEN
    call malloc
    mov subjects_code[ebx*4], eax
    mov edx, eax  
    mov ecx, MAXLEN
    call ReadString                 ; reading the code into subject_code[ebx]

    inc ebx
    cmp ebx, COUNT
    jnz InputLoop

    .data
subjects_code DWORD COUNT DUP(?)
0 голосов
/ 05 мая 2019

Вот один из подходов.Это эквивалент кода C:

char subject_code[5][20];
for(int i=0; i<5; i++)
    ReadString(subject_code[i]);

.

    MAXLEN = 20
    COUNT = 5
    mov ebx,0

InputLoop:
    mov eax, MAXLEN
    mul ebx
    lea edx, subjects_code[eax]  
    mov ecx, MAXLEN-1
    call ReadString                 ; reading the code into subject_code[ebx]

    inc ebx
    cmp ebx, COUNT
    jnz InputLoop

    mov ebx, 0
OutputLoop:
    mov ecx, MAXLEN
    mov eax, ebx
    mul ecx ; this can be done without mul since MAXLEN is a constant
    lea edx, subjects_code[eax]
    call WriteString
    call Crlf

    inc ebx
    cmp ebx,COUNT
    jl OutputLoop

    .data
subjects_code BYTE MAXLEN*COUNT DUP(?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...