您知道如何在汇编语言编程中将文本或字符串居中吗?
这是我的源代码:
.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
您的第一次尝试朝着正确的方向前进。您仍然需要考虑要在屏幕上居中的文本的长度。所需的计算是:
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