Чтение двух строк и вывод на экран слова 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 выполняет следующие действия:

  1. Сначала он выводит на экран приглашение для ввода двух строк.
  2. Затем он считывает две строки и сохраняет их в соответствующих буферах.
  3. Далее он сравнивает длины этих двух строк.
  4. Если первая строка длиннее второй, он выводит на экран сообщение first.
  5. Если вторая строка длиннее первой, он выводит на экран сообщение second.
  6. Если длины обеих строк одинаковы, он выводит на экран сообщение the first string length is equivalent to the second string length.
  7. После этого он завершает работу программы.

Оцени полезность:

10   голосов , оценка 3.7 из 5
Похожие ответы