Работа со строками (assembler)
Имеется строка-предложение из нескольких слов. Написать процедуру осуществляющую запись тех же строк словами переписанными с конца наперед. Дополнительных массивов не использовать. Осуществить вывод исходной строки и сформированной.
выводишь строку в первом случае с df=0 , во втором df=1
INVERSE_DISPLAY_LINE PROC NEAR
; перед вызовом процедуры в стек занести адрес начала строки
; "вытягивавем" из стека адрес начала строки
PUSHA ; сохраняем все РОН в стеке
MOV BP, SP ; BP=указателю стека
MOV BX, [BP+18] ; извлекаем адрес начала строки (до него 8-мь РОН+адрес возврата=9 слов)
MOV CX, BX ; сохранение адреса начала строки в СХ
; вывод на дисплэй строки в нормальном виде
MOV DX, CX ; DX=адресу начала строки
MOV AH, 09h ; AH=номеру ф-ции "вывод строки на дисплэй"
INT 021h ; вызов прерывания
; переход на новую строку
MOV AH, 02h ; AH=номеру ф-ции "вывод символа на дисплэй"
MOV DL, 0AH ; код символа перевода строки
INT 021h
MOV AH, 02h ; AH=номеру ф-ции "вывод символа на дисплэй"
MOV DL, 0DH ; код символа возврат каретки
INT 021h
; вычисление адреса конца строки
SEARCH_END_LINE_ADDR:
MOV AL, [BX] ; загрузка очередного символа сроки
CMP AL, '$' ; AX=='$' ??
JE CONTINUE_SEARCH ; да - прекращаем поиск
INC BX ; нет - BX=BX+1
JMP SHORT SEARCH_END_LINE_ADDR
CONTINUE_SEARCH:
DEC BX ; ВХ=ВХ-1, так как ВХ указывал на символ конца строки
; вывод строки "задом-наперед" на дисплэй
INVERSE_DISP_LINE:
MOV AH, 02h ; AH=номеру ф-ции "вывод символа на дисплэй"
MOV DL, [BX] ; DX=ASCII-коду очередного выводимого символа
INT 021h ; вызов прерывания
CMP BX, CX ; BX=адресу начала строки??
JE END_INV_DISP_LINE ; да - прекращаем вывод
DEC BX ; нет - BX=BX+1
JMP SHORT INVERSE_DISP_LINE
END_INV_DISP_LINE:
POPA ; восстановления всех РОН
RET 2 ; возврат из процедуры и удаление слова с адресом строки из стека
INVERSE_DISPLAY_LINE ENDP
Можно, конечно, воспользоваться прямой пересылкой строки в видеопамять, но ИМХО прерывание удобнее
"ab cde"
"ba edc"
а, не
"edc ba"