菜鸟遇上一个怪问题~~~

badboy111111 2009-03-24 04:46:44
DATA SEGMENT
STRING1 DB 30 DUP(?)
DATA ENDS
INFO SEGMENT
QUIT DB "Press any key to exit......",13,10,'$'
INFO ENDS
CODE SEGMENT
START PROC FAR
ASSUME CS:CODE,DS:DATA,ES:INFO
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,INFO
MOV ES,AX
LEA SI,STRING1
DON1:
MOV AH,01H
INT 21H
CMP AL,'$'
JZ WAIRTFOREXIT
STOSB
JMP DON1
WAIRTFOREXIT:
MOV AL,13
STOSB
MOV AL,10
STOSB
MOV AL,'$'
STOSB
MOV AH,9
LEA DX,STRING1
INT 21H
MOV AH,9
LEA DX,QUIT
INT 21H
MOV AH,1
INT 21H
EXIT: RET
START ENDP
CODE ENDS
END START


以上代码中““Press any key to exit......",13,10,'$'”这一句为何没能输出?
...全文
180 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtdumpling 2009-03-25
  • 打赏
  • 举报
回复
上面那个输出两次STRING1,或许你想要的是下面这种:
输出STRING1和QUIT各一次.
DATA SEGMENT 
STRING1 DB 30 DUP(0)
DATA ENDS

INFO SEGMENT
QUIT DB "Press any key to exit......",13,10,'$'
INFO ENDS

sseg segment stack
dw 100h dup(0)
sseg ends

CODE SEGMENT 'code'

START PROC FAR
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:sseg
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
; MOV AX,INFO
MOV ES,AX
; LEA SI,STRING1
LEA DI,STRING1;;
DON1:
MOV AH,01H
INT 21H
CMP AL,'$'
JZ WAIRTFOREXIT
STOSB ;store al to es:[di]
JMP DON1
WAIRTFOREXIT:
MOV AL,13
STOSB
MOV AL,10
STOSB
MOV AL,'$'
STOSB
MOV AH,9
LEA DX,STRING1
INT 21H ;print STRING1, DATA:0
mov ax,INFO
mov ds,ax
MOV AH,9
LEA DX,QUIT
INT 21H ;print QUIT, INFO:0
MOV AH,1
INT 21H
EXIT:
RET
START ENDP

CODE ENDS

END START
xtdumpling 2009-03-25
  • 打赏
  • 举报
回复
5楼的代码,我就是给你的代码做了注释而已!

试试下面这个吧!
DATA SEGMENT 
STRING1 DB 30 DUP(?)
DATA ENDS

INFO SEGMENT
QUIT DB "Press any key to exit......",13,10,'$'
INFO ENDS

sseg segment stack
dw 100h dup(0)
sseg ends

CODE SEGMENT 'code'

START PROC FAR
ASSUME CS:CODE,DS:DATA,ES:INFO,SS:sseg
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,INFO
MOV ES,AX
; LEA SI,STRING1
LEA DI,STRING1;;
DON1:
MOV AH,01H
INT 21H
CMP AL,'$'
JZ WAIRTFOREXIT
STOSB
JMP DON1
WAIRTFOREXIT:
MOV AL,13
STOSB
MOV AL,10
STOSB
MOV AL,'$'
STOSB
MOV AH,9
LEA DX,STRING1
INT 21H ;print STRING1, DS:0
MOV AH,9
LEA DX,QUIT ;offset QUIT=offset STRING1= 0, print DS:0 again
INT 21H
MOV AH,1
INT 21H
EXIT:
RET
START ENDP

CODE ENDS

END START
badboy111111 2009-03-25
  • 打赏
  • 举报
