实验3 多个段的汇编源程序编写与调试
Posted yingzi-yrr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验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
进行汇编链接。得到运行结果:
使用debug调试:
反汇编 u 0 3a
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
db 5 dup(2) --> 改成: db 2,3,4,5,6
进行debug
从理论上分析15-25行:实现五次循环,初始化数据段偏移地址为0,初始化辅助段的偏移地址为0f00。将数据段的nuist全部化成大写,并将它们存入辅助段中字的低位。将数据段的后面五个字节存入依次存入对应辅助段中字的高位。
根据实验结果猜测Line4中的数据存入辅助段中字的高位,决定了显示了的低位字节的颜色。
实验任务二
源代码:
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 cx,5 mov si,0 s: mov ah,0 mov al,[si] add si,1 mov bl,10 div bl add al,48 add ah,48 mov dl,al mov dh,ah mov ah,2 mov dl,dl int 21h mov ah,2 mov dl,dh int 21h loop s mov ah,4ch int 21h code ends end start
结果:
实验任务三
源代码:
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 87 09
2、CPU执行程序,程序返回前,cs=076c ,ss=076b ,ds=076a 。
3、设程序加载后,code段的段地址为X,则data的段地址为X-2,stack段的段地址为X-1。
实验任务四
源代码:
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
2、CPU执行程序,程序返回前,cs=076c ,ss=076b ,ds=076a 。
3、设程序加载后,code段的段地址为X,则data的段地址为X-2,stack段的段地址为X-1。
4、如果段中的数据占N个字节,则程序加载后,该段的实际占有空间为:(16)的INT[log16N]次方。
实验任务五
源代码:
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
2、CPU执行程序,程序返回前,cs=076a ,ss=076e ,ds=076d 。
3、设程序加载后,code段的段地址为X,则data的段地址为X+3,stack段的段地址为X+4。
实验任务六
我认为(3)(即实验任务五)的程序仍能够正确执行,因为该程序段的程序入口start是在程序段开始位置,所以执行时仍是从入口位置开始执行。
实验任务七
源代码:
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
结果检验:
实验任务八
源代码:
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
结果检验:
以上是关于实验3 多个段的汇编源程序编写与调试的主要内容,如果未能解决你的问题,请参考以下文章