如何在x86程序集中输出用户输入的居中文本?

时间:2016-05-15 15:50:14

标签: assembly x86 dos

如何显示用户输入的字符串?

我需要使用以下公式在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的程序中,它可以用作单独的变量。

1 个答案:

答案 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字符作为内存中的偏移量。我不知道这对你的任务有什么用处。