Assembly 组件:打印来自AL、AH和BH的信息

Assembly 组件:打印来自AL、AH和BH的信息,assembly,tasm,Assembly,Tasm,需要获取有关当前视频模式的信息。函数0fh在AL、AH和BH寄存器中返回此信息。如何从该寄存器打印信息(十进制格式) 谢谢你的回答 .model tiny .code org 100h start: mov ah,9 lea dx, select_video_mode_msg int 21h call readsymb change_video_mode: mov ah,00h int 10h change_video_page_msg

需要获取有关当前视频模式的信息。函数
0fh
AL
AH
BH
寄存器中返回此信息。如何从该寄存器打印信息(十进制格式)

谢谢你的回答

.model tiny
.code

org 100h 
start:
    mov ah,9
    lea dx, select_video_mode_msg 
    int 21h
    call readsymb

change_video_mode:
    mov ah,00h
    int 10h 

change_video_page_msg:
    mov ah,9
    lea dx, select_video_page_msg 
    int 21h
    call readsymb

change_video_page:
    mov ah,05h
    int 10h 

print_info:
    mov ah,0fh
    int 10h 
    ; print info from AL, AH, BH

endprog:
    ret


readsymb:
    mov ah,01h
    int 21h 
    cmp al,2fH 
    jz endprog
    cmp al,'0'
    jz endprog 
    cmp al,'9'
    ja endprog 
    xor ah,ah 
    sub al,30h 
    ret

.data
select_video_mode_msg   db  'Select video mode (0-7): ','$'
select_video_page_msg   db  'Select video page: ','$'
info_msg_cols           db  'Symbs cols: ','$' 
info_msg_mode           db  'Current mode: ','$' 
info_msg_page           db  'Current page: ','$' 
md                      db  '$'


end start

网上有很多关于这个任务的解释和例子。诀窍是重复将寄存器除以10,然后存储剩余部分。以下是我的建议,特别是针对您的需要:

.MODEL tiny
.CODE
ORG 100h

start:

    call print_info

    mov ax, 4C00h                   ; Exit(0)
    int 21h


print_info:
    mov ah,0fh                      ; GET CURRENT VIDEO MODE
    int 10h                         ; Call Video-BIOS
    mov WORD PTR HOLD_AL, ax        ; This affects also HOLD_AH
    mov HOLD_BH, bh

    ; AL
    mov ah, 09h                     ; WRITE STRING TO STANDARD OUTPUT
    lea dx, INFO1                   ; Pointer to string
    int 21h                         ; Call MS-DOS
    mov al, HOLD_AL                 ; Argument for al2dec
    call al2dec                     ; Convert AL to decimal-string
    mov ah, 09h                     ; WRITE STRING TO STANDARD OUTPUT
    mov dx, di                      ; Result of al2dec
    int 21h                         ; Call MS-DOS

    ; AH
    mov ah, 09h                     ; WRITE STRING TO STANDARD OUTPUT
    lea dx, INFO2                   ; Pointer to string
    int 21h                         ; Call MS-DOS
    mov al, HOLD_AH                 ; Argument for al2dec
    call al2dec                     ; Convert AL to decimal-string
    mov ah, 09h                     ; WRITE STRING TO STANDARD OUTPUT
    mov dx, di                      ; Result of al2dec
    int 21h                         ; Call MS-DOS

    ; BH
    mov ah, 09h                     ; WRITE STRING TO STANDARD OUTPUT
    lea dx, INFO3                   ; Pointer to string
    int 21h                         ; Call MS-DOS
    mov al, HOLD_BH                 ; Argument for al2dec
    call al2dec                     ; Convert AL to decimal-string
    mov ah, 09h                     ; WRITE STRING TO STANDARD OUTPUT
    mov dx, di                      ; Result of al2dec
    int 21h                         ; Call MS-DOS

    ret

al2dec:
    mov bl, 10                      ; Base 10 -> divisor
    lea di, DEC_END
  L1:
    dec di                          ; fill the decimal-string in reverse order
    xor ah, ah                      ; Clear AH for division
    div bl                          ; AL = AX / BL   Remainder AH
    or ah, 30h                      ; Convert AH to ASCII
    mov BYTE PTR [di], ah           ; Save AH in the decimal-string
    test al, al                     ; AL == 0?
    jnz L1                          ; No: once more
    ret                             ; Return DS:DI Pointer to the decimal-string


            DB  "000"               ; String
    DEC_End EQU $                   ;   with label pointing to its end (+1)
            DB 13, 10, '$'          ;   and line feed and '$'-terminator
    INFO1   DB "AL (display mode): $"
    INFO2   DB "AH (number of character columns): $"
    INFO3   DB "BH (active page): $"
    HOLD_AL DB ?                    ; Uninitialized space for saving AL
    HOLD_AH DB ?                    ; Uninitialized space for saving AH
    HOLD_BH DB ?                    ; Uninitialized space for saving BH

END start

如果不写代码,这是无法完成的。@500 InternalServerError,添加了我的代码。1)将AL、AH、BH值转换为ASCII字符串2)像处理其他字符串一样打印它们。