如何显示用户输入的字符串?
我需要使用以下公式在80x25文本屏幕的中心显示它:
column =(80 - string length)/ 2;
row = 25/2;
.MODEL TINY
.386
STACK 256
DATASEG
msg db 'Enter string:$'
sbuf label word ;адрес буфера для функции 0Ah
max db 0 ;максимальное количество символов
len db 0 ;количество фактически введенных
string db 254 DUP('#') ;буфер для строки (адрес строки)
;string db 255,0, 256 dup (' ')
new db 0ah, 0dh, '$'
CODESEG
start:
mov ax,@data
mov ds,ax
mov ah,09h
mov dx,offset msg
int 21h
mov ah, 0Ah
mov dx,offset string
int 21h
xor ax,ax
mov al,offset string+1
inc dx
add dx, ax
mov si,dx
mov ah,09h
mov dx,offset new ;output new line symbol
int 21h
std ;устанавливаем флаг направления дляпрохода обратно
print_next_char:
lodsb ;читаем символ из DS:SI и уменьшаем SI на 1
cmp si,offset string+1 ;конец строки? (то есть начало)
jb endprog ; если да, то переход к концу программы
cmp al,0dh
je skip
cmp al,023h
je skip
movzx bx,al
dec bx
inc byte[bx+len]
skip:
mov dl, al ;загружаем прочитанный из строки символ в DL
mov ah,02h ;DOS-функция вывода символа
; int 21h ;вызов DOS
jmp print_next_char ;возвращаемся к следующему символу
endprog:
mov dx,offset new
mov ah,09h
int 21h
mov DX, OFFSET string ; ds:dx points to string
mov AH, 09h
int 21h
mov AX, 4C00h ; Return to DOS with ERRORLEVEL=0
int 21h
end start
我的任务是开发一个可执行(EXE)程序,它最初显示(函数09h,DOS 21h中断)邀请,从键盘输入一串字符。
进入(功能0Ah,DOS 21h中断)行后,程序应在屏幕上显示其字符串(功能13h,BIOS 10h中断)。 必须输出输出的屏幕位置坐标如下:
column =(80 - dlina_stroki)/ 2;
row = 25/2;
要输入字符串,您可以定义以下缓冲区:
; ...
.data
; ...
sbuf label word ; buffer address 0Ah function
max db 0 ; the maximum number of characters
len db 0 ; the number is actually imposed
string db 254 dup (0) ; buffer line (row address)
; ...
然后,在缓冲区的每个引用sbuf
的程序中,它可以用作单独的变量。
答案 0 :(得分:2)
xor ax,ax mov al,offset string+1 inc dx add dx, ax mov si,dx
这里你的目的是计算用户输入的最后一个字符的地址,但是你需要删除偏移标记并写mov al, [string+1]
或者写mov al, len
}。
cmp al,0dh je skip cmp al,023h je skip
比较回车0Dh在这里没用,因为你没有找到左边的任何东西。
你为什么比较23h这是#?
movzx bx,al dec bx inc byte[bx+len]
您使用AL
中的ASCII字符作为内存中的偏移量。我不知道这对你的任务有什么用处。