回复
那5楼中的代码为什么能把ES中内容输出,而DS中内容反而输不出呢?
是不是我机器有问题?
我越搞越糊涂了:(
badboy111111 2009-03-25
  • 打赏
  • 举报
回复
那5楼中的代码为什么能把ES中内容输出,而DS中内容反而输不出呢?
xtdumpling 2009-03-25
  • 打赏
  • 举报
回复
ASSUME CS:CODE,DS:DATA,ES:DATA;告诉编译器 段寄存器得指向
MOV AX,DATA
MOV ES,AX;给es段赋值
2楼代码中只是为了给你说明当ds=es时才可以你那样做,才用到es.本可以不用es的
badboy111111 2009-03-25
  • 打赏
  • 举报
回复
不知是不是我机器有问题,5楼的答案运行起来和我上面所说的情况一样,STRING1中的内容就无法输出了,而QUIT中的内容输出了两次?
我越搞越糊涂了:(
badboy111111 2009-03-25
  • 打赏
  • 举报
回复
谢谢2楼的回答。
不过我还是有一点不明白,2楼答案中的“ASSUME CS:CODE,DS:DATA,ES:DATA “及”MOV AX,DATA“,”MOV ES,AX“的目的是什么呢?
既然前面说了”DS:DX=待输出字符的地址“那还要ES段来做什么?不过我试过去掉这两句,结果STRING1中的内容就无法输出了。这是为什么?
小弟初学,资质也不高。还请高手明示,感激不尽~~
xtdumpling 2009-03-25
  • 打赏
  • 举报
回复
DATA SEGMENT 
STRING1 DB 30 DUP(?)
DATA ENDS

INFO SEGMENT
QUIT DB "Press any key to exit......",13,10,'$'
INFO ENDS

sseg segment stack
dw 100h dup(0)
sseg ends

CODE SEGMENT 'code'

START PROC FAR
ASSUME CS:CODE,DS:DATA,ES:INFO,SS:sseg
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,INFO
MOV ES,AX
LEA SI,STRING1
DON1:
MOV AH,01H
INT 21H
CMP AL,'$'
JZ WAIRTFOREXIT
STOSB
JMP DON1
WAIRTFOREXIT:
MOV AL,13
STOSB
MOV AL,10
STOSB
MOV AL,'$'
STOSB
MOV AH,9
LEA DX,STRING1
INT 21H ;print STRING1, DS:0
MOV AH,9
LEA DX,QUIT ;offset QUIT=offset STRING1= 0, print DS:0 again
INT 21H
MOV AH,1
INT 21H
EXIT:
RET
START ENDP

CODE ENDS

END START
xtdumpling 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 killbug2004 的回复:]
功能09H
功能描述:输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,将无法判断磁盘已满
入口参数:AH=09H
DS:DX=待输出字符的地址
说明:待显示的字符串以’$’作为其结束标志
出口参数:无


QUIT字符串在es段,不在ds段
[/Quote]
2楼不是说得很明白了吗?
badboy111111 2009-03-25
  • 打赏
  • 举报
回复
谢谢各位了,特别是xtdumpling,那么耐心的回答我的提问。
我先理解理解你们给我的答案,脑子一下子还没明白过来,呵呵~~
badboy111111 2009-03-24
  • 打赏
  • 举报
回复
谢谢~~但我还是不大明白,为什么我的程序会把DS段的STRING1的内容输出两次,但ES段的QUIT中的内容不能输出呢?
killbug2004 2009-03-24
  • 打赏
  • 举报
回复
功能09H
功能描述:输出一个字符串到标准输出设备上。如果输出操作被重定向,那么,将无法判断磁盘已满
入口参数:AH=09H
DS:DX=待输出字符的地址
说明:待显示的字符串以’$’作为其结束标志
出口参数:无


QUIT字符串在es段,不在ds段
DATA SEGMENT  
STRING1 DB 30 DUP(?)
QUIT DB "Press any key to exit......",10,13,'$'
DATA ENDS

CODE SEGMENT
START PROC FAR
ASSUME CS:CODE,DS:DATA,ES:DATA
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AX,DATA
MOV ES,AX

LEA SI,STRING1
DON1:
MOV AH,01H
INT 21H
CMP AL,'$'
JZ WAIRTFOREXIT
STOSB
JMP DON1
WAIRTFOREXIT:
;INT 3
MOV DX,SI
MOV AL,10
STOSB
MOV AL,13
STOSB
MOV AL,'$'
STOSB
MOV AH,9
INT 21H

MOV AH,9
LEA DX,STRING1
INT 21H
MOV AH,9
LEA DX,QUIT
INT 21H
MOV AH,1
INT 21H
EXIT:
RET
START ENDP
CODE ENDS
END START
BAYNPU 2009-03-24
  • 打赏
  • 举报
回复
这个源程序参考一下吧:
data segment
QUIT DB "Press any key to exit......",13,10,'$'
buf db 10
db 0
db 10 DUP(0),'$'
CR db 13,10,'$'
data ends
code segment
assume cs:code,ds:data
start PROC FAR
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov dx,offset quit
mov ah,09h
int 21h
lea dx,buf
mov ah,10
int 21h
mov dx,offset CR
mov ah,09h
int 21h
lea bx,buf
mov si, word ptr[ bx + 1 ]
and si, 0ffh
mov byte ptr[ bx + si + 2 ], '$'
lea dx, buf
inc dx
inc dx
mov ah,09h
int 21h
mov ah,4ch
int 21h
START ENDP
code ends
end start

21,500

社区成员

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

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