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:
assume cs:code, ds:data data segment db 23, 50, 66, 71, 35 db 10 dup(0) data ends code segment start: mov ax, data mov ds, ax mov cx,5 mov si,0 s: mov ah,0 mov al, ds:[si] mov bl, 10 div bl mov ds:[si+5],al mov ds:[si+6],ah mov ah, 2 mov dl,ds:[si+5] add dl, 30h int 21h mov ah, 2 mov dl, ds:[si+6] add dl, 30h int 21h inc si mov ah, 2 mov dl, 32 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
①cpu执行程序返回前,data段中的数据为多少:data段不变.
②cpu执行程序返回前,cs=04B0h,ss=04AF,ds=04AEh。
③设程序加载后,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
①cpu执行程序返回前,data段中的数据为多少:data段不变
②cpu执行程序返回前,cs=04B0h,ss=04AFh,ds=04AEh。
③设程序加载后,code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1。
④观察发现该实验与上一个实验分配的字节数一样,说明系统仍然分配了20h个字节空间。所以推测得到若段中的数据不足16个字节的倍数,系统会自动扩到16个字节为单位大的数据。 所以书上应该填:((N+15)/16)*16。
任务五:
源代码:
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
①cpu执行程序返回前,data段中的数据为多少:data段不变。
②cpu执行程序返回前,cs=04AEh,ss=04B2h,ds=04B1h。
③设程序加载后,code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4。
任务六:
答:第三个程序可以正确执行,前面俩个程序不能直接执行指令,而第三个开头是代码即汇编指令段,可以正常执行。
任务七:
源代码:
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 ax,c mov es,ax mov bx,0 mov cx,8 s: mov ax,0 mov al,ds:[bx] add al,ds:[bx+16] mov es:[bx],al inc bx loop s mov ax,4c00h int 21 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,b mov ss,ax mov sp,16 mov ax,a mov ds,ax mov bx,0 s: push ds:[bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
五、实验总结
1)掌握了除法指令div
2)int 21h中的2号子功能: 可以输出单个字符
1 mov ah, 2 2 mov dl, ×× ; ××是待输出的字符,或其ASCⅡ码值 3 int 21h
3)深知了ASCII码的应用
原文:https://www.cnblogs.com/yzh-privateBlog/p/14045110.html