汇编语言问题,将一字符串复制到该字符串的后面,但我在DOS下调试不行,代码如下,请问哪里出错?
assumecs:codesg,ds:datasgdatasgsegmentdb'welcometomasm!'datasgendscodesgsegmentstart:...
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,[si]
mov [si+16],ax
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start 展开
datasg segment
db 'welcome to masm!'
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,[si]
mov [si+16],ax
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start 展开
3个回答
展开全部
你的程序有两个问题:
1. 没有给后面添加字符留下数据空间,这样的程序是有风险的,有可能破坏别的段的数据或代码。你应当在你定义的字符串后面再加上一行:
db 16 dup(?)
2. 字符操作要逐字节处理,不能用按字(两个字节)处理。你应当将暂存数据的寄存器从AX改成AL, 同时SI每次加1而不要加2
修改后的程序如下(修改过的行加了 ;****** 注释标记):
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db 16 dup(?) ;******
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,16 ;******
s:mov al,[si] ;******
mov [si+16],al ;******
add si,1 ;******
loop s
mov ax,4c00h
int 21h
codesg ends
end start
1. 没有给后面添加字符留下数据空间,这样的程序是有风险的,有可能破坏别的段的数据或代码。你应当在你定义的字符串后面再加上一行:
db 16 dup(?)
2. 字符操作要逐字节处理,不能用按字(两个字节)处理。你应当将暂存数据的寄存器从AX改成AL, 同时SI每次加1而不要加2
修改后的程序如下(修改过的行加了 ;****** 注释标记):
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db 16 dup(?) ;******
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,16 ;******
s:mov al,[si] ;******
mov [si+16],al ;******
add si,1 ;******
loop s
mov ax,4c00h
int 21h
codesg ends
end start
展开全部
你把这个串显示一下,才能看到结果对不对呀。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你要在定义数据段的时候给后面要移动的地方开辟空间,db”0000000000000000”
你要在定义数据段的时候给后面要移动的地方开辟空间,db”0000000000000000”
你要在定义数据段的时候给后面要移动的地方开辟空间,db”0000000000000000”
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询