菜鸟问题,大神快来

时间:2021-04-02 20:14:08

DATA SEGMENT
STR DB 'HELLO'  
STR2 DB 5 DUP(0)   
ENDS
CODE SEGMENT
CLD
LEA SI, STR
LEA DI, STR2
MOV CX, 5
REP MOVSB 
ENDS

执行完后,打开VARS,str成了cello,str2也是cello,为什么啊

还有,单步执行时,cld没有执行,被跳过了,如果改成

DATA SEGMENT
STR DB 'HELLO0'  
STR2 DB 6 DUP(0)   
ENDS
CODE SEGMENT
CLD
LEA SI, STR
LEA DI, STR2
MOV CX, 6
REP MOVSB 
ENDS

6 个解决方案

#1


执行完后,打开VARS,str成了cello,str2也是cello,为什么啊

楼主,什么是VARS?

#2


LZ的代码像是在考验编译器的能耐呵呵! 是单步了,但是编译器编出来的不是代码那样写的逻辑 !
‘偏移量’这个东西在这里做怪吧。。。


编译器需要知道到哪里结束编译,这里需要用到end 《标号》吧!这个标号指名你的程序哪里开始执行。

DATA SEGMENT...这里写着的是伪指令,是给编译器编译源码用的!
下面的si引用的ds不一定是上面的data segment的段值。。所以呀,应该是“偏移量”在这里搞了鬼吧!

建议lz按汇编程序的规范来学习asm先。

以上仅代码个人看法哈。

#3



;
;This Program Compiled Sucess by Masm 6.15
;
assume  cs:code,ds:data
data    segment
str0    db      'hello'
str1    db      5 dup (?)
data    ends
code    segment
start:
        mov ax,data
        mov ds,ax
        mov es,ax

        mov cx,5
        mov si,offset str0
        mov di,offset str1
        cld
        rep movsb

        mov ah,4ch
        int 21h
code    ends
end     start


PS:
1,cello抑或hello?
2,str在高版本masm里是关键字
3,贴程序尽量完整

#4


你的入口地址没有了吧

你的语法是不是有点问题呢?

ends前应该有段的名字

#5


不要单步,直接运行看看。

#6


assume cs:code,ds:data
data segment
str1 db 1h,2h,3h,4h,5h
str2 DB 5 DUP(0)   
data ends
code segment
start:
mov ax,data
mov ds,ax
mov es,ax
lea si, str1
lea di, str2
mov cx, 5
cld
rep movsb 
mov ah,4ch
int 21h
code ends
end start

楼主都没指定ds es 怎么跑起来的
起初ds 和es都指向的是0c9a 实际的数据都在0caa后面

#1


执行完后,打开VARS,str成了cello,str2也是cello,为什么啊

楼主,什么是VARS?

#2


LZ的代码像是在考验编译器的能耐呵呵! 是单步了,但是编译器编出来的不是代码那样写的逻辑 !
‘偏移量’这个东西在这里做怪吧。。。


编译器需要知道到哪里结束编译,这里需要用到end 《标号》吧!这个标号指名你的程序哪里开始执行。

DATA SEGMENT...这里写着的是伪指令,是给编译器编译源码用的!
下面的si引用的ds不一定是上面的data segment的段值。。所以呀,应该是“偏移量”在这里搞了鬼吧!

建议lz按汇编程序的规范来学习asm先。

以上仅代码个人看法哈。

#3



;
;This Program Compiled Sucess by Masm 6.15
;
assume  cs:code,ds:data
data    segment
str0    db      'hello'
str1    db      5 dup (?)
data    ends
code    segment
start:
        mov ax,data
        mov ds,ax
        mov es,ax

        mov cx,5
        mov si,offset str0
        mov di,offset str1
        cld
        rep movsb

        mov ah,4ch
        int 21h
code    ends
end     start


PS:
1,cello抑或hello?
2,str在高版本masm里是关键字
3,贴程序尽量完整

#4


你的入口地址没有了吧

你的语法是不是有点问题呢?

ends前应该有段的名字

#5


不要单步,直接运行看看。

#6


assume cs:code,ds:data
data segment
str1 db 1h,2h,3h,4h,5h
str2 DB 5 DUP(0)   
data ends
code segment
start:
mov ax,data
mov ds,ax
mov es,ax
lea si, str1
lea di, str2
mov cx, 5
cld
rep movsb 
mov ah,4ch
int 21h
code ends
end start

楼主都没指定ds es 怎么跑起来的
起初ds 和es都指向的是0c9a 实际的数据都在0caa后面