当前位置: 首页 > news >正文

32位x86汇编语言程序代码

学习之前建议:如果你是临近考试了,千万千万要先学习每一条常用的指令,然后熟记框架,最后我觉得多练习,不要左边千问,右边代码,然后的话就是注意细节

目录

一、前言

二、核心原理讲解

三、怎么配置汇编语言编写环境

四、注意事项

五、最简单的测试代码

模块一:顺序程序设计(基础运算、符号扩展)

1.无符号扩展

2.有符号数混合运算(符号扩展)

3. 综合四则运算例题

模块二:分支程序设计(条件判断、逻辑短路)

1. 逻辑或 || 短路规则(前真后不执行)

2. 逻辑与 && 规则(前假后不执行)

模块三:分段函数多区间判断(必考大题)

分段题型1:双变量区间判断

分段题型2:正负区间逻辑判断

模块四:循环与排序(Loop、冒泡、选择排序)

2. 选择排序完整代码

模块五:子程序设计(栈传参、stdcall栈平衡)

模块六:地址表查表跳转(多分支最优解法)

模块七:Windows系统API调用(ExitProcess / CopyFile)

1. 标准进程退出(正规结束程序)

2. CopyFile 文件复制API实战

总结指令

搞清db dw dd

本文一次性补齐32位x86汇编必学7大核心知识点,每一章都是一篇独立可直接发布的完整博客,包含:原理讲解、32/64位区别、完整可编译代码、逐行解析、运行结果、常见坑点。

7大知识点清单:

  1. 顺序程序设计(加减乘除、符号扩展、多类型混合运算)

  2. 分支程序设计(条件跳转、逻辑与/或短路运算)

  3. 分段函数判断(多区间多条件复合判断模板)

  4. 循环排序算法(冒泡排序、选择排序、Loop循环机制)

  5. 子程序栈调用(手动栈传参、ret 8 栈平衡、局部变量)

  6. 地址表跳转(查表法、多分支超级精简写法)

  7. Windows系统调用(API调用原理、文件操作、进程退出)

一、前言

寄存器是汇编的核心,所有计算、传参、系统调用都依赖寄存器。很多新手学汇编混淆 16位、32位、64位寄存器,导致代码跑崩、概念混乱。本文专注纯32位 x86 架构,详解 EAX/EBX/ECX/EDX/ESP/EBP 六大核心寄存器,带你彻底区分32位与64位架构差异。我使用的是微软的Visual Studio 2022

二、核心原理讲解

  • EAX:累加器,运算、系统调用功能号专用

  • EBX:基址寄存器,存放内存基地址

  • ECX:计数寄存器,循环次数专用

  • EDX:数据寄存器,乘除运算高位、系统调用传参

  • ESP:栈指针,永远指向栈顶(32位程序核心)

  • EBP:栈基址指针,用于函数栈帧定位

三、怎么配置汇编语言编写环境

打开Visual Studio 2022,创建新项目-->空项目--->点击创建,如果用这个学习过C语言的,那么前面的步骤跟C语言一样

创建好项目,开始配置汇编语言编写环境,右键项目(也就是project9),然后找到生成依赖项

来到这里

勾选倒数第三个

然后找到源文件,右键添加--->新建项,后缀为.asm

然后把上面的x64改为x86

有的还要确认一下项目属性中平台是否为Win32

四、注意事项

如果你没有生成依赖项就点击添加源文件,也会报错

五、最简单的测试代码

.386 ;指定当前程序为 32位 x86 80386架构指令集 .model flat,stdcall ;flat:平坦内存模式,是32位程序标志性特性 option casemap:none ;关闭大小写敏感,也就是在代码中EAX和eax是一样的 .data ;数据块 .code ;代码块 main proc _start:: ;主函数定义与程序入口 push ebp mov ebp,esp ; 标准32位栈帧搭建 xor eax,eax ;寄存器清零指令 pop ebp ret ; 栈帧恢复与函数返回 main endp end _start ;函数结束与程序入口绑定

我最常用的是上面的,还有一种是ExitProcess

Windows汇编中,想要正常终止程序,必须调用系统API:ExitProcess。这个也很重要呀

