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

汇编问题

powlin1991 发布于 2012-03-14 15:27, 658 次点击
请问下,汇编里面的代码是不能这样写的么:
mov es:[15 - bx],dl(上面都已经定义了,就这里是报错的)
如果能这样写,那正确的格式是什么?
如果不能这样写,那么如何逆序的拷贝一个内存到另一个内存的?
谢谢了。
9 回复
#2
zklhp2012-03-14 21:10
如果不能这样写,那么如何逆序的拷贝一个内存到另一个内存的?

看movs系列指令 跟方向位有关

mov es:[15 - bx],dl

貌似不能这样写

建议认真看书学习一下。。。
#3
zaixuexi2012-03-15 23:30
我算是看出来了,委屈楼主来学习汇编了
#4
zklhp2012-03-16 14:25
以下是引用zaixuexi在2012-3-15 23:30:38的发言:

我算是看出来了,委屈楼主来学习汇编了
   
#5
有容就大2012-03-16 21:36
.
#6
powlin19912012-03-18 19:30
回复 3楼 zaixuexi
呵呵,已经想出来了。因为刚开始学习汇编,然后高级语言中数组都是这么写的,所以试了一下这个,结果不行。
#7
zaixuexi2012-03-18 20:00
想出来了,是不是这样的?
mov ax, data
mov ds, ax
mov es, ax
mov si, offset src+len
mov di, offset dst
std
mov cx, 0ah
rep movsb
#8
powlin19912012-03-18 20:06
回复 6楼 powlin1991
呵呵,我还真是个初学的,很多关键字没看到,只能写出这么个玩意。
题目是将ffff:0 - ffff:f单元中的8个字拷贝到0:200 - 0:20f单元中,我的代码如下:
assume cs:code
code segment
    mov ax,0ffffh
    mov ds,ax

    mov ax,0020h
    mov es,ax

    mov bx,0
    mov bp,14

    mov cx,8
s1:
    mov al,[bx]
    mov es:[bp],al
    add bx,2
    sub bp,2
    loop s1

    mov bx,1
    mov bp,15

    mov cx,8
s2:
    mov al,[bx]
    mov es:[bp],al
    add bx,2
    sub bp,2
    loop s2

    mov ax,4c00h
    int 21h
code ends
end

呵呵,见笑了。
#9
zaixuexi2012-03-18 20:56
这是你原来的代码
程序代码:
assume cs:code
code segment
    mov ax,0ffffh
    mov ds,ax        ;uint8_t *ds_seg = (uint8_t *)-1;
    mov ax,0020h
    mov es,ax        ;uint8_t *es_seg = (uint8_t *)0x0020;
    mov bx,0         ;uint16_t i = 0;
    mov bp,14        ;uint16_t j = 14;
    mov cx,8         ;uint16_t count = 8;
s1:
    mov al,[bx]
    mov es:[bp],al   ;es_seg[j] = ds_seg[i];
    add bx,2         ;i += sizeof(uint16_t);
    sub bp,2         ;j -= sizeof(uint16_t);
    loop s1          ;while (count > 0);
    mov bx,1         ;i = (uint16_t)1;
    mov bp,15        ;j = (uint16_t)15;
    mov cx,8         ;count = 8;
s2:
    mov al,[bx]
    mov es:[bp],al   ;es_seg[j] = ds_seg[i];
    add bx,2         ;i += sizeof(uint16_t);
    sub bp,2         ;j -= sizeof(uint16_t);
    loop s2          ;while (count > 0);
    mov ax,4c00h
    int 21h          ;exit(0);
code ends
end
改后的代码
程序代码:
assume cs:code
code segment
    mov ax,0ffffh
    mov ds,ax        ;uint16_t *ds_seg = (uint16_t *)-1;
    mov ax,0020h
    mov es,ax        ;uint16_t *es_seg = (uint16_t *)0x0020;

    mov bx,0         ;uint16_t i = 0;
    mov bp,0eh       ;uint16_t j = 14;
    mov cx,8         ;uint16_t count = 8;
s1:
    mov ax,[bx]
    mov es:[bp],ax   ;es_seg[j] = ds_seg[i];
    add bx,2         ;i += sizeof(uint16_t);
    sub bp,2         ;j -= sizeof(uint16_t);
    loop s1          ;while (count > 0);

    mov ax,4c00h
    int 21h          ;exit(0);
code ends
end
#10
powlin19912012-03-18 21:54
回复 9楼 zaixuexi
懂了!!!额,太笨了太笨了,呵呵,多谢版主哈。
1