Day1:x86汇编框架、数据类型、基本运算、位运算

vs2022汇编环境、x86汇编框架、数据类型、基本运算、位运算

在vs2022中编写汇编代码

  • 新建一个空项目

  • 在工具栏的“工具”选项中选择“获取工具和功能”,在“使用C++的桌面开发”中勾选“Windows 10 SDK”以及“MSVC v142 -VS 2015 C++生成工具”,然后安装这些新勾选的选项,更新VS2022

    勾选选项

  • 右键新建的空项目,选择最下方的“属性”,在弹出来的页面中选择“常规”,然后将平台版本改成windows10,可能需要改也可能不需要

    属性页

  • 右键新建的空项目,选择“生成依赖性”,然后是“生成自定义”,在界面中选择masm

    生成自定义

  • 然后就可以新建一个.asm源文件了。新建完成后,右键源文件选择“属性”,然后在“常规”里检查项类型是否为“Microsoft Macro Assembler”

    常规

  • 以上是针对报错进行的尝试修正总结,可能有多余或者不足之处

x86汇编框架(MASM)

  • xxxxxxxxxx2 1int num[2][2] = { {1,2},{3,4} };2printf(“%d,%d,%d,%d”, num[0][0], num[0][1], num[1][0], num[1][1]);c

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    ;预处理
    .586
    .model flat,stdcall

    ;包含的链接库
    includelib ucrt.lib
    includelib legacy_stdio_definitions.lib
    includelib kernel32.lib
    includelib user32.lib

    ;外部函数声明
    extern printf:proc

    ;数据段
    .data
    szHello db 'HelloWorld!',0

    ;代码段
    .code
    ;函数声明
    main proc
    lea eax,szHello
    push eax
    call printf
    add esp,4
    main endp
    end
    • 重点如下:

    • 链接库声明

      1
      includelib NameOfLib.lib
    • 不同的段

      1
      2
      .NameOfSection
      ;段所包含的数据
    • 函数格式

      1
      2
      3
      functionName proc 参数名1:参数类型,参数名2:参数类型...
      ;汇编代码
      functionName endp
    • 在一个asm文件末尾,需要

      1
      2
      end			;用于无入口点,即非可执行文件,不需要主函数时
      end main ;用于可执行文件,必须指定入口点(如main函数)时

数据类型

类型名称 简写 对应类型 占用字节数
BYTE db char 1
WORD dw short 2
DWORD dd int 4
QWORD dq long long 8

基本运算

  • 数据传送指令

    1
    2
    3
    4
    mov dest,src		;dest=src

    ;eax=1示例
    mov eax,1
  • 地址传送指令

    1
    2
    3
    4
    lea dest,[addr]		;dest=addr

    ;eax=77E75F38示例
    lea eax,77E75F38
  • 加法

    1
    2
    3
    4
    5
    add dest,src	;dest=dest+src

    ;1+1=2示例,最后eax里为2
    mov eax,1
    add eax,1
  • 自增

    1
    2
    3
    4
    inc dest		;dest=dest+1

    ;eax++示例
    inc eax
  • 减法

    1
    2
    3
    4
    5
    sub dest,src	;dest=dest-src

    ;6-2=4示例,最后eax里为4
    mov eax,6
    sub eax,2
  • 自减

    1
    2
    3
    4
    dec dest		;dest=dest-1

    ;eax--示例
    dec eax
  • 乘法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ;分为mul(无符号)和imul(有符号)
    ;乘法结果存放在edx和eax中(edx:eax),低位eax,高位edx。未指定时,eax默认作为一个因数
    mul src ;edx:eax=eax*src
    imul src ;edx:eax=eax*src
    imul dest,src ;dest=dest*src
    imul dest,src,imm ;dest=src*imm

    ;4*2=8示例,eax*ebx
    mov eax,4
    mov ebx,2
    mul ebx
  • 除法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ;分为div(无符号)和idiv(有符号)
    ;被除数放在edx:eax中,除数任意,商存放在eax中,余数存放在edx中
    div src ;edx:eax%src=eax...edx
    idiv src ;edx:eax%src=eax...edx

    ;101%2...1示例
    mov eax,101
    mov edx,0
    mov ebx,2
    div ebx

位运算

  • 1
    2
    3
    4
    5
    6
    and dest,src		;dest=dest & src

    ;1&2=0示例
    mov eax,1
    mov ebx,2
    and eax,ebx
  • 1
    2
    3
    4
    5
    6
    or dest,src			;dest=dest | src

    ;1|2=3示例
    mov eax,1
    mov ebx,2
    or eax,ebx
  • 取反

    1
    2
    3
    4
    5
    not dest			;dest=~dest

    ;not 00000001=11111110示例
    mov eax,1
    not eax
  • 异或

    1
    2
    3
    4
    5
    6
    xor dest,src		;dest=dest^src

    ;1^2=3示例
    mov eax,1
    mov ebx,2
    xor eax,ebx
  • 左移,右移

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ;左移
    shl dest,count ;dest=dest<<count

    ;1<<3=8示例
    mov eax,1
    mov cl,3
    shl eax,cl

    ;右移
    shr dest,count ;dest=dest>>count

    ;8>>3=1示例
    mov eax,8
    mov cl,3
    shr eax,cl

Day1:x86汇编框架、数据类型、基本运算、位运算

https://sydzi.github.io/2025/07/05/Day1-x86汇编框架/

作者

SydzI

发布于

2025-07-05

更新于

2025-10-05

许可协议

评论