.386 .model flat,stdcall option casemap:none includelib kernel32.lib ExitProcess proto,dwExitCode:dword .data .code main proc _start:: ; 标准32位栈帧搭建 push ebp mov ebp,esp ; 寄存器清零 xor eax,eax ; Windows 32位系统调用:退出进程 push 0 call ExitProcess ; 此处代码永远不会执行 pop ebp ret main endp end _start

返回0,成功编译,配置没有问题

模块一:顺序程序设计(基础运算、符号扩展)

1.无符号扩展

核心考点:8位/16位/32位混合运算、有符号/无符号扩展、movzx/movsx、加减乘除、进位处理

.386 .model flat,stdcall option casemap:none .data x db 12H y dw 3456H z dd 0aabb1234H ;起始为字母,前面需要加0,编译器才知道这是16进制数 sum dd 0 .code main proc _start:: push ebp mov ebp,esp ; 无符号零扩展:8位→32位、16位→32位 movzx eax,x movzx ebx,y mov ecx,z add eax,ebx ;x+y adc ecx,0 ;adc计算算加法进位 add eax,ecx mov sum,eax xor eax,eax pop ebp ret main endp end _start

解析:无符号扩展必须使用movzx,adc 处理加法进位,保证多字节数据运算精度。

movzx 无符号扩展

8位--->32位

16位--->32位

movsx 有符号扩展

8位--->32位

16位--->32位

2.有符号数混合运算(符号扩展)

.386 .model flat,stdcall option casemap:none .data x db -19H y dw -3453H z dd -0aabb1122H sum dd 0 .code main proc _start:: push ebp mov ebp,esp ; 8位→16位→32位符号扩展 mov al,x cbw cwde ; 16位带符号扩展32位 mov bx,y movsx ebx,bx add eax,ebx add eax,z mov sum,eax xor eax,eax pop ebp ret main endp end _start

考点:有符号数必须movsx/cbw/cwde,防止负数高位补0导致数据错误

3. 综合四则运算例题

计算sum=4a+3b-b/2

.386 .model flat,stdcall option casemap:none .data a db 12 b dw 250 cc dd 1000 result dd 0 .code main proc _start:: push ebp mov ebp,esp ; 4*a movzx eax,a add eax,eax add eax,eax mov ecx,eax ; 3*b movzx eax,b mov ebx,3 mul ebx add ecx,eax ; c / 2 mov eax,cc mov ebx,2 xor edx,edx div ebx sub ecx,eax mov result,ecx pop ebp ret main endp end _start

模块二:分支程序设计(条件判断、逻辑短路)

核心考点:CMP 比较、标志位跳转、|| 逻辑或短路、&& 逻辑与短路、printf 输出

1. 逻辑或 || 短路规则(前真后不执行)

.386 .model flat,stdcall option casemap:none includelib ucrt.lib includelib legacy_stdio_definitions.lib printf proto C :ptr byte, :VARARG ;这些看不懂不用管,是printf实现的必要函数 .data a dd 5 b dd 6 cc dd 7 d dd 8 m dd 2 n dd 2 fm1 db "m=%d n=%d",0ah,0 ;0ah换行符 .code main proc _start:: push ebp mov ebp,esp ; (m=a<b) || (n=c>d) ;或运算前面为真,后面的不用验真 mov eax,a cmp eax,b jl setm1 ;为真直接跳到setm1那里,给m赋值1后直接结束程序 ; 前式为假,才执行后式 mov m,0 mov eax,cc ;为什么这里用cc,因为变量名 c 在 MASM32 里是系统保留关键字 cmp eax,d jg setn1 mov n,0 jmp print setm1: mov m,1 jmp print setn1: mov n,1 print: invoke printf, offset fm1, m, n xor eax,eax pop ebp ret main endp end _start

2. 逻辑与 && 规则(前假后不执行)

