我试图制作一个程序来计算这个公式的值:
(4b + c - d) (2b + 5(3c + 5a)) / (4ab + 5c - 8d)
我试着至少写点东西,但绝对没有任何反应。该代码完全是胡说八道,甚至无法编译。
问题。如何编写正确的代码?我不知道这是不是一个愚蠢的问题......
Data segment
Mess db 'Результат : ', '$'
a dw 0
b dw 0
c dw 0
d dw 0
Data ends
Code segment use16
assume cs: Code, ds: Data
Start:
mov ax, Data
mov ds, ax
PrtChr '>'
InputInt a
PrtChr '>'
InputInt b
PrtChr '>'
InputInt c
PrtChr '>'
InputInt d
Print Mess, 0
mov ax, b ; ax = b
mov cx, 4 ; cx = 4
imul cx; ; b * 4
add cx, c ; b * 4 + c
sub cx, d ; b * 4 + c - d
mov ax, 2 ; ax = 2
mov al, b ; al = b
imul al ; b * 2
mov ax, 5 ; ax = 5
mov cl, 3 ; cl = 3
mov ch, c ; ch = c
imul ch ; c * 3
mov ecx, 5 ; ecx = 5
mov eax, a ; eax = a
imul eax ; a * 5
add ch, eax ; ch = (3*c + 5*a)
imul ch ; 5 * (3 * c + 5 * a)
add al, ch ; (2 * b + (5 * ( 3 * c + 5 * a ) ) )
move ah, cx ; ah = b * 4 + c - d
move eax, al ; eax = (2 * b + (5 * ( 3 * c + 5 * a ) ) )
imul eax ; eax = (b * 4 + c - d) * (2 * b + (5 * ( 3 * c + 5 * a ) ) )
; 4 * a * b
move ax, 4 ; ax = 4
move ah, a ; ah = a
imul ah ; 4 * a
move ah, ah
move ax, b ; ax = b
imul ax ; 4 * a * b
; 5 * c
move ah, 5
move al, c
imul al
; 4 * a * b + 5 * c
add ah, al
; 8 * d
move al, 8 ; al = 8
move ecx, d ; ecx = d
imul ecx ; d * 8
; 4 * a * b + 5 * c - 8 * d
sub ah, ecx
KeyPressed
mov ax, 4C00h
int 21h
Code ends
Stk segment STACK
dw 128 dup(?)
Stk ends
我会告诉你一个小秘密,它可以为你节省很多时间:
例如,在您的情况下,我们用 C 编写所需的程序:
然后我们在关闭优化 (
-O0
) 并发布汇编程序列表 (-S
) 的情况下对其进行编译。标志-fno-asynchronous-unwind-tables
,-fno-dwarf2-cfi-asm
并使汇编程序列表更清晰:在输出中,我们得到这样一个汇编程序列表:
有时使用Compiler Explorer之类的工具会更方便。
如果你是为自己做,并且想学习如何用汇编程序编写,一切都是一样的。试着自己写程序,如果不行,用C写同样的代码,看看编译器把它翻译成什么,用什么汇编语言构造。
尝试手动将 C 语言翻译成汇编程序:打印一份 C 代码并将汇编程序代码写在下一张纸上(当然,您可以不打印)。不需要翻译大型程序,您可以从小段代码开始,例如