-1

这是代码(适用于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 并将结果发送到消息框,但它不起作用。它通常在没有调用计数的情况下工作,但我需要这部分代码。我该如何解决?

4

2 回答 2

0

您的count proc 有 6 个参数,但代码仅使用其中 3 个!评论与说明不符。你不计算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吗?

于 2021-12-07T21:52:24.260 回答
0
strbuf dq ?,0  ;only 8 byte long for output

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

strbuf db 512 dup(?)
于 2021-12-06T19:08:19.233 回答