x86汇编实现DELTA=B²-4AC计算,运行无报错但无输出如何解决
问题原因
你的代码仅完成了b²-4ac的计算逻辑,结果存入delta变量后就直接退出进程,没有调用任何控制台输出接口,因此不会打印任何内容。
完整可运行修改代码
.386 .model flat,stdcall .stack 4096 ; 新增需要用到的Win32 API声明 ExitProcess proto,dwExitCode:dword GetStdHandle proto, nStdHandle:dword WriteConsoleA proto, hConsoleOutput:dword, lpBuffer:ptr byte, nNumberOfCharsToWrite:dword, lpNumberOfCharsWritten:ptr dword, lpReserved:dword ; 引入依赖库 includelib kernel32.lib .data delta SDWORD ? a SDWORD 6 b SDWORD 3 cc SDWORD 4 ; 新增输出相关变量 stdout dword ? ; 控制台标准输出句柄 write_buf byte 16 dup(0) ; 输出字符串缓冲区 write_cnt dword ? ; 实际写入字符计数 STD_OUTPUT_HANDLE equ -11 ; 标准输出的常量标识 .code main proc ; 原计算逻辑保持不变 mov eax,a mov ebx,b mov ecx,cc imul ebx,b ; b^2 imul eax,4 ; 4a imul eax,cc ; 4a*c sub ebx,eax ; b^2-4ac mov delta,ebx ; delta = b^2-4ac ; 新增输出逻辑开始 ; 1. 获取标准输出句柄 invoke GetStdHandle, STD_OUTPUT_HANDLE mov stdout, eax ; 2. 将delta的数值转为ASCII字符串 mov eax, delta lea edi, write_buf ; 处理负数 test eax, eax jns positive_num ; 负数先写入负号,再取绝对值 mov byte ptr [edi], '-' inc edi neg eax positive_num: ; 逐位转换数字,先从低位到高位存到栈里 mov ecx, 0 convert_loop: mov edx, 0 mov ebx, 10 div ebx add dl, '0' push edx inc ecx test eax, eax jnz convert_loop ; 从栈里取出放到缓冲区,就是正常顺序 pop_loop: pop edx mov [edi], dl inc edi loop pop_loop ; 计算总字符长度 sub edi, offset write_buf ; 3. 调用控制台输出API打印结果 invoke WriteConsoleA, stdout, offset write_buf, edi, offset write_cnt, 0 invoke ExitProcess,0 main endp end main
使用说明
在VS2019中运行时按下Ctrl+F5(开始执行不调试),即可看到控制台窗口打印出计算结果,你给出的测试参数(a=6,b=3,c=4)的输出结果为-87。
内容的提问来源于stack exchange,提问作者Himu21
相关产品推荐
相关产品推荐

