装配程序的意外结果

时间:2014-11-29 10:29:26

标签: assembly interrupt masm cpu-registers

我刚刚开始学习汇编语言,我正在关注tutorial

我写了以下程序:

.MODEL SMALL
.STACK 100H
.DATA
    msg db "123123.$"
.CODE
MAIN PROC

    MOV AH,02   ; Function to output a char
    MOV DL,"!"      ; Character to output
    INT 21h     ; Call the interrupt to output "!"

    MOV AH, 09
    MOV DX, OFFSET msg
    INT 21h

    MOV AH,04Ch ; Select exit function
    MOV AL,00   ; Return 0
    INT 21h     ; Call

MAIN ENDP           ; Terminate program
END MAIN

我期待以下输出:

! 123123

但我得到以下内容:

enter image description here

  • 注册AH用于存储子功能。
  • 注册DL用于存储使用INT 21h
  • 输出的字符
  • 注册DX用于存储要使用INT 21h
  • 打印的字符串的地址

的问题:

1。)以上几点是对的吗?如果没有,我不能做对的是什么?

2。)如果以上几点是正确的,为什么我会得到意想不到的输出?

3。)将来如何避免这种行为?

感谢。

1 个答案:

答案 0 :(得分:1)

您的教程处理.MODEL TINY以生成.com - 可执行文件。您使用.MODEL SMALL并生成.exe - 可执行文件。对于.MODEL SMALL,您必须明确设置DS - 注册表,默认指向PSP(而不是.DATA):

.MODEL SMALL
.STACK 1000H    ; Mor stack, less trouble
.DATA
    msg db "123123.$"
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX

... (no change) ...