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

Posted 不会写代码的丝丽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MASM 32位汇编 32与16汇编区别相关的知识,希望对你有一定的参考价值。

前言

首先下载工具包

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

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

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

编译

//编译 /coff表示编译成32 也就是PE结构
ml /c /coff xxx.asm

//链接 /subsystem:windows
link /subsystem:console  xxx.asm

基础语法

MSDN相关文档

.386 ;指定指令集
.model flat,stdcall ;指定一些内存指定内存模式 和调用约定https://docs.microsoft.com/en-us/cpp/assembler/masm/dot-model?view=msvc-160

option casemap:NONE ;一些编译选项这里casemap表示控制大小写,NONE指示保持大小写敏感


ENTRY:

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位的寻址方式,还多了一个比例因为寻址,叫做比例因为寻址。
简而言之就是乘上一个数字去寻址

  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

 ;1010 0000 最高位是1
    mov cl,0a0h
    ;被认定为负数
    movsx eax,cl
    movsx ebx,cl


    ;0100 1110 最高位是0
    mov ch,78h
    ;被认定Wie正数
    movsx eax,ch
    movsx ebx,ch

movzx

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

   ;1010 0000 最高位是1
    mov cl,0a0h
    ;被认定为负数
    movzx eax,cl
    movzx ebx,cl


    ;0100 1110 最高位是0
    mov ch,78h
    ;被认定Wie正数
    movzx eax,ch
    movzx ebx,ch


弹出窗口Demo

下面的代码弹出一个窗口

.386
.model flat,stdcall
option casemap:NONE

include windows.inc
include user32.inc
include kernel32.inc


includelib user32.lib
includelib kernel32.lib


.data
    g_szText db "hello world",0
    g_szTitle db "Title",0
.data
    g_sz0 db 11h,22h,33h,44h
.data?
    g_dw dw ?

.const
    g_sz1 db "test test",0
.code


START:
    invoke MessageBoxA,NULL,offset g_szText,offset g_szTitle,MB_OK
    invoke ExitProcess,0

end START

以上是关于MASM 32位汇编 32与16汇编区别的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言16位环境搭建(Windows 7 32位)

用sublime3编写运行16位汇编程序_详细教程

使用Visual Studio 2019--调试汇编代码

我用的是win7 32位系统,使用汇编语言编写程序的时候,输入输出字符串的汇编程序可以顺利执行

masm32基本配置与写出第一个汇编程序

32 位 MASM 模式与 64 位有何不同?