Использование одного символа для использования в операторе сравнения — Сборка (Motorola 68k)

У меня есть этот код C++, который я пытаюсь воспроизвести в сборке (68K):

int main()
{
    int i=0;
    char *string = "This is a string"
    while(string[i]!=' ')
    {
        /.../
        i++;
    }
    return 0;
}

Я застрял на string[i]!=0, индексирующей части сборки. Мне нужно CMP.B с буквой string[i] с некоторым ' ' в памяти. Я пробовал CMP.B [STRING, D3],D5 с STRING строкой, хранящейся как переменная, D3 текущим индексом в виде числа, хранящимся в регистре, и D5 являющимся пустым пространством, с которым я сравниваю его в регистре,

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
0
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
CMP.B [STRING, D3],D5

Это не сработает: вам нужно использовать адресный регистр, и вы не можете использовать 32-битное смещение при использовании регистра.

Вместо этого загрузите адрес STRING в адресный регистр, например A4:

LEA.L (STRING), A4

Тогда выполняй CMP.B (0,D3,A4),D5

РЕДАКТИРОВАТЬ

Я не знаю, какой ассемблер вы используете. При использовании ассемблера GNU инструкция CMP.B (0,D3,A4),D5 записывается как CMP.B (0,%D3,%A4),%D5.

Я только что просмотрел руководство программиста 68000, и кажется, что официальный синтаксис: «CMP.B (0,A4,D3.L),D5» (или «CMP.B (0,A4,D3.W),D5», если будут использоваться только младшие 16 бит D3).

Инструкция обращается к байту по адресу A4+D3, поэтому, если регистр A4 содержит адрес string[0] (это означает: A4 содержит ценность указателя string!) и регистр D3 содержит значение i, инструкция обращается к значению string[i].

Это значение будет сравниваться с младшими 8 битами D5.

ваш CMP.B (0,D3,A4),D5 выдал мне ошибку, так я бы сравнил букву из строки по ее индексу с другим значением?

Nathan 10.04.2022 01:12

@Nathan Пожалуйста, посмотрите мои правки.

Martin Rosenau 10.04.2022 07:11

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

Nathan 10.04.2022 12:12

Если string находится по адресу ПК, вы можете написать что-то вроде этого:

cmp.b   string(pc,d3.w),d5

Но очень часто на самом деле более эффективно загрузить адрес строки в адресный регистр и использовать постинкрементную адресацию (это немного зависит от того, нужен ли вам наконец адрес или индекс первого совпадающего символа.

    moveq  #' ',d5
    lea    string,a4     ; or string(pc)
loop:
    cmp.b  (a4)+,d5
    bne.s  loop
; now (a4,-1) has the address of the first space character

Другие вопросы по теме