assembly 组件中的循环:TASM在8086(DosBox)上实现纵横数的方法

pobjuy32  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(110)

我的代码是:

Mov ah,02
Mov cl,0A
Mov dh,30
Mov dl,dh
Int 21

Mov dl,20
Int 21

Add dh,01
Loop 0106

Mov ah,02
Mov cl,09
Mov bl,31
Mov dl,0A
Int 21

Mov dl,0D
Int 21

Mov dl,bl
Int 21

Add bl,01
Loop 0106

y0u0uwnf

y0u0uwnf1#

与你的标题中所说的使用TASM相反,截图和代码对应于DOS调试。查看有关编写TASM程序的信息。
让我们从注解代码开始(这是你在发布之前应该做的事情!)):

Mov ah,02     ; DOS.PrintCharacter
  Mov cl,0A     ; Count for the 1st loop
  Mov dh,30     ; '0'
0106 is address of top of the 1st loop.
  Mov dl,dh
  Int 21        ; This prints a digit

  Mov dl,20     ; ' '
  Int 21        ; This interjects a space character

  Add dh,01     ; Next character
  Loop 0106     ; Go to top of the 1st loop

  Mov ah,02     ; DOS.PrintCharacter
  Mov cl,09     ; Count for the 2nd loop
  Mov bl,31     ; '1'
01?? is address of top of the 2nd loop.
  Mov dl,0A     ; Linefeed
  Int 21

  Mov dl,0D     ; Carriage return
  Int 21

  Mov dl,bl     ; Current character
  Int 21

  Add bl,01     ; Next character
  Loop 0106     ; Go to top of the 1st (????????) loop

第一次循环

  • 当你的程序启动时,你不应该依赖于预先存在的寄存器内容。不要假设CX寄存器为0。您需要使用mov cx, 0A(十进制10)初始化循环计数器。loop指令依赖于CX,而不仅仅是CL
  • 屏幕截图的第一行数字之间没有任何空格。您应该删除插入空格字符Mov dl,20Int 21的行。

第二次循环

  • 这里可以用mov cl, 09(十进制9)初始化循环计数器,因为前一条loop指令将使CX寄存器的值为0。
  • 因为这是一个单独的循环loop指令必须转到另一个目的地。

程序

Mov  ah,02     ; DOS.PrintCharacter
  Mov  cx,0A     ; Count for the 1st loop
  Mov  dl,30     ; '0'
0107 is address of top of the 1st loop.
  Int  21        ; This prints a digit
  Add  dl,01     ; Next character
  Loop 0107      ; Go to top of the 1st loop

  Mov  cl,09     ; Count for the 2nd loop
  Mov  bl,31     ; '1'
0112 is address of top of the 2nd loop.
  Mov  dl,0D     ; Carriage return
  Int  21
  Mov  dl,0A     ; Linefeed
  Int  21
  Mov  dl,bl     ; Current character
  Int  21
  Add  bl,01     ; Next character
  Loop 0112      ; Go to top of the 2nd loop

  int  20        ; DOS.Terminate

相关问题