MASM 32位汇编 32与16汇编区别

浅浅的花香味﹌ 2022-09-16 08:52 430阅读 0赞

前言

首先下载工具包

安装完成后配置如下3个环境变量

lib :C:\masm32\lib
include:C:\masm32\include
path:C:\masm32\bin

C:\masm32是笔者的安装目录

编译

  1. //编译 /coff表示编译成32 也就是PE结构
  2. ml /c /coff xxx.asm
  3. //链接 /subsystem:windows
  4. link /subsystem:console xxx.asm

基础语法

MSDN相关文档

  1. .386 ;指定指令集
  2. .model flat,stdcall ;指定一些内存指定内存模式 和调用约定https://docs.microsoft.com/en-us/cpp/assembler/masm/dot-model?view=msvc-160
  3. option casemap:NONE ;一些编译选项这里casemap表示控制大小写,NONE指示保持大小写敏感
  4. ENTRY:
  5. end ENTRY ;设置入口点

分段

相对16位汇编,32位汇编汇编已经没有分段了(地址线刚好满足4g寻址要求),但可以根据内存属性来划分,称为节(section),内存区或者内存块。









































可读 可写 可执行 备注
.DATA × 初始化的全局变量
.CONST × × 只读数据局
.DATA? × 未初始化的全局变量
.CODE × 代码

寄存器

计算机8位、16位、32位通用寄存器有什么区别?
X86 汇编/X86 架构

相对16位寄存器,32位寄存器添加了前缀Exx用于区分,但是任然可以使用16位的语法操作。

在这里插入图片描述

段寄存

器依然是16位共有6


































简称 概念
SS 栈段
CS 代码段
DS 数据段
ES 扩展段(E 代办Extra)
FS 扩展段(F在E的后面所以你懂的)
GS 扩展段(G在F的后面所以你懂的)

寻址

除了16位的寻址方式,还多了一个比例因为寻址,叫做比例因为寻址。
简而言之就是乘上一个数字去寻址

  1. mov dword ptr [ecx+eax*2],05566h

指令补充

x86相关的指令表格

x86下有32168位的寄存器使用规范,但是如果我们想将8位的寄存器数值赋值给32位的是可以的吗?如果直接通过mov是不可以的,但是提供了movsxmovzx来帮助我们实现。

movsx

movsx 提供了有符号的扩展移动
举个例子一个8位的数字0a0h移动到32位的寄存器中
0a0h对应的二进制位1010 0000最告位是1,因此移动到32位后也是一个负数。

下面是一个小Demo

  1. ;1010 0000 最高位是1
  2. mov cl,0a0h
  3. ;被认定为负数
  4. movsx eax,cl
  5. movsx ebx,cl
  6. ;0100 1110 最高位是0
  7. mov ch,78h
  8. ;被认定Wie正数
  9. movsx eax,ch
  10. movsx ebx,ch

在这里插入图片描述

在这里插入图片描述

movzx

movsx 提供了无符号的扩展移动,不过多少位数字移动都是高位补0

  1. ;1010 0000 最高位是1
  2. mov cl,0a0h
  3. ;被认定为负数
  4. movzx eax,cl
  5. movzx ebx,cl
  6. ;0100 1110 最高位是0
  7. mov ch,78h
  8. ;被认定Wie正数
  9. movzx eax,ch
  10. movzx ebx,ch

在这里插入图片描述
在这里插入图片描述

弹出窗口Demo

下面的代码弹出一个窗口

  1. .386
  2. .model flat,stdcall
  3. option casemap:NONE
  4. include windows.inc
  5. include user32.inc
  6. include kernel32.inc
  7. includelib user32.lib
  8. includelib kernel32.lib
  9. .data
  10. g_szText db "hello world",0
  11. g_szTitle db "Title",0
  12. .data
  13. g_sz0 db 11h,22h,33h,44h
  14. .data?
  15. g_dw dw ?
  16. .const
  17. g_sz1 db "test test",0
  18. .code
  19. START:
  20. invoke MessageBoxA,NULL,offset g_szText,offset g_szTitle,MB_OK
  21. invoke ExitProcess,0
  22. end START

发表评论

表情:
评论列表 (有 0 条评论,430人围观)

还没有评论,来说两句吧...

相关阅读

    相关 汇编16

    寄存器 段寄存器 代码段寄存器CS(Code Segment) 存放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中