.386 .model flat,stdcall option casemap:none includelib ucrt.lib includelib legacy_stdio_definitions.lib printf proto C :ptr byte, :VARARG .data a dd 5 b dd 6 cc dd 7 d dd 8 m dd 2 n dd 2 fm1 db "m=%d n=%d",0ah,0 .code main proc _start:: push ebp mov ebp,esp mov eax,a cmp eax,b jl m_true mov m,0 jmp end_s m_true: mov m,1 mov eax,cc cmp eax,d jg n_true mov n,0 jmp end_s n_true: mov n,1 end_s: invoke printf,offset fm1,m,n xor eax,eax pop ebp ret main endp end _start

模块三:分段函数多区间判断(必考大题)

核心考点:多区间嵌套判断、多条件同时成立、区间互斥跳转

分段题型1:双变量区间判断

.386 .model flat,stdcall option casemap:none .data x dd 5 y dd 4 fxy dd 0 .code main proc _start:: push ebp mov ebp,esp ;x<1 y<1 → -1 mov eax,x cmp eax,1 jge L1 mov eax,y cmp eax,1 jge L1 mov fxy,-1 jmp end_s ;1~5 1~5 → 0 L1: mov eax,x cmp eax,5 jg L2 cmp eax,1 jl L2 mov eax,y cmp eax,5 jg L2 cmp eax,1 jl L2 mov fxy,0 jmp end_s ;>5 >5 →1 L2: mov eax,x cmp eax,5 jle end_s mov eax,y cmp eax,5 jle end_s mov fxy,1 end_s: xor eax,eax pop ebp ret main endp end _start

分段题型2:正负区间逻辑判断

.386 .model flat,stdcall option casemap:none .data x dd 6 y dd 6 fxy dd 0 .code main proc _start:: push ebp mov ebp,esp ;x>0 && y>0 =10 mov eax,x cmp eax,0 jle L1 mov eax,y cmp eax,0 jle L1 mov fxy , 10 jmp end_s ;x<0 && y<0 =-10 L1: mov eax,x cmp eax,0 jge other mov eax,y cmp eax,0 jge other mov fxy,-10 jmp end_s other: mov fxy,0 end_s: xor eax,eax pop ebp ret main endp end _start

模块四:循环与排序(Loop、冒泡、选择排序)

核心考点:ECX循环计数、栈保存外层循环、ESI指针遍历、XCHG交换

.386 .model flat,stdcall .data addr_lab dd 7,8,3,1,2,4,6,9,13,12,18,20 dat_count dd ($-addr_lab)/4 ;这里可以这样理解 $ 为尾指针,addr_lab为初始指针,/4计算排序数组的个数 .code main5 proc _start5:: push ebp mov ebp,esp mov ecx,dat_count outerLoop: push ecx ;压栈,保护外层循环的ecx lea esi,addr_lab innerLoop: mov ebx,[esi] cmp ebx,[esi+4] jle no_swap xchg ebx,[esi+4] xchg ebx,[esi] ;这里直接写两个xchg好记,和上面mov ebx,[esi] ;cmp ebx,[esi+4]对应 no_swap: add esi,4 ;因为我定义的是dd所以是加4,如是db,加1就OK loop innerLoop pop ecx ;上面压栈了,这里出栈 loop outerLoop xor eax,eax pop ebp ret main5 endp end _start5

2. 选择排序完整代码

.386 .model flat,stdcall option casemap:none .data array dd 12,3,4,2,7,8,20,9,5,30 count dd ($ - array)/4 .code main proc _start:: push ebp mov ebp,esp mov ecx,count dec ecx outer: push ecx lea esi,array mov edi,esi inner: mov eax,[esi] cmp eax,[edi] jge not_min mov edi,esi not_min: add esi,4 loop inner ;交换首尾与最小值 mov eax,[ebp-4] mov ebx,4 mul ebx lea esi,array[eax] mov edx,[esi] xchg edx,[edi] mov [esi],edx pop ecx loop outer xor eax,eax pop ebp ret main endp end _start

模块五:子程序设计(栈传参、stdcall栈平衡)

核心考点:ebp栈偏移传参、ret 8 自动平栈、call调用子程序

