注册 登录
编程论坛 汇编论坛

新手问数据逆序存放问题

kd83kdi93 发布于 2012-12-30 12:46, 640 次点击
assume cs:code

a segment
    dw 1,2,3,4,5,6,7,8
a ends

b segment
    dw 0,0,0,0,0,0,0,0
b ends

code segment
start:
    mov ax,b
    mov ss,ax
    mov sp,16
    mov ax,a
    mov ds,ax
    mov bx,0
    mov cx,8
  s:    push ds:[bx]
    add bx,2
    loop s
      mov ax,4c00h
    int 21h
   

code ends
end start

想实现a段数据逆序存放在b段但是出现两个问题

1.把sp设置为16的时候调试会出错  我在执行第一和第二次-t命令的时候a段和b段的数据都是对的 a为1 2 3 4。地址1447:0000-000f    b为0 0 0 。地址1448:0000-000f
  但是在执行第三次-t命令的时候就发现b段的1448:0006就不是0了   

2.我把mov sp,16 改成mov sp,16h错误就没了  数据也被逆序存放了 但是逆序存放的地址变成1448:0006-0010    就不是b段了   

出错信息是  the NTVDM  CPU has encountered an illegal instruction.  
             CS:011e IP:018a OP:0f 00 0a 00 a7 choose 'close' to terminate the application

1448:0000 000f这个段好像没执行一条指令里面数据就会变一次就好像每次都会自己写入固定的数据一样

请高手帮帮我

[ 本帖最后由 kd83kdi93 于 2012-12-30 13:10 编辑 ]
4 回复
#2
zerolzb2013-01-02 11:47
你是不是直接在debug中用-a命令输入汇编的?debug中的数值默认是16进制,所以若在debug中就要输入10,若在文本编辑器中就要输入16或10h
#3
朱三哥2013-01-02 19:28
楼主有个length的伪指令可以求得当前定义的 数据的长度n
你用这个长度n-1递减到0  来应用offset伪指令的地址 来进行数据的传输
逆序可以通过设置DF 这个标志来实现,这个地方自己查手册
movsw 这个指令 是针对字符串使用的,你用这个就好了
rep这个指令 可以形成循环

回答完毕,照你上面的搞法太麻烦


[ 本帖最后由 朱三哥 于 2013-1-2 19:31 编辑 ]
#4
青春无限2013-01-03 13:36
看看
#5
mutouren1232013-01-05 22:48
呵呵,我今天也看到这里 呵呵,那个 sp 应该是 32 把,...
1