【问题标题】:messagebox invokation problem on assembler汇编程序上的消息框调用问题
【发布时间】:2021-12-06 16:35:49
【问题描述】:

这是代码(适用于 masm64)

include \masm64\include64\masm64rt.inc ; библиотеки
count PROTO arg_a:QWORD,arg_b:QWORD,arg_c:QWORD,arg_d:QWORD, arg_e:QWORD,arg_f:QWORD
.data
_a1 dq 2
_b1 dq 4
_c1 dq 2
_d1 dq 2
_e1 dq 2
_f1 dq 8
_res1 dq 0

_title db "Лаб.1-2. Процедуры. masm64",0
strbuf dq ?,0
_text db "Уравнение  f/e — b/d – a/c",0ah,"Результат: %d",10,"Адрес переменной в памяти: %p",0ah,0ah,
"Автор: Неопознанный пингвин",0

.code
count proc arg_a:QWORD, arg_b:QWORD,arg_c:QWORD, arg_d:QWORD, arg_e:QWORD, arg_f:QWORD ; переносим параметри, как аргументи функции

mov rax,arg_f     ; f->rax
div arg_c       ; f/e

mov rbx,rax     ; f/e->rbx 
xor rax,rax     ; rax=0 

mov rax,rdx     ; b->rax
div arg_d       ; b/d

sub rbx,rax     ; (f/e)-(b/d)
xor rax,rax     ; rax=0

mov rax,rcx     ; a->rax
div arg_c       ; a/c

sub rbx,rax     ; (f/e)-(b/d)-(a/c)

mov _res1,rbx   ; содержимое rax в _res1
ret 
count endp

entry_point proc
invoke count,_a1,_b1,_c1,_d1,_e1,_f1
invoke wsprintf,ADDR strbuf,ADDR _text,_res1,ADDR _res1
invoke MessageBox,0,addr strbuf, addr _title, MB_ICONINFORMATION
invoke ExitProcess,0
entry_point endp

该程序的工作方式如下:它解决了数学问题 f/e - b/d - a/c 并将结果发送到消息框,但它不起作用。它通常在没有调用计数的情况下工作,但我需要这部分代码。我该如何解决?

【问题讨论】:

  • mov rax,rdx ; b->rax div 将用该除法的其余部分覆盖 rdx
  • 另外,“它不起作用” 不是一个充分的问题描述。它在什么方面不起作用?
  • @Michael 好吧,当你运行程序时,它应该调用一个消息框,但它没有。就是这样

标签: assembly masm messagebox masm64


【解决方案1】:
strbuf dq ?,0  ;only 8 byte long for output

您的目标缓冲区太小。您需要为 wsprint 函数的结果定义大字节区域。例如

strbuf db 512 dup(?)

【讨论】:

  • 感谢您的回答,但这不起作用,消息框毕竟没有调用
【解决方案2】:

您的 count 过程有 6 个参数,但代码只使用了其中的 3 个! cmets 与说明不符。你不计算f/e — b/d – a/c

查看下一个代码是否显示结果:

mov  rax, _f1  ; f -> rax
div  _e1       ; f/e
mov  rcx, rax  ; f/e -> rcx

mov  rax, _b1  ; b -> rax
div  _d1       ; b/d
sub  rcx, rax  ; (f/e)-(b/d)

mov  rax, _a1  ; a -> rax
div  _c1       ; a/c
sub  rcx, rax  ; (f/e)-(b/d)-(a/c)

mov  _res1, rcx

invoke wsprintf, ADDR strbuf, ADDR _text, _res1, ADDR _res1
invoke MessageBox, 0, addr strbuf, addr _title, MB_ICONINFORMATION
invoke ExitProcess, 0

invoke 是否负责清理invoke count, _a1, _b1, _c1, _d1, _e1, _f1 中的堆栈?或者你应该写ret 48

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2022-01-06
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多