【问题标题】:Do not understand output of assembly programme不懂汇编程序的输出
【发布时间】:2017-05-12 18:44:07
【问题描述】:

这是一个 8086 以相反顺序打印字符串的示例汇编语言代码

.model small
.STACK 100H
.DATA
MSG DB 'HELLO!$'

.CODE
MOV CL,0

 AGAIN:
 MOV DL,DS:[SI]
; MOV AH,2
; INT 21H
 INC CL
 INC SI
 CMP DL,'$'
 JNE AGAIN
 DEC SI
 DEC CL

 REV:
   DEC SI
   MOV DL,DS:[SI]
   MOV AH,2
   INT 21H
   DEC CL
   CMP CL,0
   JNE REV

 .EXIT
  END

它的输出是 !OLLEH 。但是如果我写

  MOV AH,2
  INT 21H

在 MOV DL,DS:[SI] 之下的 AGAIN 级别。我认为答案应该是 HELLO!!OLLEH 但它显示 '=' 字符和以前的输出。为什么会这样?

【问题讨论】:

  • 代码可以正常工作是一个巧合,因为你从来不用初始化SI
  • emu8086 内置了调试器。您应该能够检查,读取了哪些内存,在每个循环中读取了哪些内容等...可以肯定地说,新的int 21h 做了它应该做的,输出DL char...周围的事情可能不是你所期望的。

标签: assembly emu8086


【解决方案1】:

我认为答案应该是 HELLO!!OLLEH

更正。由于您仅在使用 DOS 函数 02h 输出之后检查“$”字符,因此屏幕应显示:

HELLO!$!OLLEH

只有 DOS 函数 09h 是不可能写“$”字符的。


可能会得到半正确的结果,因为 emu8086 以某种默认方式初始化了寄存器,但最好在使用之前手动设置寄存器:

.CODE
 mov ax, DATA
 mov ds, ax
 mov si, offset MSG
 MOV CL, 0
AGAIN:
 MOV DL, [SI]
 MOV AH, 2
 INT 21H

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    相关资源
    最近更新 更多