Arhn - архитектура программирования

Как вы используете буфер? [сборка на базе Intel]

Мне трудно понять, как использовать буфер в моем коде. Предполагается, что код выполняет цикл и подсчитывает количество каждого символа в массиве. Я еще не написал функцию для символов нижнего и верхнего регистра, но для части int она выводит «0 - +0» каждый раз, независимо от того, какую комбинацию целых чисел или букв я ввожу. Я не уверен, связана ли эта проблема с буфером или с другой частью моего кода. Любые предложения, советы или объяснения приветствуются. Я компилирую Visual Studios 2015 с библиотекой kip irvine.

.data
    buffer BYTE 1064 DUP(?)
    ;sentence input
    sentence dword ? 
    ;enter gallons prompt
    prompt1 BYTE "Enter the sentence you would like to count: ", 0
    ;start of int values
    intEnd dword 57
    ;int you are on
    intIndex dword 48
    ;upper char you are on
    upcharIndex dword 65
    ;start of upper case char values
    upcharEnd dword 90
    ;lower char you are on
    lowCharIndex dword 97
    ;start of lower case char values
    lowcharEnd dword 122
    ;prompt dash
    dash BYTE " - "
    ;count vals
    count dword 0
.code
main PROC
    ;shows the prompt
    mov edx, OFFSET prompt1
    call WriteString    
    mov edx, OFFSET buffer
    mov ecx, SIZEOF buffer
    ;reads the sentence the user inputs
    call ReadString
    mov sentence, eax
    mov ebx, OFFSET sentence
    mov ecx, [LENGTHOF sentence]
    checkint:
        mov eax, intIndex
        cmp eax, intEnd
        je done
        mov edx, count
        L1:
            call DumpRegs
            cmp al, [ebx]
            jne no_inc
            cmp al, 00
            je none
            incre:
                inc dl
            no_inc:
                add ebx, 8
        jmp L1
            none:
                mov intIndex, eax
                call WriteChar
                call DumpRegs
                mov count, edx
                mov edx, OFFSET dash
                call WriteString
                call DumpRegs
                mov eax, count
                call WriteInt
                mov eax,intIndex
                inc eax
                mov intIndex, eax
                call DumpRegs
                mov count, eax
                jmp checkint
        done:
            RET
    exit
main ENDP
END main

Код С++:

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int startint = 48;
    int endint = 57;
    int startupper = 65;
    int endupper = 90;
    int startlower = 97;
    int endlower = 122;
    int count = 0;
    cout << "Enter the string you would like to count: ";
    string sentence;
    getline(cin, sentence);
    cout << endl;

    for (int i = startint; i < endint; i++)
    {
        for (char a : sentence)
        {
            if (a == i)
                count++;
        }
        if(count !=0)
        cout << (char)i << " - " << count<<endl;
        count = 0;
    }
    for (int i = startupper; i < endupper; i++)
    {
        for (char a : sentence)
        {
            if (a == i)
                count++;
        }
        if(count !=0)
        cout << (char)i << " - " << count<<endl;
        count = 0;
    }
    for (int i = startlower; i < endlower; i++)
    {
        for (char a : sentence)
        {
            if (a == i)
                count++;
        }
        if(count !=0)
        cout << (char)i << " - " << count<<endl;
        count = 0;
    }
    return 0;
}
01.12.2016

  • советы: используйте отладчик. Пошаговое выполнение кода и наблюдение за изменением значений регистров. Часто будет легко заметить, когда вы допустили очевидную ошибку, или, по крайней мере, обнаружить, где что-то перестает вести себя так, как вы задумали, чтобы вы могли продолжить расследование. 01.12.2016
  • Ваше форматирование в верхней части ранит мой мозг. 01.12.2016
  • Я попробовал отладчик и изменил часть своего кода, и теперь цикл не заканчивается. Я обновил код в своем сообщении. 02.12.2016
  • Прокомментируйте свой код, чтобы описать, как он должен работать. В бесконечном цикле посмотрите на регистр, который проверяет ветвь цикла. Если вы хотите, чтобы кто-то отлаживал ваш код для вас, включите информацию о том, какие значения были в каких регистрах и в какой инструкции. 02.12.2016
  • Я написал С++ о том, что он должен делать, потому что я не так хорош в объяснениях, и это помогает мне понять, как лучше написать сборку, но все, что он делает, это в предложении, он будет подсчитывать количество каждого символа, поэтому, если предложение Привет, вывод будет H - 1, e - 1, l - 2, o - 1. Я также заметил, что мой код неправильно читает строку, вместо этого он сохраняет символ 02.12.2016

Ответы:


1
call ReadString
mov sentence, eax
mov ebx, OFFSET sentence
mov ecx, [LENGTHOF sentence]

Функция ReadString возвращает размер ввода в регистре EAX. Но вы используете это как адрес!

call     ReadString
mov      sentence, eax         ;This is a length !
mov      ebx, OFFSET buffer
mov      ecx, sentence

cmp al, [ebx]
jne no_inc
cmp al, 00
je none

Прежде чем делать что-либо еще, проверьте конец строки:

cmp     byte ptr [ebx], 0
je      none
cmp     al, [ebx]
jne     no_inc

Поскольку count является двойным словом, увеличьте EDX, а не DL.
Поскольку строки используют 1 байт на символ, добавьте только 1 к EBX вместо 8.


checkint:
mov eax, intIndex
cmp eax, intEnd
je done

Таким образом, вы пропустите последнюю итерацию! Перейти к готово только тогда, когда EAX выше intEnd:

checkint:
    mov     eax, intIndex
    cmp     eax, intEnd
    ja      done

Я надеюсь, что это поможет заставить основной код работать...

04.12.2016
  • Большое спасибо! Это было очень полезно! (: 08.12.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..