assembly 如何设置光标位置与X坐标从输入?

h5qlskok  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(150)

尝试从坐标 X 的输入中设置一个值,但当我测试结果时,似乎 X 的坐标是随机的,如CMD底部所示。如何将输入的值传递到DH寄存器?似乎传递的不是我想要的值,而是一些随机ASCII码。

mov ah,1;read value from input
int 21h
    
mov  dh,al;Trying to pass a value from input  x coordinate
mov  dl,10 ;y coordinate
mov  ah, 02h ;output
int  10h ;bios interruption
mov  al, '1' 
mov  ah, 0Eh
int  10h
mov dx,offset test
mov ah,9
int 21h

示例如下:为 X 输入值5。其他数字只是已经设置的坐标,如:

mov  dh,4
mov  dl,10

1bqhqjot

1bqhqjot1#

  • GetKey函数01h在AL寄存器中给出一个ASCII码,例如,如果用户按5,那么AL将包含53。如果你要找的是值5,那么只需减去48。因为“0”的ASCII码是48,所以你可以把这个转换写为sub al, '0'
mov  ah, 01h   ; DOS.GetKey
  int  21h       ; -> AL
  sub  al, 48
  • BIOS.SetCursorPosition函数02h期望您在DL中提供所需的,在DH中提供所需的,以及在BH寄存器中使用的显示页。您在代码中省略了BH,并且错误地颠倒了DL和DH寄存器的含义。另外,在处理字符输出时,我们不讨论 XY,而是关于 * 列 * 和 * 行 *。
mov  dl, al    ; Column from input
  mov  dh, 10    ; Row
  mov  bh, 0     ; DisplayPage
  mov  ah, 02h   ; BIOS.SetCursorPosition
  int  10h
  • BIOS.Teletype函数0Eh还要求在BL中使用颜色,以备显示器处于图形模式,在BH中使用显示页面。如果Teletype紧跟在SetCursorPosition之后,则不需要重复设置BH。
mov  bx, 0007h ; DisplayPage BH=0, GraphicsColor BL=7 (White)
  mov  ax, 0E31h ; BIOS.Teletype AH=0Eh, Character AL='1' (49)
  int  10h

虽然emu8086仿真器不支持BH中的DisplayPage参数,但您应该学习并使用官方BIOS API。这样至少您的程序在emu8086之外运行时会有机会...

dxxyhpgq

dxxyhpgq2#

您正在从标准输入阅读字符。首先需要将其转换为数字:

mov ah,1 ;read value from input
int 21h
sub al, '0'

相关问题