汇编输出字符串

zk3389 2012-11-07 05:17:29
;************************************
data segment
org 2000h
string db 'hello,world$'
data ends
;************************************
code segment
main proc far
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax

mov ah,09h
lea dx,string;调试的时候dx=2000h,但是'hello,world$'存在ds:2100中???为什么?
int 21h
ret
main endp
code ends
end start

...全文
302 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-11-09
  • 打赏
  • 举报
回复
PSP起始两字节存放"INT 20H"指令的机器码(CDH 20H),该指令使程序返回DOS; EXE程序刚运行时,DS和ES指向PSP首址,即INT20H指令的机器码:COM程序刚运行时,DS,ES,CS,SS均指向PSP首址。
「已注销」 2012-11-09
  • 打赏
  • 举报
回复
这个呀,你还没设置ds指向data段呢。
;************************************
data segment
    org 2000h
    string db 'hello,world$'
data ends
;************************************
code segment
main proc far
    assume cs:code,ds:data
start:
; 这句话是让最后程序返回不会报错的
; retf 地址 ds:ax
    push ds
    sub ax,ax
    push ax
 
	; 这里设置一下,让ds指向data段就没问题了
	mov ax,data
	push ax
	pop ds
 
    mov ah,09h
    lea dx,string
    int 21h
    ret
main endp
code ends
     end start
zara 2012-11-09
  • 打赏
  • 举报
回复
引用 2 楼 zk3389 的回复:
1. 不懂psp是什么,org 2000h,接下来的数据应该存在ds:2000h中啊?
psp 是程序前面的一块内存,保存了些和当前程序相关的些系统信息和程序信息,dos 汇编的书上都有介绍的吧,其中最相关的应该是 80h 处开始的命令行参数部分了。dos 载入程序后将 ds 指向这里,因为它也不知道你的程序哪里是你中意的数据段,所以要自己在程序开始时以及适当的时候设置 ds 指向相应的数据段,方法就是上面的那两个指令。
引用 2 楼 zk3389 的回复:
2. start: push ds sub ax,ax push ax 一直不懂这是什么意思?
这个是和程序最后的 retf 指令配合的,即程序最后返回到 psp:0000 处,那里有个 int20h 指令,以完成“结束程序并返回DOS”的功能。现在多推荐在程序的最后使用下面的代码来实现该功能而不是上面的代码
  mov ah, 4ch
int  21h
wanglu343280746 2012-11-09
  • 打赏
  • 举报
回复
姐,你这段代码是写在哪里的,怎么编译啊
zk3389 2012-11-09
  • 打赏
  • 举报
回复
1. 不懂psp是什么,org 2000h,接下来的数据应该存在ds:2000h中啊? 2. start: push ds sub ax,ax push ax 一直不懂这是什么意思?
zara 2012-11-08
  • 打赏
  • 举报
回复
因为你没有将 ds 指向到 data 段而是缺省的 psp ,psp 占用了 100h 字节。使用 string 前应该有
    mov  ax, data
    mov  ds, ax

21,459

社区成员

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

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