网站首页 | 网页制作 | 网络编程 | 图形图象 | 冲浪宝典 | 操作系统 | 软件教学 | 网络安全 | 认证考试 | 下载中心 | 游戏下载
| 网络安全首页 | 安全在线 | 病毒防治 | 黑客攻防 | 漏洞研究 | 黑客编程 | 破解手记 |
您现在的位置: 超人气学院 >> 网络安全 >> 破解手记 >> 文章正文 用户登录 新用户注册
简明x86汇编语言教程(4)           
简明x86汇编语言教程(4)
作者:未知 文章来源:网络收集 点击数: 更新时间:2006-3-29 15:50:02



第三章 操作内存
在前面的章节中,我们已经了解了寄存器的基本使用方法。而正如结尾提到的那样,仅仅使用寄存器做一点运算是没有什么太大意义的,毕竟它们不能保存太多的数据,因此,对编程人员而言,他肯定迫切地希望访问内存,以保存更多的数据。

我将分别介绍如何在保护模式和实模式操作内存,然而在此之前,我们先熟悉一下这两种模式中内存的结构。

3.1 实模式
事实上,在实模式中,内存比保护模式中的结构更令人困惑。内存被分割成段,并且,操作内存时,需要指定段和偏移量。不过,理解这些概念是非常容易的事情。请看下面的图:



段-寄存器这种格局是早期硬件电路限制留下的一个伤疤。地址总线在当时有20-bit。

然而20-bit的地址不能放到16-bit的寄存器里,这意味着有4-bit必须放到别的地方。因此,为了访问所有的内存,必须使用两个16-bit寄存器。

这一设计上的折衷方案导致了今天的段-偏移量格局。最初的设计中,其中一个寄存器只有4-bit有效,然而为了简化程序,两个寄存器都是16-bit有效,并在执行时求出加权和来标识20-bit地址。

偏移量是16-bit的,因此,一个段是64KB。下面的图可以帮助你理解20-bit地址是如何形成的:



段-偏移量标识的地址通常记做 段:偏移量 的形式。

由于这样的结构,一个内存有多个对应的地址。例如,0000:0010和0001:0000指的是同一内存地址。又如,

0000:1234 = 0123:0004 = 0120:0034 = 0100:0234
0001:1234 = 0124:0004 = 0120:0044 = 0100:0244

作为负面影响之一,在段上加1相当于在偏移量上加16,而不是一个“全新”的段。反之,在偏移量上加16也和在段上加1等价。某些时候,据此认为段的“粒度”是16字节。

练习题
尝试一下将下面的地址转化为20bit的地址:

2EA8:D678 26CF:8D5F 453A:CFAD 2933:31A6 5924:DCCF
694E:175A 2B3C:D218 728F:6578 68E1:A7DC 57EC:AEEA

稍高一些的要求是,写一个程序将段为AX、偏移量为BX的地址转换为20bit的地址,并保存于EAX中。

[上面习题的答案]

我们现在可以写一个真正的程序了。

经典程序:Hello, world

;;; 应该得到一个29字节的.com文件

.MODEL TINY
.CODE

CR equ 13
LF equ 10
TERMINATOR equ '$'

ORG 100h

Main PROC
mov dx,offset sMessage
mov ah,9
int 21h
mov ax,4c00
int 21h
Main ENDP

sMessage: DB 'Hello, World!'
DB CR,LF,TERMINATOR

END Main

; .COM文件的内存模型是‘TINY’
; 代码段开始

; 回车
; 换行
; DOS字符串结束符

; 代码起始地址为CS:0100h


; 令DS:DX指向Message
; int 21h(DOS中断)功能9 -
; 显示字符串到标准输出设备
; int 21h功能4ch -
; 终止程序并返回AL的错误代码
 
 

; 程序结束的同时指定入口点为Main


那么,我们需要解释很多东西。

首先,作为汇编语言的抽象,C语言拥有“指针”这个数据类型。在汇编语言中,几乎所有对内存的操作都是由对给定地址的内存进行访问来完成的。这样,在汇编语言中,绝大多数操作都要和指针产生或多或少的联系。

这里我想强调的是,由于这一特性,汇编语言中同样会出现C程序中常见的缓冲区溢出问题。如果你正在设计一个与安全有关的系统,那么最好是仔细检查你用到的每一个串,例

[1] [2] [3] [4] [5] 下一页

[ 收藏此页到: 天天|和讯|博采|ViVi|狐摘|我摘|天极 ] 文章录入:kinda    责任编辑:kinda 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    专 题 栏 目
    最 新 热 门
     Softice使用指南---配[2610]
     中文编辑排版专家—Dr[2442]
     一个破解注册码的例子[1436]
     C语言学习系统v3.0破解[1413]
     获得键盘扫描码[1243]
     破解ComposerforRingT[1082]
     自动脱壳之ProcDump应[990]
     流光4.5完全破解[978]
     VisualBasic程序之Sma[978]
     PE文件结构剖析[891]
    相 关 文 章
    简明x86汇编语言教程(1)
    简明x86汇编语言教程(2)
    简明x86汇编语言教程(3)
    简明x86汇编语言教程(5)
    UNF && pr1 present: Writ
    网页制作简明教程(一)
    如何利用格式化溢出漏洞,
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)