将字符串输出到控制台 - ASM 8086

时间:2012-04-06 13:28:56

标签: assembly int x86-16

我正在尝试使用INT 21h在屏幕上显示字符串,但该程序似乎立即崩溃...

我正在使用MASM

这是我的代码:

.stack 200h

    .data?
      value dd ?

    .data
      item dd 0
      str1 db 'Hello world!$'
    .code

start:

; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤


    mov edx, offset str1
    mov al, 09h
    int 21h
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤

end start

2 个答案:

答案 0 :(得分:2)

一些问题:

  1. 你的程序没有正确退出DOS,只是让你的int 21h后CPU执行内存中的垃圾。使用function 4ch终止您的计划。
  2. 你的筹码可能太少了。中断服务例程和常驻程序,包括的驱动程序(也可能是DOS),使用当前堆栈。如果他们在任何时候需要超过200h字节,他们将覆盖任何代码或数据,他们认为仍然有一些堆栈空间。这也可能导致崩溃或挂起。将大小改为1000h
  3. 您没有说明您的程序运行的处理器。问题是,你使用的是i80386 +指令(mov edx, offset str1),这在i8086 / 8088,i80186和i80286以及它们的克隆上根本不可用。顺便说一下,DOS不支持32位地址或偏移量。它应该是mov dx, offset str1
  4. 可能还有别的东西,但我们先解决这些问题。

答案 1 :(得分:0)

如果你真的使用8086,请使用: .model小 组织100h 。数据 消息db“Hello World $” 。码 主要过程         mov啊,09h         mov dx,偏移消息         int 21h         mov啊,4ch         int 21h ENDP 结束主要

更简单,更清洁的imo。