实验3 多个段的汇编源程序编写与调试
实验任务1
task1.asm:
assume cs:code,ds:data data segment db 'Nuist' db 5 dup(2) 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
从理论上分析line15-25:实现5次循环,将数据段的nuist全部转化为大写,并将它们一次存入对应的辅助段中字的高位。
对task1.asm进行汇编、链接:

运行task1.exe:

使用debug工具对task1.exe进行调试:
使用r命令得到CX的值:

使用u命令进行反汇编:


使用g命令执行到程序返回前:

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果:
db 5 dup(2) --> 改成: db 2,3,4,5,6


使用debug工具对task1.exe进行调试:
使用r命令:

使用u命令进行反汇编:

使用g命令执行到程序返回前:

源代码中data段line4的字节数据的用途是决定了现实的低位字节的颜色。
实验任务2
task2.asm:
assume cs:code,ds:data data segment db 23,50,66,71,35 data ends code segment start: mov ax,data mov ds,ax mov di,0 mov cx,5 s : mov ah,0 mov al,ds:[di] mov bl,10 div bl mov ds:[10+di],al mov ds:[11+di],ah mov ah,2 mov dl,ds:[10+di] add dl,30h int 21h mov ah,2 mov dl,ds:[11+di] add dl,30h int 21h mov ah,2 mov dl," " int 21h inc di loop s mov ax,4c00h int 21h code ends end start
对task2.asm进行汇编、链接:

运行task2.exe:

实验任务3
task3.asm:
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
对task3.asm进行汇编、链接:

1、CPU执行程序,程序返回前,data段中的数据为多少?
23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09

2、CPU执行程序,程序返回前,cs=076C 、ss=076B 、ds=076A 。

3、设程序加载后,code段的段地址为X,则data段的段地址为X-2 ,stack段的段地址为X-1 。
实验任务4
task4.asm:
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
对task4.asm进行汇编、链接:

1、CPU执行程序,程序返回前,data段中的数据为多少?
23 01 56 04

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个字节 。
实验任务5
task5.asm:
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
对task5.asm进行编译、链接:

1、CPU执行程序,程序返回前,data段中的数据为多少?
23 01 56 04

2、CPU执行程序,程序返回前,cs=076A 、ss=076E 、ds=076D 。

3、设程序加载后,code段的段地址为X,则data段的段地址为X+3 ,stack段的段地址为X+4 。
实验任务6
我认为实验任务5/(3)的程序仍然可以正确执行,因为只有它是在内存中可执行代码在最前面。
实验任务7
task7.asm:
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 c1 segment db 8 dup(0) c1 ends code segment start: mov ax,a mov ds,ax mov ax,c1 mov es,ax mov bx,0 mov si,0 mov cx,8 s: mov ah,0 mov al,[bx] add ax,[bx+16] mov es:[si],ax add si,1 add bx,1 loop s mov ax,4c00h int 21h code ends end start
对task7.asm进行汇编、链接:

使用r命令:

使用u命令进行反汇编:

使用g命令执行到程序返回前:

使用d命令查看逻辑段c1:

实验任务8
task8.asm:
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 ax,b mov ss,ax mov sp,16 mov cx,8 mov bx,0 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
对task8.asm进行汇编、链接:

使用r命令:

使用u命令进行反汇编:

使用g命令执行到程序返回前:

使用d命令查看逻辑段的数据:


浙公网安备 33010602011771号