首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

汇编输出字符串解决方法

2013-01-07 
汇编输出字符串************************************data segmentorg 2000hstring db hello,world$dat

汇编输出字符串

;************************************
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


[解决办法]
引用:
1. 不懂psp是什么,org 2000h,接下来的数据应该存在ds:2000h中啊?
psp 是程序前面的一块内存,保存了些和当前程序相关的些系统信息和程序信息,dos 汇编的书上都有介绍的吧,其中最相关的应该是 80h 处开始的命令行参数部分了。dos 载入程序后将 ds 指向这里,因为它也不知道你的程序哪里是你中意的数据段,所以要自己在程序开始时以及适当的时候设置 ds 指向相应的数据段,方法就是上面的那两个指令。

引用:
2.
start:     
push ds    
sub ax,ax     
push ax
一直不懂这是什么意思?
这个是和程序最后的 retf 指令配合的,即程序最后返回到 psp:0000 处,那里有个 int20h 指令,以完成“结束程序并返回DOS”的功能。现在多推荐在程序的最后使用下面的代码来实现该功能而不是上面的代码
  mov ah, 4ch
int  21h

[解决办法]
这个呀,你还没设置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

热点排行