登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

明月凉

再不记录,就忘了

 
 
 

日志

 
 

汇编—王爽_1  

2011-09-03 15:57:39|  分类: 计算机 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

和王爽教材同步的。

command,然后debug,然后 -r,查看一下CUP的几个寄存器先。

汇编Debug - 某丶丶人 - 某丶丶人

可以看到各个段寄存器都等于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个内存单元。

汇编Debug - 某丶丶人 - 某丶丶人
上面:10000H内容是2D 
 74-65中间的小杠是为了方便查看用的。
右边的符号是内存的数据对应的ASCII字符,当然有的可能没有对应的字符,就用...一个点儿来表示。
直接只输入一个-d,可以发现Debug默认的内存是在0c91:0100。
-d 段地址:起始偏移地址  结尾偏移地址  可以查看这之间的内存,如-d 1000:0 9。

E命令可以改写内存中的值:

-e 1000:0 0  1 2 3 4 5 6 7 8 9 将修改1000:0开始的10个单元的内容。

可以写入字符,字符串。

所以,可以直接向内存写入机器码,然后去执行写入的机器码。

用E命令写入,U命令查看,T命令执行。

U命令查看的是机器码对应的汇编指令。

汇编Debug - 某丶丶人 - 某丶丶人
T命令执行的是CS:IP指向的内容,所以我们得先把CS:IP指向整成我们的1000:0。这个好说,r命令就可以。
然后再用 t  执行我们指向的这一句。
汇编Debug - 某丶丶人 - 某丶丶人
这一执行就让AX=0001,IP的值加了3,CS:IP指向下一条要执行的语句,我们再用T它就能执行鸟。
 
但是,
 直接写机器码是很傻X的,多难记啊,那东西。
用A命令是可以直接把汇编指令写到内存里去的。
汇编Debug - 某丶丶人 - 某丶丶人
 虽然写的是汇编语句,但是存却是存的机器码。
A还是很牛的。
 
 

 编写汇编程序

伪指令:

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里面。

汇编Debug - 某丶丶人 - 某丶丶人

 为了不至于输入一串的路径,我直接把.asm文件给入到当前目录下。

输入名字后,Enter键。

然后还得输入.obj文件的名字,当然可以用默认的。

然后又要你输入列表文件的名字,这是编译过程中的中间结果,可以不要。

然后又要你输入交叉引用文件的名字,同样可以不要。

汇编Debug - 某丶丶人 - 某丶丶人
可以看到没有错误什么的。
这时目录下也多了一个叫1.obj文件。
 
连接:
就在上面的D:MASM下运行link.exe。
然后得输入.obj的名字。我们这里是1
然后还要你输入映像文件名字,这是中间结果,可以不要。
然后还要你输入库文件的名字,我们这里没有调用库,也跳过。
汇编Debug - 某丶丶人 - 某丶丶人
 可以看到一个warning“没有栈段”,不理它。
这时目录下就有一个叫1.exe的可执行文件了。
 
上面的编译和连接中间都有可以跳过的步数,我们用加分号的方法可以直接生成OBJ和EXE。
 
上面的步骤完成后,输入1,就是运行1.exe了。
 
用Debug来跟踪程序的运行:
输入debug 1.exe,1.exe装入内存,CS:IP初始化。
看一下各个寄存器:-r。
cx放的是程序的长度。
但是,这个可执行程序装入内存的哪儿是操作系统去找的一个空间足够的地方。
ds放着这个地方的段地址,偏移为0,这个区域的前256个字节放PSP,所以我还是能算出程序放在哪儿位置的。
就是DS:10。
 
然后可U查看一下,再T一步一步执行,但是到int 21h的时候得用P命令。
 
 

 

 

  评论这张
 
阅读(217)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018