《汇编语言第二版——王爽》实验五,5、6题
第五题:
基本思路:将a段中的数据复制到c中,然后用b中的数据与c段相加(add c, b)。
需要注意一下几点:
- 数据类型是:字节型的,寄存器只能用类似于al、ah之类的;
- 直接将数据中一个段存到另一个段中是不可行的,类似于: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段)。
需要注意的地方:
- 数据类型是字型,即2个字节;
- 注意初始化寄存器sp,即计算b段长度:2*8;
- 虽然利用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]
输出的结果是一样的。