《汇编语言第二版——王爽》实验五,5、6题

第五题:

 基本思路:将a段中的数据复制到c中,然后用b中的数据与c段相加(add c, b)。

需要注意一下几点:

  1. 数据类型是:字节型的,寄存器只能用类似于al、ah之类的;
  2. 直接将数据中一个段存到另一个段中是不可行的,类似于:mov es:[bx], ds[bx],应该要借助于寄存器。

 

 1 assume cs:codesg
 2 a segment
 3     db 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8
 4 a ends
 5 b segment
 6     db 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8
 7 b ends
 8 result segment
 9     db 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
10 result ends
11 codesg segment
12 start:
13     mov ax, a
14     mov ds, ax
15     mov ax, result
16     mov es, ax
17     
18     mov bx, 0
19     mov cx, 8
20     s1:
21         mov al, [bx]
22         mov es:[bx], al
23         inc bx
24     loop s1
25     
26     mov ax, b    ;change ds to segment b
27     mov ds, ax
28     
29     mov bx, 0
30     mov cx, 8
31     s2:
32         mov al, [bx]
33         add es:[bx], al
34         inc bx
35     loop s2
36     
37     mov ax, 4c00H
38     int 21H    
39     
40 codesg ends
41 
42 end start

 输出结果:

 

第六题:

基本思路:将段b作为stack段,a段作为data段。一次将a段中前8个字push到栈中(b段)。

需要注意的地方:

  1. 数据类型是字型,即2个字节;
  2. 注意初始化寄存器sp,即计算b段长度:2*8;
  3. 虽然利用mov直接将数据中一个段存到另一个段中是不可行的,但是push却可以,例如:push ds:[bx],该过程用mov表达即(注:可能无法编译):mov ds:[bx], ss:[sp];
 1 assume cs : codesg
 2 a segment
 3     dw 1, 2, 3, 4, 5, 6, 7, 8, 9, 0ah, 0bh, 0ch, 0dh, 0eh, 0fh, 0ffh
 4 a ends
 5 b segment
 6     dw 0, 0, 0, 0, 0, 0, 0, 0
 7 b ends
 8 
 9 codesg segment
10 start:
11     mov ax, a    ; data segment
12     mov ds, ax
13     mov ax, b    ; stack segment
14     mov ss, ax
15     mov sp, 10H
16     
17     mov bx, 0
18     mov cx, 8
19     beg:
20         ;mov ax, ds:[bx]
21         ;push ax
22         push ds:[bx]
23         add bx, 2
24     loop beg
25     
26     mov ax, 4c00H
27     int 21H
28 codesg ends
29 
30 end start

 输出结果:

后记:由于开始时不知道push默认的操作数据长度(16位),而过于小心使用了如下方法push字型数据

mov ax, ds:[bx]

push ax

后来改为:

push ds:[bx]

输出的结果是一样的。

posted @ 2013-06-13 17:21  Xbluer  阅读(3087)  评论(1编辑  收藏  举报