简单的汇编问题

我要输出10h-100hd的ascii码,当我调试的时候,代码结果是正确的,但不知道返回的时候为什么回出错,求大神解释!代码如下mainprocfarassumecs:p... 我要输出10h-100hd的ascii码,当我调试的时候,代码结果是正确的,但不知道返回的时候为什么回出错,求大神解释!代码如下
main proc far
assume cs:pro,ss:stack1,ds:pro
start: ;程序开始
;保存旧的数据
push ax
push bx
push dx
mov bx,ss
mov dx,sp
mov ax,stack1
mov ss,ax
mov sp,offset top
push bx
push dx
;初始化数据
sub bx,bx ;bx清0
mov dl,10h ;10h赋给bl
mov cx,0 ;CX做累加
redo:
mov ah,02
int 21h
inc dl ;字符下一个
cmp dl,0ffh ;判断是否结束
jz exit ;结束
inc cx ;累加器自增
push dx ;存储原来的dl数据
cmp cx,10h ;输出了16个,要换行
jz line
mov dl,0h ;空符号
jmp print
line:
mov dl,0dh ;回车
mov ah,02
int 21h
mov cx,0
mov dl,0ah ;换行
print: mov ah,02
int 21h
pop dx
jmp redo ;继续下一次输出
;结束
exit:
;输出最后一个字符
mov dl,0h ;空符号
mov ah,02
int 21h
mov dl,0ffh
mov ah,02
int 21h
pop dx
pop bx
mov sp,dx
mov ss,bx
pop dx
pop bx
pop ax
ret
main endp
pro ends
end start
代码有点错,应该是这样
;*******************************************
;定义堆栈段
stack segment
dw 10 dup(?) ;堆栈段有10个空间
top label word ;栈顶
stack ends
;*******************************************

;定义代码段
pro segment main proc
assume cs:pro sss:stack
start: ;程序开始
;保存旧的数据
push ax
push bx
push dx
mov bx,ss
mov dx,sp
mov ax,stack
mov ss,ax
mov sp,offset top
push bx
push dx
;初始化数据
sub bx,bx ;bx清0
mov bl,10h ;10h赋给bl
mov cx,0 ;CX做累加
redo:
mov ah,02
int 21h
inc dl ;字符下一个
cmp dl,101h ;判断是否结束
jz exit ;结束
inc cx ;累加器自增
push dx ;存储原来的dl数据
cmp cx,10h ;输出了16个,要换行
jz pline
mov dl,0h ;空符号
pline:
mov dl,0ah ;换行
mov ah,02
int 21h
pop dx
jmp redo ;继续下一次输出
;结束
exit: pop dx
pop bx
mov sp,dx
mov ss,bx
pop dx
pop bx
pop ax

main endp
pro ends
end start
展开
 我来答
帅花原鼻1N
2011-04-24 · TA获得超过2065个赞
知道小有建树答主
回答量:1476
采纳率:33%
帮助的人:819万
展开全部
19行:“MOV AX,DATA ;程序从START开始”问题在于放入AX寄存器的不应是一个段,而应该是段的地址,所以在“DATE”前一改加上“offset”操作符才对,应改为:“MOV AX, offset DATA”
还有30行:“END START”这是个错误的语法,应去掉“ START”
所以整个程序改为:
TITLE ***HELLO,WORLD***

;定义数据段

DATA SEGMENT
MSG DB 'HELLO,WORLD!','$'
DATA ENDS
DISPSTR MACRO
MOV AH,09H ;9号功能调用:显示字符串
INT 21H ;完成输出显示
ENDM

;定义代码段
CODE SEGMENT
ASSUME CS:CODE ;规定CS的内容
ASSUME DS:DATA ;规定DS的内容

START:
MOV AX, offset DATA ;程序从START开始
MOV DS,AX ;DS置初值,DATA的段地址
LEA DX,MSG ;得到字符串"Hello World!"的偏移地址
DISPSTR
DISPSTR
DISPSTR

EXIT: MOV AH,4CH ;4C号功能调用:终止当前程序并返回调用程序
INT 21H ;返回DOS

CODE ENDS ;代码段结尾
END ;结束汇编

这样至少没有编译错误了!但是连接好像还是有错!你自己改了!
追问
对不起,之前代码补不全,源码请看问题补充,至于你说的问题在“DATE”前一改加上“offset”操作符才对,应改为:“MOV     AX, offset DATA”,我的教科书上也是这样操作的,而且上机运行没有错误,希望您可以把代码运行一次,我调试发现到最后一步之前都因该是正确的,但到执行ret之后就会出错了!跪求解释。。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式