汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写

       汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写

一丶内存寻址模型

  逻辑地址.线程地址.物理地址

了解汇编之前.先了解一下上面这些词的含义;

  逻辑地址: 这个是邮编一起生成的.逻辑地址一般都是 段加段内偏移组成的.每个进程独享.

  线性地址: 由分段管理机制.将逻辑地址转化为线性地址.这个了解即可.学过内核的人看到应该明白.如果没有学过.简单滤过即可(32位下逻辑 = 线性)

  物理地址: 通过分页管理机制(内核中成为PDE PTE等页目录 页表等等)将线性地址转化为物理地址. 这些了解即可.

下图说明了上面三个地址的意思:

  

这张图学过内核的能看明白. 如果没学过.那么了解即可.

二丶实模式分段模型.跟保护模式扁平模型

  如果细说这两个的区别会很多.不过我们了解下即可.

  实模式分段模型.:   

    有20位地址总线

    每个段的大小是64kb

    16个不同的段.

        CS DS寄存器中保存的是段的起始地址.

上面主要就是说. 我怎么寻找逻辑地址.  其实就是段 + 偏移的方式.

  16位下. 有 2^16次方寻址. 也就是64kb. 但是增加了4条地址总线.也就是 2^20次方 = 1MB

  那么为了寻到这1MB的空间. 首先就把1MB空间分成16个不同的段. CS DS存放段的起始地址. 然后加上段内偏移即可寻到.

保护模式扁平模型

  32个地址总线.

引入了GDT LDT等段描述符表

  CS DS不变.

因为32位地址总线可以存储地址了.所以段寄存器就都为0了.但是是保护模式.所以引入了段选择子. (涉及到内核知识了)  这些了解即可.

三丶16位代码编写.

  16位我们要自己分段.自己写代码. 下方代码是一个16位汇编程序.

data segment                ;定义数据段
str db ‘HelloWorld$‘        ;以字节方式在数据段中定义字符串
data ends                   ;数据段结束

code segment                ;定义代码段
assume cs:code ,ds:data     ;将CS寄存器跟代码段相关联.DS寄存器跟数据段相关联

start:                      ;定义标号.代码开始执行位置.
    mov ax,data             ;将数据段给ax寄存器保存
    mov ds,ax               ;将ax给DS寄存器保存.
    lea dx,str              ;求得字符串的地址
    mov ah,9h               ;调用21号功能的9h功能进行打印
    int 21h
    mov ah,4ch              ;调用4ch进行退出
    int 21h
code ends                   ;代码段结尾.
end start                   ;结束位置.必须给标志表示从哪里开始执行

16位汇编是运行在以前的老机器上的.所以我们需要下载两个软件才能进行编译执行.

一个是MASM5.0 一个是  DOSbox 0.74  下方附上链接

链接:https://pan.baidu.com/s/1O0-mUWv9fgvkqA_An1W0yA 密码:xzjd

使用DOSbox0.74 的步骤

1.解压MASM5.0到你的盘符
2.安装DosBox0.74
3.打开DosBox0.74
4.在DosBox中使用指令切换到你的MASM盘符
例如:    mount d: d:\MASM5.0
5.切换盘符 D:
6.DIR命令观看是否设置成功
7.编译你写的16位汇编
    masm a.asm
8.编译之后会生成obj.我们还需要进行连接
    link a.obj
9.连接之后就生成了a.exe了我们可以直接运行
    a.exe
10.如果调试则使用 debug a.exe进行调试.

使用masm编译的时候.确保asm放在masm目录下面.

结果演示.

四丶32位汇编代码编写.

  32位汇编代码编写.可以使用RadAsm编写.博客中已经写过.我们主要讲解一下在VC中的写法.

在VC中32位下.可以支持内联汇编的.

例如:

  

__asm
{
     push eax
     push ebx
     pop eax
     pop ebx
}

五丶64位汇编写法  

  64位汇编已经不支持我们使用内联汇编了.所以我们必须要添加ASM去编写.

这有一篇好的文章:  https://www.mallocfree.com/basic/asm/asm-4-x64.htm

原文地址:https://www.cnblogs.com/iBinary/p/9606649.html

时间: 2024-10-03 07:28:48

汇编知识扫盲之16位汇编跟32位汇编的保护模式以及汇编代码编写的相关文章

64位gcc编译32位汇编

