一个汇编程序,不知为何错,请指点

jist12321 2006-02-08 04:56:49
以下是我的汇编源程序,跟出错信息
TITLE MODULE1

DATA SEGMENT
STRING DB 'HO','$'
DATA ENDS

STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS

PUBLIC STRING

EXTRN DISPLAY: FAR

COSEG SEGMENT
ASSUME CS:COSEG, DS:DATA, SS:STACK1

START: MOV AX, STRING
MOV DS, AX
CALL DISPLAY
MOV AH, 4CH
INT 21H
COSEG ENDS
END START

TITLE MODULE2
PUBLIC DISPLAY
EXTRN STRING:BYTE

COSEG1 SEGMENT
DISPLAY PROC FAR

MOV DX, OFFSET STRING
MOV AH, 9
INT 21H
ret
DISPLAY endp
COSENG1 ENDS
END
编译后出错为:
Assembling: F:\Program Files\RadASM\Masm\Projects\linux\linux.asm
F:\Program Files\RadASM\Masm\Projects\linux\linux.asm(19) : error A2070: invalid instruction operands
F:\Program Files\RadASM\Masm\Projects\linux\linux.asm(21) : error A2004: symbol type conflict
F:\Program Files\RadASM\Masm\Projects\linux\linux.asm(25) : warning A4023: with /coff switch, leading underscore required for start address : START
请各位指点,谢谢了先
...全文
184 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jist12321 2006-02-11
  • 打赏
  • 举报
回复
原来如此啊,懂了,谢谢高人的指点.
zara 2006-02-10
  • 打赏
  • 举报
回复
能的. 自己设置数据段和堆栈段, 使用 16 位寄存器和 int21h, 这些都是的. 因为, 在 Win32 所使用的 flat 内存模式下, 各段的设置是由加载模块根据程序的定义自动完成的, 一般不需要自己改动. Win32 下当然也是可以是 16 位寄存器的, 但是, 这应该是属于特殊情况, 多数是使用 32 位的, 当然也有使用 8 位的. 其实, 在 dos16 下, 只要 cpu 是 386 及以上级别的, 也是可以使用 32 位通用寄存器的, 不需要 32 位模式才可以. 无论是在 32 下使用 16 位的寄存器, 还是在 16 位下使用 32 位的寄存器, 都会被编译程序在相关的指令前面加上数据大小的前缀指令, 这样才能让 cpu 正确地识别所对应的操作数的大小, 这是因为各个寄存器在不同的操作数大小时的编码是重叠的, 这个具体的可以参考指令编码的细节. 至于使用 int21h, 这个在 Win32 下是不能的, 对一般的应用程序而言, 在 dos 下用来实现各种操作的中断功能调用, 在 Windows 下被各种 Windows 的 API 函数取代了, 它们在作用和角色上是类似的.
jist12321 2006-02-10
  • 打赏
  • 举报
回复
那从我上面的那个汇编程序中,能不能在不运行的前提下光看代码就能看出它是16位的,而不是32位的?
jist12321 2006-02-09
  • 打赏
  • 举报
回复
非常感谢你的回答,不过我想再问一下,怎么区分我的汇编是32位的还是16位的,有什么区别吗?如果有资料的话,能不能发些给我,我的email是jist12321@gmail.com, 再次谢谢
jist12321 2006-02-09
  • 打赏
  • 举报
回复
原来如此,谢谢这位高人了,以后有问题的话,还请再多多指点.
zara 2006-02-09
  • 打赏
  • 举报
回复
这个问题还真不怎么好回答. 能够在纯 dos 环境下运行的, 寻址方式为 16 位的就是 dos16 类的; 能够在 Windows 环境下运行, 采用 32 为寻址模式, 经由 Windows API 函数实现功能的就是 Win32 类的程序吧. 资料上, 倒是没有特别针对这一点的
zara 2006-02-08
  • 打赏
  • 举报
回复
你的这个是 dos16 类型的程序, 不能用 Masm32 类的编译链接程序来做. 应该下载 Masm5/6.0 来进行汇编链接. 此外, 除了 COSENG1 ENDS 有个笔误, 应该是 COSEG1 ENDS 外, 没有问题吧
Dummyz 2006-02-08
  • 打赏
  • 举报
回复
TITLE MODULE1


DATA SEGMENT
STRING DB 'HO','$'
DATA ENDS

STACK1 SEGMENT PARA STACK 'STACK'
DW 20H DUP(0)
STACK1 ENDS

PUBLIC STRING

EXTRN DISPLAY: FAR

COSEG SEGMENT
ASSUME CS:COSEG, DS:DATA, SS:STACK1
START:
mov ax, DATA
mov ds, ax

CALL DISPLAY

MOV AH, 4CH
INT 21H
COSEG ENDS
END START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TITLE MODULE2

PUBLIC DISPLAY
EXTRN STRING: BYTE

COSEG1 SEGMENT
DISPLAY PROC FAR
MOV DX, OFFSET STRING
MOV AH, 9
INT 21H
ret
DISPLAY endp
COSEG1 ENDS
END
jist12321 2006-02-08
  • 打赏
  • 举报
回复
程序中有点错误我重新发一下
TITLE MODULE1

DATA SEGMENT
STRING DB 'HOW DO YOU DO!','$'
DATA ENDS

STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS

PUBLIC STRING

EXTRN DISPLAY: FAR

COSEG SEGMENT
ASSUME CS:COSEG, DS:DATA, SS:STACK1

START: MOV AX, DATA
MOV DS, AX
CALL DISPLAY
MOV AH, 4CH
INT 21H
COSEG ENDS
END START

TITLE MODULE2
PUBLIC DISPLAY
EXTRN STRING:BYTE

COSEG1 SEGMENT

DISPLAY PROC FAR

MOV DX, OFFSET STRING
MOV AH, 9
INT 21H
ret
DISPLAY endp
COSENG1 ENDS
END
先谢过
jist12321 2006-02-08
  • 打赏
  • 举报
回复
顺便再说一下,我用的工具是masm32 8 跟RadASM

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