第五題:
基本思路:將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]
輸出的結果是一樣的。