鱼C论坛

 找回密码
 立即注册
查看: 1667|回复: 6

30鱼币救助一个汇编问题

[复制链接]
发表于 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       [BX]
              ADD       BX,2
              LOOP      for
              MOV       BX,2
              MOV       BX,[BX]
              MOV       AX,4c00h
              INT       21h
              code ENDS
              END       start 

最佳答案

查看完整内容

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 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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       [BX]
              ADD       BX,2
              LOOP      for
             MOV       BX,2          ;这两句话我没看懂,但是如果只是传递数据可以删掉
              MOV       BX,[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:[4] = 5641h
                          mov cx,3
                          
        s:                  mov ax,es:[si]          
                          mov [bx],ax
                          add bx,2
                          sub si,2
                          loop s
                          
                          mov ax,4c00h
                          int 21h
                          code ends
                          end start
                          
ps:在帖子里给代码排版真蛋疼……

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-26 15:59:52 From FishC Mobile | 显示全部楼层
晕,这也得回复?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-26 16:06:05 From FishC Mobile | 显示全部楼层
start后第三句cx改为cs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-26 16:08:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-26 21:36:35 | 显示全部楼层
本帖最后由 LinuxDeepin 于 2013-10-26 21:37 编辑



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

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

mov ds:[bx],ax
bx 指向等待写入数据的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-28 00:12:09 | 显示全部楼层
data段最后一个内存的偏移应该是4,而不是6,然后每次减2,不是加2。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 12:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表