.386 .model flat,stdcall option casemap:none .code ; 子程序:x + y*2 addxy proc push ebp mov ebp,esp _x$ = 8 _y$ = 12 mov eax,_x$[ebp] mov ebx,_y$[ebp] add ebx,ebx add eax,ebx pop ebp ret 8 ; stdcall自动清理8字节参数栈 addxy endp ; 主程序 main proc _x$ = -4 _y$ = -8 _z$ = -12 _start:: push ebp mov ebp,esp mov eax,23 mov _x$[ebp],eax mov eax,2 mov _y$[ebp],eax ; 从右往左压栈 push _y$[ebp] push _x$[ebp] call addxy mov _z$[ebp],eax xor eax,eax mov esp,ebp pop ebp ret main endp end _start

模块六:地址表查表跳转(多分支最优解法)

核心考点:地址表数组、寄存器偏移跳转、替代大量if-else,工业级写法

.386 .model flat,stdcall option casemap:none includelib ucrt.lib includelib legacy_stdio_definitions.lib printf PROTO C :ptr byte, :vararg .data x dd 8 msg0 db "Invalid",0 msg1 db "Jan",0 msg2 db "Feb",0 msg3 db "Mar",0 msg4 db "Apr",0 msg5 db "May",0 msg6 db "Jun",0 msg7 db "Jul",0 msg8 db "Aug",0 msg9 db "Sep",0 msg10 db "Oct",0 msg11 db "Nov",0 msg12 db "Dec",0 .code main proc _start:: push ebp mov ebp,esp mov eax,x cmp eax,1 jb case_0 cmp eax,12 ja case_0 ; 查表跳转 jmp [addr_table+eax*4] addr_table dd offset case_0,offset case_1,offset case_2,offset case_3 dd offset case_4,offset case_5,offset case_6,offset case_7 dd offset case_8,offset case_9,offset case_10,offset case_11,offset case_12 case_0: invoke printf,offset msg0 && jmp end_s case_1: invoke printf,offset msg1 && jmp end_s case_2: invoke printf,offset msg2 && jmp end_s case_3: invoke printf,offset msg3 && jmp end_s case_4: invoke printf,offset msg4 && jmp end_s case_5: invoke printf,offset msg5 && jmp end_s case_6: invoke printf,offset msg6 && jmp end_s case_7: invoke printf,offset msg7 && jmp end_s case_8: invoke printf,offset msg8 && jmp end_s case_9: invoke printf,offset msg9 && jmp end_s case_10: invoke printf,offset msg10 && jmp end_s case_11: invoke printf,offset msg11 && jmp end_s case_12: invoke printf,offset msg12 end_s: xor eax,eax pop ebp ret main endp end _start

模块七:Windows系统API调用(ExitProcess / CopyFile)

核心考点:库链接、函数原型声明、stdcall压栈传参、进程正常退出

1. 标准进程退出(正规结束程序)

.386 .model flat,stdcall option casemap:none includelib kernel32.lib ExitProcess proto,dwExitCode:dword .code main proc _start:: push ebp mov ebp,esp push 0 call ExitProcess pop ebp ret main endp end _start

2. CopyFile 文件复制API实战

.386 .model flat,stdcall option casemap:none includelib kernel32.lib CopyFile proto stdcall,:dword,:dword,:dword MY_NULL EQU 0 .const sf db "a.txt",0 df db "b.txt",0 .code main proc _start:: push ebp mov ebp,esp invoke CopyFile,offset sf,offset df,MY_NULL pop ebp ret main endp end _start

总结指令

## 二、数据定义 1. `db`:定义字节数据 2. `dw`:定义字数据 3. `dd`:定义双字数据 4. `$`:取当前地址 ## 三、数据传送 1. `mov`:数据直接传送 2. `lea`:取有效地址 3. `push`:数据压入栈 4. `pop`:数据弹出栈 5. `xchg`:交换两数据 ## 四、位数扩展 1. `movzx`:无符号扩展 2. `movsx`:有符号扩展 3. `cbw`:字节转字 4. `cwde`:字转双字 5. `cdq`:双字扩64位 ## 五、算术运算 1. `add`:加法运算 2. `adc`:带进位加法 3. `sub`:减法运算 4. `mul`:无符号乘法 5. `div`:无符号除法 ## 六、逻辑运算 1. `xor`:异或(清零) ## 七、比较与跳转 1. `cmp`:数值比较 2. `jmp`:无条件跳转 3. `je/jz`:相等则跳转 4. `jne/jnz`:不等则跳转 5. `jl`:小于则跳转 6. `jg`:大于则跳转 7. `jb`:无符小于跳 8. `ja`:无符大于跳 9. `loop`:循环跳转 ## 八、函数与栈操作 1. `call`:调用子程序 2. `ret`:函数返回 3. `ret n`:返回并平栈 4. `invoke`:调用API

