创建ex1.asm
进行编译链接运行
使用debug工具对程序进行调试
使用d命令查看程序段前缀PSP所占的256个字节
结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编
CX寄存器中值为31,表示程序的长度
使用g命令执行到程序退出执行之前
进行编译链接运行
使用debug工具对程序进行调试
使用u命令对ex2.exe进行精确反汇编
灵活使用t命令、p命令、g命令,对ex2.exe进行调试
修改后重新编译链接运行
结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?
修改后的功能不一样,原来修改8个内存单元,修改后变为修改16个内存单元。
具体实现上,ex1是使用手动制定每个内存单元复制,ex2使用loop循环赋值,并且每次操作两个内存单元。
; ex3.asm
assume cs:code
code segment
mov ax, 0b800H
mov ds, ax
mov bx, 07b8H
mov ax, 0237H
mov cx, 16
s: mov [bx], ax
add bx, 2
loop s
mov ah, 4ch
int 21h
code ends
end
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
必做
源代码:
; ex4.asm
assume cs:code
code segment
mov ax, 0H
mov ds, ax
mov bx, 0200H
mov al, 0H
mov cx, 40H
s: mov [bx], al
add bx, 1
add al, 1
loop s
mov ah, 4ch
int 21h
code ends
end
选做
源代码:
; ex4_2.asm
assume cs:code
code segment
mov ax, 0H
mov ss, ax
mov ax, 240H
mov sp, ax
mov cx, 20H
mov bx, 3F3EH
s: push bx
sub bl, 2
sub bh, 2
loop s
mov ah, 4ch
int 21h
code ends
end
源代码:
; ex5.asm
assume cs:code
code segment
mov ax, cs
mov ds, ax
mov ax, 0020h
mov es, ax
mov bx, 0
mov cx, 18
s: mov al, [bx]
mov es:[bx], al
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
运行结果:
0:200处数据与代码段处相同
第一空是需要将数据段指向代码段所在段位置
第二空是通过mov ax, 4c00h与程序头的内存地址段差值决定的
原文:https://www.cnblogs.com/openseem/p/13931526.html