Чтение двух строк и вывод на экран слова first если первая длиннее - Assembler
Формулировка задачи:
На вход подаются две строки, вывести first, если первая длиннее, иначе second.
Это TASM, нам нужно писать в досбоксе на ПО которое 1992 года. (версия Turbo Assembler 3.2i)
Вот такой код у меня получился:
Он работает... ИНОГДА.
Обычно, когда я ввожу первое слово не длиннее двух символов.
Если ввожу три или больше -- он даже не спрашивая второе слово говорит, что первое длиннее (как он мог обойти часть кода, которая запрашивает второе слово мне в голову вообще не приходит).
Что с этим кодом не так?
Спасибо!
sseq segment stack b db 256 dup(?) sseq ends dseq segment fin db 'first', 0dh, 0ah, '$' fin2 db 'second', 0dh, 0ah, '$' ent db 'Hello, enter word:', 0dh, 0ah, '$' ent2 db 'and another one:', 0dh, 0ah, '$' first db 256 dup(?) second db 256 dup(?) dseq ends cseq segment start: assume cs:cseq, ds:dseq, ss: sseq mov ax, dseq mov ds, ax mov dx, offset ent mov ah, 09h int 21h mov dx, offset first mov ah, 3Fh int 21h mov bx, 0 mov di, offset first firstlength: inc bx cmp byte ptr[di+bx], 0 jnz firstlength mov bp, bx mov dx, offset ent2 mov ah, 09h int 21h mov dx, offset second mov ah, 3Fh int 21h mov bx, 0 mov di, offset second secondlength: inc bx cmp byte ptr[bx+di], 0 jnz secondlength cmp bx, bp jl mark mov dx, offset fin2 jmp exit mark: mov dx, offset fin exit: mov ah, 09h int 21h mov ax, 4C00h int 21h cseq ends end start
Решение задачи: «Чтение двух строк и вывод на экран слова first если первая длиннее»
textual
Листинг программы
sseq segment stack b db 256 dup(?) sseq ends dseq segment ENTERED_1ST DW ? ENTERED_2ND DW ? MsgIoErr db 'I/O Error.', 0dh, 0ah, '$' MsgEqu db 'the first string length is equivalent to the second string length', 0dh, 0ah, '$' fin db 'first', 0dh, 0ah, '$' fin2 db 'second', 0dh, 0ah, '$' ent db 'Hello, enter word:', 0dh, 0ah, '$' ent2 db 'and another one:', 0dh, 0ah, '$' first db 256 dup(?) second db 256 dup(?) dseq ends ;------------ STD_INPUT EQU 0 STD_OUTPUT EQU 1 ;------------ mDisp MACRO aStr IFNB <aStr> mov dx, offset aStr ENDIF mov ah, 09h int 21h ENDM ;---- mRead MACRO aBuffer, aHandle, aLength, anErrLabel mov BX, aHandle mov dx, offset aBuffer mov ah, 3Fh int 21h jc anErrLabel mov aLength, AX ENDM ;---- cseq segment start: assume cs:cseq, ds:dseq, ss: sseq mov ax, dseq mov ds, ax mDisp ent mRead first, STD_INPUT, ENTERED_1ST, IO_ERROR mDisp ent2 mRead second, STD_INPUT, ENTERED_2ND, IO_ERROR cmp ax, ENTERED_1ST ; ax уже содержит длину второй строки mov dx, offset fin JB exit mov dx, offset fin2 JA exit MOV DX, OFFSET MsgEqu exit: mDisp mov ax, 4C00h int 21h IO_ERROR: MOV DX, OFFSET MsgIoErr JMP exit cseq ends end start
Объяснение кода листинга программы
Этот код на языке Assembler выполняет следующие действия:
- Сначала он выводит на экран приглашение для ввода двух строк.
- Затем он считывает две строки и сохраняет их в соответствующих буферах.
- Далее он сравнивает длины этих двух строк.
- Если первая строка длиннее второй, он выводит на экран сообщение
first
. - Если вторая строка длиннее первой, он выводит на экран сообщение
second
. - Если длины обеих строк одинаковы, он выводит на экран сообщение
the first string length is equivalent to the second string length
. - После этого он завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д