NASM实现C代码对应Win32汇编程序运行崩溃问题求助
错误明细
- 入口退出逻辑错误:Win32平台下
_start是程序入口,不能直接用ret退出,会因为返回地址无效直接崩溃,需要调用kernel32.dll的ExitProcess接口退出程序。
- 入口退出逻辑错误:Win32平台下
- 分支逻辑错误:
if(a>23)判断后,jnle thenblock只处理了条件成立的跳转,条件不成立时会直接落入thenblock执行,等于判断完全失效,应该改为条件不成立时跳转到next标签跳过if块。
- 分支逻辑错误:
- 运算优先级完全错误:C表达式
a%(b&a%10)/c的运算顺序为a%10→b & (a%10)→a % (上一步结果)→上一步结果 / 初始值c=14,你的代码先计算b&a,完全违背优先级规则,且运算过程中反复覆盖原始a、b、c的值,没有提前备份原始变量。
- 运算优先级完全错误:C表达式
- 全局变量未定义:原C代码中
a、b、c是全局变量,你没有在.data段定义对应变量,仅用寄存器暂存不符合功能要求。
- 全局变量未定义:原C代码中
- 除法逻辑错误:32位除法
div ebx执行的是edx:eax / ebx,运算前必须清空edx,你部分除法步骤前没有正确清空,且中间运算的被除数、除数取值完全错误,甚至存在除数为0的崩溃风险。
- 除法逻辑错误:32位除法
修复后的完整代码
; 定义数据段存放全局变量a、b、c segment .data a dd 0 b dd 0 c dd 0 segment .text global _start ; 导入系统退出接口 extern ExitProcess _start: ; 对应C代码基础赋值逻辑 mov dword [a], 28 ; a=28 mov eax, [a] add eax, 31 mov dword [b], eax ; b = a+31 = 59 mov dword [c], 14 ; c=14 ; if(a>23)条件判断 cmp dword [a], 23 jle next ; 小于等于23就跳转到next,跳过if块 thenblock: ; 第一步:计算a%10 mov eax, [a] xor edx, edx mov ebx, 10 div ebx ; edx = a%10 = 8 mov ecx, edx ; ecx暂存a%10的结果 ; 第二步:计算b & (a%10) and ecx, [b] ; ecx = 59 & 8 = 8 ; 第三步:计算a % 上一步结果 mov eax, [a] xor edx, edx mov ebx, ecx div ebx ; edx = 28 % 8 = 4 ; 第四步:计算上一步结果 / 初始c=14,结果写回c mov eax, edx xor edx, edx mov ebx, [c] div ebx ; eax = 4 /14 = 0 mov [c], eax next: mov edx, [c] ; d = c,edx存储d的取值 ; 正常退出程序 push 0 call ExitProcess
编译链接说明
- 汇编指令:
nasm -f win32 sample.asm -o sample.obj - 链接指令(GoLink):
golink /entry:_start sample.obj kernel32.dll
内容的提问来源于stack exchange,提问作者l0ner9
相关产品推荐
相关产品推荐