由于使用as和ld来编译链接汇编程序,在使用C库的时候比较麻烦,需要输入比较多的指令,所以使用gcc进行编译链接.由于书中内容是32位汇编程序,但是机器使用的是64位操作系统,自带的gcc也是64位的,导致编译生成的程序,一运行就会Segment Fault.经过查询之后,发现是调用printf函数的时候,总是报错,查询之后发现是32位汇编和64位汇编在调用C库的时候,32位使用pushl指令来压栈传递参数,而64位汇编是使用通用寄存器来传递参数的. 32汇编的代码是: 1 .code32 2

存储器 间接 寻址 试验 立即寻址 ;直接寻址 ;间接寻址 16位指针间接寻址 32位指针间接寻址

存储器间接寻址 S7-300/400 有3种寻址方式 立即寻址 直接寻址 间接寻址 立即寻址和直接寻址用的最多. 间接寻址中用的最多的是存储器间接寻址. (一 )立即寻址举例 立即寻址 :立即寻址的操作数直接在指令中 L -35 //将16位整数装载到累加器1的低字 L L#5 //将32位双整数装载到累加器1 L W#16#3E4F //将16进制常数字装载到累加器1的低字. L 25.38 //将32位浮点数常数装载到累加器1 L S5T#2S //将16位S5T定时器常数装载到累加器1的低

32位程序下调用64位函数——进程32位模式与64位模式切换

之前学习的32位进程中调用64位进程函数的知识整理一下,也就是32位模式与64位模式之间的切换. 相关博客:http://www.cnblogs.com/lanrenxinxin/p/4821152.html 这个博客中提到了github上的开源库,我在另一份开源项目中也看到了个库,可以切换32位至64位. 如果对这个功能具体实现比较感兴趣的朋友可以看看下面的内容. 我阅读了源码并进行了注释,算是对这个具体方法的分析和学习. 关键: 1.在x64下的进程,不管是32位或者是64位,实际上都映射了

64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考

最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的遇到了64位进程需要调用32位dll的问题.由于有一些32位dll没有源代码,无法重新编译为64位dll,所以只能想办法解决64位进程调用32位dll问题,这个问题让我很是挠头了几天. 相关资料:微软公司的官方网站针对这个问题描述如下:在64位的windows系统中,一个64位进程不能加载一个32位

24位颜色和32位颜色对比

1.24位颜色和32位颜色对比 RGB  :24位颜色,(R,G,B)         3个16进制数 ARGB:32位颜色,(A,R,G,B)   4个16进制数 A值:不透明度 R值:红色比例 G值:绿色比例 B值:蓝色比例 ps: Android开发中最好使用32位代码 2.Android开发中如何使控件背景透明 android:background="#01000000" #01000000”中“01”表示的是背景透明的程度,这个值只能设置01及以上的值,不能设置为00,及不能

64位ubuntu下装32位软件

本帖最后由 wuy069 于 2013-10-25 12:28 编辑很多软件只有32位的,有的依赖32位库还挺严重的:从ubuntu 13.10已经废弃了ia32-libs,但可以使用多架构,安装软件或包apt-get install program:i386.有的还是觉得烦,想一步到位安装所有的以前的ia32-libs,可以使用以下方法: sudo -i cd /etc/apt/sources.list.d echo "deb http://archive.ubuntu.com/ubuntu/

64位主机64位oracle下装32位客户端ODAC(NFPACS版)

64位主机64位oracle下装32位客户端ODAC(NFPACS版) by dd 1.下载Oracle Data Access Components(ODAC) Xcopy的两个版本: x86:(我们用到的是这个ODAC1120320Xcopy_32bit)http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html x64:http://www.oracle.com/technetwork/dat

怎样打开64位 Ubuntu 的32位支持功能?

大多数使用基于 Ubuntu/Debian 的发行版的人都更倾向于选择64位的系统,对吧?这是因为64位的系统能够充分发挥你的硬件的全部性能, 它使你能够在更紧张的内存资源下使用更复杂的软件,而且是真的快速使用,不必每次做一件小事都要等上许久.现在,32位仅有一个优点,那就是没有太多兼容 性上的问题.每次JAVA更新都很让人很困惑,因为大多数用户都不能获得需要的库文件.在过去,很多别的软件和驱动也没有64位版. 因此, 如果现在你有一个64位架构的系统,而且你可以使用之前的支持:包括驱动.64位

64位ubuntu编译32位程序

64位ubuntu编译32位程序 如上使用C4这个小工具时遇到来需要仿真32位系统的需求,发现使用-m32参数后,编译提示错误,如下: /usr/bin/ld: 未知的仿真模式: 32 支持的仿真: elf_x86_64 elf32_x86_64 elf_i386 i386linux elf_l1om elf_k1om i386pep i386pe collect2: error: ld returned 1 exit status 首先要打开64位系统对32位的支持 第一步:确认64为架构的内