汇编:初始化程序幅度对于指定的大小而言太大

时间:2016-05-14 02:23:49

标签: assembly x86 masm irvine32

我正在尝试学习如何在Assembly中编写输出 我仅为此目的将原始代码与此代码分开 我计划在成功录制之后实施这个...... 请帮忙!谢谢大家提前

此代码中存在大量错误 但首先我想知道错误A2071的原因:初始化程序的大小对于指定的大小而言太大(第10行)

TITLE PHW05    (s151619hw05.asm)
;

INCLUDE Irvine32.inc

.data

startmessage db "Start$"
msg db "display this message$"
FileName db "abcd.txt"
handle dw ?

.code
main PROC

mov ax, @data
mov ds, ax
mov dx,offset startmessage
mov ah, 09h
int 21h

mov dx,offset Filename
xor cx,cx
mov ah, 3ch
int 21h

mov dx, offset filename
mov al,2
mov ah,3dh
int 21h

mov handle, ax

mov dx,offset msg
mov bx,handle
mov cx,21
mov ah,40h
int 21h

mov bx,handle
mov ah,3eh
int 21h


;lea dx, offset msg
;mov ah, 40h
;mov cx,20
;int 21h


exit

main ENDP

END main

更新: 我试图改变第10行 从     FileName db“s151619.txt” 至     FileName db“s151619.txt”,0 和错误A2071:初始化程序的大小对于指定的大小而言太大 现在出现在11号线......

1 个答案:

答案 0 :(得分:3)

您包括Irvine32.inc,但请勿使用它。因此删除它以获得纯16位代码,因为Irvine32.inc本身包含SmallWin.inc,其中包含以下安装指令:

.686P       ; Pentium Pro or later
.MODEL flat, stdcall

这些将模式设置为Pentium Pro指令,使用32位FLAT模型。例如,使用

将16位寄存器AX设置为32位数据段值
mov ax, @data`       ; 32-bit value to 16-bit register --- Don't work

会给你一个像这样的错误

  

错误A2048:操作数必须大小相同:2 - 4

以及其他几个关于32位模式的其他指令。

第11行出现问题是由于&#39;句柄&#39;之间发生了名称冲突。在handle dw ?和&#39; HANDLE&#39;来自HANDLE TEXTEQU <DWORD>的{​​{1}}。因此在组装时,您的变量定义评估为

SmallWin.inc

无效并且会给您错误。

<强>解决方案:

  • 删除DWORD dw ?
  • 将其替换为INCLUDE Irvine32.inc - 设置16位模式
  • .MODEL SMALL, STDCALL替换为DOS退出调用exit