搞清db dw dd

1字=两字节 1字节=8bit

db = 1字节 = 8bit 定义数字时 x db 12H 两个数字

dw = 2字节 = 16bit 定义数字时 x dw 1234H 4个数字

dd = 4字节 = 32bit 定义数字时 x dd 0aabbccddH 8个数字


http://www.jsqmd.com/news/1027440/

相关文章:

  • ModernFlyouts:终极指南!如何快速让Windows系统提示界面焕然一新
  • 2026年蜂窝湿电除尘器选购指南:主流厂商综合实力评估与案例参考 - 优质品牌商家
  • 2026年无线振动传感器选购指南:技术路径与厂商能力深度分析 - 优质品牌商家
  • WechatDecrypt深度解析:微信消息解密与本地数据自主管理完整方案
  • 衢州漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 2026年知名的龙港环保杜邦纸包/龙港单肩杜邦纸包/可水洗杜邦纸包主流厂家对比评测 - 品牌宣传支持者
  • 2026年铸造白模切割机设备选型参考:从工艺适配到交付能力的多维度解析 - 优质品牌商家
  • XXMI启动器:一站式米哈游游戏模组管理终极指南
  • AI对抗范式:生成与检测模型的系统级攻防实战
  • 2026年质量好的北京便利店标签打印机/北京热敏打印机/思普瑞特打印机/打印机优质厂家推荐榜 - 行业平台推荐
  • 问答平台排名靠后怎么通过GEO优化提升
  • 2026年公交站台制作厂家推荐甄选:这些专业厂商值得关注 - 优质品牌商家
  • 2026年家装公司管理系统选型指南:官方甄选四家主流服务商深度评测 - 优质品牌商家
  • 如何在Windows家庭版上实现远程桌面多用户连接:RDP Wrapper完整配置指南
  • 2026年比较好的北京餐饮后厨打印机/票据打印机/高速热敏打印机优质厂家推荐榜 - 品牌宣传支持者
  • 2026年正规的浙江天然石手工项链批发/浙江天然石/天然石鲜花项链批发/浙江天然石饰品批发精选推荐公司 - 行业平台推荐
  • 2026年比较好的货架喷塑加工/嘉兴喷塑加工/钣金喷塑加工/嘉兴钢结构喷塑加工厂家综合对比分析 - 行业平台推荐
  • 2026年局部放电检测系统行业口碑甄选:主流品牌与实用方案横向参考 - 优质品牌商家
  • 2026年可靠的贵州噪声治理/贵州废气治理/贵州布袋除尘推荐品牌厂家 - 行业平台推荐
  • 莆田漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 2026年热门的山东冷库提升门/提升门/山东物流园提升门/山东工业滑升门品牌厂家推荐 - 品牌宣传支持者
  • 磷脂PEG硝基苯基碳酸酯 DSPE-PEG-NPC生物偶联技术优势解读
  • 终极安卓沙盒指南:如何在单设备上安全运行多个应用实例
  • 3个步骤让Windows任务栏变透明,实现桌面美学革命
  • DonkeyCar油门校准实战指南:ESC零点与正反转PWM参数设置
  • 萍乡漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 2026年秦皇岛河北密闭门供应商甄选:行业口碑与工程实力深度分析 - 优质品牌商家
  • 2026年成都文旅项目防雷公司官方甄选:耐用与可靠并重的行业标杆 - 优质品牌商家
  • 高效网盘直链获取工具完全手册:八大平台一键解析技术深度解析
  • Redis - 主从集群脑裂:数据丢失的隐藏杀手