无名侠 发表于 2013-10-26 15:39:24

30鱼币救助一个汇编问题

本帖最后由 /se陈愉鑫/se 于 2013-10-26 16:03 编辑

            
程序说明: 把code段 6个字节数据传入(倒序) data段总是不成功!ASSUME    CS:code,DS:data ;程序说明: 把code段 6个字节数据传入(倒序) data段
            data SEGMENT
            DW      0000h,0000h,0000h
            data ENDS
            code SEGMENT
                  DW      874ah,1444h,5641h
            start:
            MOV       AX,data
            MOV       DS,AX
            MOV       AX,CS
            MOV       SS,AX
            MOV       SP,0006
            MOV       BX,6
            MOV       CX,3
            for:
            POP      
            ADD       BX,2
            LOOP      for
            MOV       BX,2
            MOV       BX,
            MOV       AX,4c00h
            INT       21h
            code ENDS
            END       start

skyonline 发表于 2013-10-26 15:39:25

本帖最后由 skyonline 于 2013-10-26 23:53 编辑

ASSUME    CS:code,DS:data ;程序说明: 把code段 6个字节数据传入(倒序) data段
            data SEGMENT
            DW      0000h,0000h,0000h
            data ENDS
            code SEGMENT
                  DW      874ah,1444h,5641h
            start:
            MOV       AX,data
            MOV       DS,AX
            MOV       AX,CS
            MOV       SS,AX
            MOV       SP,0006       ;此处改成4
            MOV       BX,6          ;此处改成0
            MOV       CX,3
            for:
            POP      
            ADD       BX,2
            LOOP      for
             MOV       BX,2      ;这两句话我没看懂,但是如果只是传递数据可以删掉
            MOV       BX,    
            MOV       AX,4c00h
            INT       21h
            code ENDS
            END       start


注意:此程序是·不·能·单·步·跟·踪·的,否则在debug当中会在cs:ip入栈时会把code段的数据(874a等)覆盖掉
还有一点很重要的是出栈的操作顺序是①先把数据移入目标②之后sp = sp+2所以sp初值应设成4。如果想要单步跟踪的话就像楼上的说法一样,使用寄存器间接写入,毕竟debug过程是必须用到入栈的。
这里给你一段按照楼上思路的可行代码ASSUME    CS:code,DS:data ;程序说明: 把code段 6个字节数据传入(倒序) data段
            data SEGMENT
            DW      0000h,0000h,0000h
            data ENDS
            code SEGMENT
                  DW      874ah,1444h,5641h
start:
            mov ax,data
                        mov ds,ax
                        mov ax,code
                        mov es,ax
                        xor bx,bx
                        mov si,4      ;word ptr ds: = 5641h
                        mov cx,3
                        
      s:                  mov ax,es:         
                        mov ,ax
                        add bx,2
                        sub si,2
                        loop s
                        
                        mov ax,4c00h
                        int 21h
                        code ends
                        end start
                        
ps:在帖子里给代码排版真蛋疼……

vitamin 发表于 2013-10-26 15:59:52

晕,这也得回复?

vitamin 发表于 2013-10-26 16:06:05

start后第三句cx改为cs

无名侠 发表于 2013-10-26 16:08:57

vitamin 发表于 2013-10-26 16:06 static/image/common/back.gif
start后第三句cx改为cs

改了...还是不行

LinuxDeepin 发表于 2013-10-26 21:36:35

本帖最后由 LinuxDeepin 于 2013-10-26 21:37 编辑



代码思路错误,建议重新写代码
建议:
      把需要复制的数据先存储在寄存器里,再通过寄存器写入指定内存单元

mov ax,cs:
si 指向等待复制数据的地址

mov ds:,ax
bx 指向等待写入数据的地址

志华 发表于 2013-10-28 00:12:09

data段最后一个内存的偏移应该是4,而不是6,然后每次减2,不是加2。
页: [1]
查看完整版本: 30鱼币救助一个汇编问题