实验2 多个逻辑段的汇编源程序编写与调试
assume ds:data, cs:code, ss:stack data segment db 16 dup(0) data ends stack segment db 16 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 16 mov ah, 4ch int 21h code ends end start
assume ds:data, cs:code, ss:stack data segment db 4 dup(0) data ends stack segment db 8 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 8 mov ah, 4ch int 21h code ends end start
assume ds:data, cs:code, ss:stack data segment db 20 dup(0) data ends stack segment db 20 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 20 mov ah, 4ch int 21h code ends end start
assume ds:data, cs:code, ss:stack code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 20 mov ah, 4ch int 21h code ends data segment db 20 dup(0) data ends stack segment db 20 dup(0) stack ends end start
xxx segment db N dup(0) xxx ends
assume cs:code code segment start: mov ax, 0b800h mov ds, ax mov bx, 0f00h mov cx, 80 s: mov [bx], 0403h add bx, 2 loop s mov ah, 4ch int 21h code ends end start
实验任务3
assume cs:code
data1 segment
db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
data1 ends
data2 segment
db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers
data2 ends
data3 segment
db 16 dup(0)
data3 ends
code segment
start:
mov ax, data1
mov ds, ax
mov cx, 5
mov bx, 0
s: mov ax, [bx+16]
add ax, [bx]
mov [bx+32], ax
add bx, 2
loop s
code ends
end start
通过debug调试可以发现,data1数据段首地址为076a:0000 ;data2数据段首地址为076a:0010 ;data3数据段首地址为076a:0020 ;
数据已经完成相加并移入data3中
实验任务4
assume cs:code data1 segment dw 2, 0, 4, 9, 2, 0, 1, 9 data1 ends data2 segment dw 8 dup(?) data2 ends code segment start: mov ax, data1 mov ds, ax mov cx, 8 mov bx, 0 mov di, 14 mov si,16 s: mov ax, [bx+di] mov [bx+si], ax add si, 2 sub di, 2 loop s mov ah, 4ch int 21h code ends end start
通过debug调试可以发现,data1数据段首地址为076a:0000 ;data2数据段首地址为076a:0010 ;数据已经完成逆序存放。
实验任务5
assume cs:code, ds:data data segment db 'Nuist' db 2, 3, 4, 5, 6 data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
db 2,3,4,5,6 --> 改成: db 5 dup(2) 或 db 5 dup(5)
数据用于控制显示字符的颜色
实验任务6
assume cs:code, ds:data data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends code segment start: mov ax, data mov ds, ax mov cx, 4 mov bx, 0 s: mov al, [bx] or al, 0020h mov [bx], al add bx, 16 loop s mov ah, 4ch int 21h code ends end start
通过调试可以发现,每行首字母的数值增加了20h,即ASCII码值加32,字母由大写转变为小写。
实验任务7
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dw 16, 22, 382, 1356, 2390 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ; table ends code segment start: mov ax, data mov ds, ax mov cx, 5 mov bx, 0 mov si, 0 mov di, 0 s: mov ax, [bx] mov [48+si], ax mov ax, [bx+2] mov [50+si], ax mov ax, [di+20] mov [53+si], ax mov ax, 0 mov [55+si], ax mov ax, [di+30] mov [58+si], ax mov ax, [di+20] mov dh, [di+30] div dh mov [61+si], al mov al, 0 mov [62+si], al add si, 16 add di, 2 add bx, 4 loop s mov ah, 4ch int 21h code ends end start
debug调试可以看出,data数据段首地址为076a:0000 ,table段首地址为076a:0030 。
以第四行,即076a:0030举例,前四个字节31 39 37 35存放的数据即为年份1975;第6-7个字节存放收入10;第11-12字节存放雇员3;第14-15字节存放人均收入5。