和王爽教材同步的。
command,然后debug,然后 -r,查看一下CUP的几个寄存器先。
可以看到各个段寄存器都等于0C91。
IP=0100,所以CS:IP是0C91:0100,CUP将要读的是这里的指令,这个指令的机器码是46,汇编代码是INC SI。
SP=FFEE,所以默认的栈顶在0C91:FFEE处。
R 命令可以查看,改变CUP寄存器的值:
在这个黑框框里是可以各种玩儿计算机的,-r 寄存器,然后在:后面改成你要改的值,然后再-r进入,就会看到修改成功了。
改变CS和IP的值可以看到不同位置那个各种的指令和机器码。
D命令可以查看内存中的值:
-d 1000:0可以看到内存10000H处的值,当然它不会只列出一个,会列出以10000H开始到10070H的128个内存单元。
E命令可以改写内存中的值:
-e 1000:0 0 1 2 3 4 5 6 7 8 9 将修改1000:0开始的10个单元的内容。
可以写入字符,字符串。
所以,可以直接向内存写入机器码,然后去执行写入的机器码。
用E命令写入,U命令查看,T命令执行。
U命令查看的是机器码对应的汇编指令。
编写汇编程序
伪指令:
1、segment:
XX segment
...
...
xx ends
是定义一个段,XX是段名。
这样,一个大程序就能被分成好些段,这些段有不同的功用。
2、end:end告诉编译器在编译时在哪里结束。
3、assume:它能将段寄存器和一个段关联起来。
一个完整的程序如下:
assume cs:codesg
codesg segment
start: mov ax,0123h
mov bx,0456h
add ax,bx
add ax,ax
mov ax,4c00h--------程序返回用的
int 21h---------程序返回用的
codesg ends
end start
在DOS下,Edit-----在出来的蓝框里输入上面这个程序-----保存。
然后就要用到masm汇编编译器了,去网上下载一个先。
装到了D:\masm下。
编译这个程序:
在DOS 下,运行masm.exe,它在D:\masm里面。
为了不至于输入一串的路径,我直接把.asm文件给入到当前目录下。
输入名字后,Enter键。
然后还得输入.obj文件的名字,当然可以用默认的。
然后又要你输入列表文件的名字,这是编译过程中的中间结果,可以不要。
然后又要你输入交叉引用文件的名字,同样可以不要。
评论