标签:教材 strong 字节 lin 执行文件 name 打印 deb loop
使用任意文本编辑器,录入汇编源程序task1.asm。
assume cs:code, ds:data
data segment
db ‘Nuist‘
db 5 dup(2)
;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
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指令的功能。
1、使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。
观察到屏幕左下角打印出“NUIST”五个绿色字母
2、使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。
先反汇编找到line27所在位置
再使用g命令
观察到屏幕左下角打印出“NUIST”五个绿色字母
3、修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
db 5 dup(2)
--> 改成:
db 2,3,4,5,6
修改后运行结果:
观察到字母的颜色发生了变化
联想之前实验二可知这里的数字表示每个字符的颜色
已知数据段data中定义字节数据如下:
data segments
db 23, 50, 66, 71, 35
data ends
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。
1、编写程序如下:
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 si,0
mov cx,5
s: mov ax,0
mov al,[si]
mov bl,10
div bl
inc bx
add ax,3030h
mov dx,ax
mov ah,2
int 21h
mov dl,dh
int 21h
inc si
loop s
mov ah,4ch
int 21h
code ENDS
END start
2、运行结果:
教材「实验5 编写、调试具有多个段的程序」(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段中的数据不变
即data段中数据仍为:0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
程序执行前:
程序返回前:
观察到data段数据不变
2、程序返回前,CS=076CH, SS=076BH, DS=076AH
3、设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
教材「实验5 编写、调试具有多个段的程序」(2)
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中数据不变,即0123h, 0456h。
2、CS=076CH,SS=076BH,DS=076AH
反汇编
执行到程序返回前
3、设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
4、对于如下定义的段:
name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为?N/16?*16字节。
教材「实验5 编写、调试具有多个段的程序」(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中数据不变,即0123h, 0456h。
2、CS=076AH,SS=076EH,DS=076DH
反汇编
执行到程序返回前
3、设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。
如果将1、2、3题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
答:只有第3题的程序(task5)仍可以正确执行。
前两题程序开始定义的数据段,而第3题定义的是代码段。若不指定程序入口,CPU将从第一个单元开始执行,故只有第3题能正确执行。
教材「实验5 编写、调试具有多个段的程序」(5)
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 si,0
mov cx,8
s: mov al,[si]
add al,[si+10H]
mov es:[si],al
inc si
loop s
mov ah,4ch
int 21h
code ends
end start
调试运行结果:
相加前
相加后
计算结果正确
教材「实验5 编写、调试具有多个段的程序」(6)
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,10H
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
mov ah,4ch
int 21h
code ends
end start
调试运行结果:
成功逆序存储至b段
标签:教材 strong 字节 lin 执行文件 name 打印 deb loop
原文地址:https://www.cnblogs.com/estzzz/p/14032267.html