Копирование символов из входа 0ah в другую переменную - PullRequest
2 голосов
/ 23 сентября 2019

Задание звучит так: «Введите строку s1 длиной не менее 10 символов. Скопируйте последний, но один символ три раза и первый из строки s1 в строку s2. Отобразите строки s1 и s2."

Я мучился с этим кодом в течение двух дней и до сих пор не могу достичь результата, а также не могу понять, как это исправить.На данный момент мы изучили только функции 0Ah, 02h, 09h и 40h, кроме int21h / 4ch.Для приведенного ниже кода компиляция не позволяет мне что-либо вводить и печатает 3 символа, которые очень похожи на 6.

.model small
.stack
.data

m1 db "Enter the string:", 10, 13,  "$"
maxlength db 11
clength db ?
s1 db 11 dup(?)
s2 db 5 dup(?)
nline db 10,13,"$"

.code

mov ax, @data
mov ds, ax

mov ah, 9
lea dx, m1
int 21h

mov ah, 0Ah
lea dx, s1
int 21h

mov bl, clength
mov bh, 0

mov AL, s1[BX-2]
mov s2+1, AL

mov AL, s1[BX-2]
mov s2+2, AL

mov AL, s1[BX-2]
mov s2+3, AL

mov AL, s1[BX+1]
mov s2+4, AL

mov s2+5, "$"
mov s1[bx], "$"

mov ah, 9
lea dx, s1
int 21h

mov ah, 9
lea dx, nline
int 21h

mov ah, 9
lea dx, s2
int 21h

mov ah, 9
lea dx, nline
int 21h

mov ah, 4ch
int 21h
end

Я ожидаю, что результат будет: Введите строку (строку, которую я печатаю)

(символы скопированы с s1)

Ответы [ 3 ]

1 голос
/ 26 сентября 2019
mov ah, 0Ah
lea dx, s1
int 21h

В вашей программе адрес этой функции DOS должен быть "maxlength".
Вы также можете написать это как lea dx, [s1-2].

Фактический буферDOS требует:

MyInput db 11, 0, 11 dup(?)

mov ah, 0Ah
lea dx, MyInput
int 21h

Подробнее о функции DOS 0Ah можно прочитать в Как работает буферизованный ввод .


и первыйиз строки s1

Вы решили это, написав:

mov AL, s1[BX+1]
mov s2+4, AL

Это не правильно.На s1[bx+1] в памяти только мусор.Вы можете выбрать 1-й символ s1 с помощью mov al, s1.


mov AL, s1[BX-2]
mov s2+1, AL
mov AL, s1[BX-2]
mov s2+2, AL
mov AL, s1[BX-2]
mov s2+3, AL
mov AL, s1[BX+1]
mov s2+4, AL
mov s2+5, "$"

В строке s2 доступно только 5 позиций.Ваше добавление +1 к +5 будет писать за этим буфером!Это уничтожит вашу строку NewLine.
Вам нужно использовать дополнения от +0 до +4, чтобы оставаться в пределах буфера.

mov AL, s1[BX-2]
mov s2, AL            NEW
mov AL, s1[BX-2]
mov s2+1, AL          NEW
mov AL, s1[BX-2]
mov s2+2, AL          NEW
mov AL, s1            NEW
mov s2+3, AL          NEW
mov s2+4, "$"         NEW

И, конечно, вам не нужно читать этоот второго до последнего символа 3 раза.

mov al, s1[bx-2]
mov s2, al
mov s2+1, al
mov s2+2, al
mov al, s1
mov ah, "$"
mov s2+3, ax
0 голосов
/ 29 сентября 2019

.модель small

.stack

.data

m1 db "Введите строку:", 10, 13, "$"

максимальная длина дБ 11

длина дБ?

с1 дБ 11 дуп (?)

с2 дБ 5 дуп (?)

nline дБ 10,13,"$"

.code

mov ax, @ data

mov ds, ax

mov ah, 9

lea dx, m1

int 21h

mov ah, 0Ah

lea dx, maxlength;Я изменил s1 на maxlength

int 21h

mov bl, длина

mov bh, 0

mov AL, s1 [BX-2]

mov s2 + 1, AL

mov s2 + 2, AL

mov s2 + 3, AL

mov AL, s1 [0];вместо записи [bx + 1] я выбрал s1 [0] для копирования символа с первой позиции

mov s2 + 4, AL

mov s2 + 5, "$"

mov s1 [bx], "$"

mov ah, 9

lea dx, nline; добавлена ​​новая строка

int 21h

mov ah, 9

lea dx, s1

int 21h

mov ah, 9

lea dx, nline

int 21h

mov ah, 9

lea dx, s2;ubrala s2 [2], ne nujen

int 21h

mov ah, 9

lea dx, nline

int 21h

мов ах, 4ch

int 21h

end

0 голосов
/ 26 сентября 2019

Если вы перейдете по ссылке Михаила на описание int 21h / 0ah , вы увидите, что DS: DX, как ожидается, будет указывать на буфер, где первый байт - максимальное количество символов, а второй - байт.количество фактически прочитанных символов, а затем еще байтов для хранения прочитанной строки.Вы фактически выделяете эти первые два байта (maxlength и clength), но вы указываете DX на s1, который будет первым байтом прочитанных символов, а не целым буфером.Также (при условии, что это синтаксис MASM)

...