[Assembly Language] 实验3 多个段的汇编源程序编写与调试
Task1 运行汇编程序并分析其功能
汇编程序如下:
1 assume cs:code, ds:data 2 data segment 3 db 'Nuist' 4 db 5 dup(2) 5 data ends 6 7 code segment 8 start: 9 mov ax, data 10 mov ds, ax 11 12 mov ax, 0b800H 13 mov es, ax 14 15 mov cx, 5 16 mov si, 0 17 mov di, 0f00h 18 s: mov al, [si] 19 and al, 0dfh 20 mov es:[di], al 21 mov al, [5+si] 22 mov es:[di+1], al 23 inc si 24 add di, 2 25 loop s 26 27 mov ah, 4ch 28 int 21h 29 code ends 30 end start
更改db 5 dup(2) 为 db 2,3,4,5,6. 更改前和更改后的效果分别如下所示:
line 15~25 将Nuist这个五个字符转换成大写,并修改成后五个字表示的颜色,输出到界面的底部。
Task2 在屏幕中输出数字
在屏幕中分别输出如下程序段中的数字:
data segments db 23, 50, 66, 71, 35 data ends
编写程序如下:
1 assume cs:code, ds:data 2 data segment 3 db 23,50,66,71,35 4 data ends 5 6 code segment 7 start: 8 mov ax,data 9 mov ds,ax 10 mov dh,0ah 11 12 mov di,0 13 mov cx,5 14 s: mov al,[di] 15 mov ah,00h 16 div dh 17 add al,30h 18 add ah,30h 19 mov bx,ax 20 inc di 21 22 mov ah,2 23 mov dl,bl 24 int 21h 25 mov dl,bh 26 int 21h 27 mov dl,20h 28 int 21h 29 loop s 30 31 mov ah,4ch 32 int 21h 33 code ends 34 end start
运行结果如下:
Task3 Debug汇编程序,回答问题(1)
程序如下:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
(1)CPU执行程序,程序返回前,data段中的数据为:23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 97 09
(2)CPU执行程序,程序返回前,cs = 076C、ss = 076B、ds = 076A
(3)设程序加载后,code段的地址为X,则data段的段地址为 X-2,stack段的段地址为 X-1
Task4 Debug汇编程序,回答问题(2)
程序如下:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
(1)CPU执行程序,程序返回前,data段中的数据为:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
(2)CPU执行程序,程序返回前,cs = 076C、ss = 076B、ds = 076A
(3)设程序加载后,code段的地址为X,则data段的段地址为 X-2,stack段的段地址为 X-1
(4)对于如下定义的段:
name segment
...
name ends
如果段中数据占N个字节,则程序加载之后,该段实际占有的空间为 ⌈N/16⌉*16
Task5 Debug汇编程序,回答问题(3)
程序如下:
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
(1)CPU执行程序,程序返回前,data段中的数据为:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
(2)CPU执行程序,程序返回前,cs = 076A、ss = 076E、ds = 076D
(3)设程序加载后,code段的地址为X,则data段的段地址为 X+3,stack段的段地址为 X+4
Task6 综合上面三个实验任务,分析当“end start”改为“end”时能否正确执行
只有 Task5 中的代码能正确执行。当代码存在"end start"时,程序会从start标记的位置开始执行,否则从头开始执行。Task5 中将代码书写在前面,程序从头执行,因此可以达到编写者想要的效果。
Task7 编写程序,将 a 段和 b 段中的数据一次相加,将结果保存到 c 段中
编写程序如下:
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 8 dup(0) c ends code segment start: mov ax,a mov ds,ax mov bx,0 mov cx,8 s: mov ax,ds:[bx] add ax,ds:[bx+16] mov ds:[bx+32],ax inc bx loop s mov ah,4ch int 21h code ends end start
结果如下:
Task8 编写程序,用push指令将 a 段中的钱 8 个字型数据,逆序存储到 b 段中
编写程序如下:
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,a mov ds,ax mov bx,0 mov cx,8 s1: push ds:[bx] add bx,2 loop s1 mov ax,b mov ds,ax mov bx,0 mov cx,8 s2: pop ds:[bx] add bx,2 loop s2 mov ah,4ch int 21h code ends end start
运行结果如下: