鱼C论坛

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

30鱼币救助一个汇编问题

[复制链接]
发表于 2013-10-26 15:39:24 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 /se陈愉鑫/se 于 2013-10-26 16:03 编辑

              
程序说明: 把code段 6个字节数据传入(倒序) data段  总是不成功!
  1. ASSUME    CS:code,DS:data ;程序说明: 把code段 6个字节数据传入(倒序) data段
  2.               data SEGMENT
  3.               DW        0000h,0000h,0000h
  4.               data ENDS
  5.               code SEGMENT
  6.                     DW        874ah,1444h,5641h
  7.               start:
  8.               MOV       AX,data
  9.               MOV       DS,AX
  10.               MOV       AX,CS
  11.               MOV       SS,AX
  12.               MOV       SP,0006
  13.               MOV       BX,6
  14.               MOV       CX,3
  15.               for:
  16.               POP       [BX]
  17.               ADD       BX,2
  18.               LOOP      for
  19.               MOV       BX,2
  20.               MOV       BX,[BX]
  21.               MOV       AX,4c00h
  22.               INT       21h
  23.               code ENDS
  24.               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 ...
小甲鱼最新课程 -> https://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过程是必须用到入栈的。
这里给你一段按照楼上思路的可行代码
  1. ASSUME    CS:code,DS:data ;程序说明: 把code段 6个字节数据传入(倒序) data段
  2.               data SEGMENT
  3.               DW        0000h,0000h,0000h
  4.               data ENDS
  5.               code SEGMENT
  6.                     DW        874ah,1444h,5641h
  7. start:
  8.               mov ax,data
  9.                           mov ds,ax
  10.                           mov ax,code
  11.                           mov es,ax
  12.                           xor bx,bx
  13.                           mov si,4        ;word ptr ds:[4] = 5641h
  14.                           mov cx,3
  15.                           
  16.         s:                  mov ax,es:[si]         
  17.                           mov [bx],ax
  18.                           add bx,2
  19.                           sub si,2
  20.                           loop s
  21.                           
  22.                           mov ax,4c00h
  23.                           int 21h
  24.                           code ends
  25.                           end start
  26.                           
复制代码

ps:在帖子里给代码排版真蛋疼……

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-26 15:59:52 From FishC Mobile | 显示全部楼层
晕,这也得回复?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-26 16:06:05 From FishC Mobile | 显示全部楼层
start后第三句cx改为cs
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-10-26 16:08:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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



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

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

mov ds:[bx],ax
bx 指向等待写入数据的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-10-28 00:12:09 | 显示全部楼层
data段最后一个内存的偏移应该是4,而不是6,然后每次减2,不是加2。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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