汇编语言编程中的文本居中

问题描述 投票:0回答:1

您知道如何在汇编语言编程中将文本或字符串居中吗?

这是我的源代码:

.model small
.stack 100h
.data
;**********************************************
    labelmenu db 0ah,0dh,"MAIN MENU $"
    labelcal db 0ah,0dh,0ah,0dh,"[1] CALCULATOR $"
    labelconv db 0ah,0dh,"[2] CONVERSION $"
    labelext db 0ah,0dh,"[3] EXIT $"
.code
main proc
    mov ax,@data
    mov ds,ax
;MAIN MENU
;**********************************************
displaymenu:
    call centerclear
    mov ah,09h
    lea dx,labelmenu  ;MAIN MENU LABEL
    int 21h
    lea dx,labelcal   ;[1]CALCULATOR LABEL
    int 21h
    lea dx,labelconv  ;[2]CONVERSION LABEL
    int 21h
    lea dx,labelext   ;[3]EXIT LABEL
    int 21h

我已尝试以下解决方案,但它对我不起作用:

mov ah,3    ; Get the current cursor position
mov bh,0
int 10h

mov ah,2    ; Set cursor position
mov bh,0
mov dl,39   ; New column. In an 80-column text mode this will just about center
            ; the 3 characters 
            ; We want to stay on the same row, so we don't change DH
int 10h
assembly x86-16 dos bios tasm
1个回答
0
投票

您的第一次尝试朝着正确的方向前进。您仍然需要考虑要在屏幕上居中的文本的长度。所需的计算是:

Column = (WidthOfScreen - NumberOfCharacters) / 2

我使用了下一个修改后的数据定义:

labelmenu db "MAIN MENU", 13, 10, 10, "$"
labelcal  db "[1] CALCULATOR", 13, 10, "$"
labelconv db "[2] CONVERSION", 13, 10, "$"
labelext  db "[3] EXIT      ", 13, 10, "$"
                      ^^^^^^
                      space-padding

一个漂亮的菜单的技巧是左对齐显示选项列表。因此我使用了空格填充,以便所有这些文本可以共享相同的长度。
请注意,长度不得包含回车符、换行符或 $ 终止符。

  mov  dx, offset labelmenu
  mov  si, 9
  call PrintCentered

  mov  si, 14
  mov  dx, offset labelcal
  call PrintCentered
  mov  dx, offset labelconv
  call PrintCentered
  mov  dx, offset labelext
  call PrintCentered
  
  ...
  
; IN (ds:dx,si) OUT () MOD (ax,bh,cx,dx)
PrintCentered:
  push dx         ; (1)
  mov  bh, 0
  mov  ah, 03h    ; BIOS.GetCursor
  int  10h        ; -> CX DX

  mov  ax, 80     ; (ScreenWidth - NumberOfCharacters) / 2
  sub  ax, si
  shr  ax, 1
  mov  dl, al     ; Set Column, but keep Row

  mov  ah, 02h    ; BIOS.SetCursor
  int  10h

  pop  dx         ; (1)
  mov  ah, 09h    ; DOS.DisplayString
  int  21h        ; -> AL="$"
  ret
© www.soinside.com 2019 - 2024. All rights reserved.