这是我第一次参加集会,并且我喜欢关于组织/风格的一些指示。这段代码采用一个整数并打印多维数据集(我在Windows上运行它,通过NASM),虽然代码可以工作,但大部分内容都是从我在网上找到的代码示例中蚕食并重写的,所以很多都是对我来说还是胡说八道。我想知道的是1)我在做什么特别愚蠢的事情吗? 2)有没有办法让汇编代码看起来更加优雅/整洁?
感谢。
global main
extern printf
extern scanf
;This header makes sure it works on Windows/Linux, got from drpaulcarter.com/pcasm/
%ifdef
WIN32_TYPE
%define scanf _scanf
%define printf _printf
%endif
%ifdef
OBJ_TYPE
section .data
public align=4
class=data
use32
%else
section .data
%endif
prompt db "Please enter an integer to cube: ", 0
msg
db ` is the cube.\n`, 0
format db "%i", 0
section .bss
input resb 1000
section .text
exit.
main:
push ebp
mov ebp, esp
push prompt
call printf
add esp, 4
push input
push dword format
call scanf
add esp, 8
mov eax, [input]
mov edx, [input]
imul eax, edx
imul eax, edx
push eax
push dword format
call printf
add esp, 4
push msg
call printf
mov esp, ebp
pop ebp
nop
ret
答案 0 :(得分:2)
通常的惯例是将每个指令缩进几个空格,标签留在左边缘,这样它们就很明显了。
有些人喜欢将操作数标记为直列。我发现这不太有帮助。
可读性需要解释性的通知。解释参数和返回值的大量详细函数头非常重要。另外,一种常见的风格是在右侧标签栏中保持一个正在运行的评论,解释左侧发生的事情的要点。抵制图形垃圾:ascii艺术盒等。它们只会掩盖代码。
当您开始实施更复杂的控制流程时,就会出现真正的可读性规则。最好的办法是模仿更高级别的语言结构while
,for
,if/then/else
和`do / while'。在注释的右栏中使用这些,同时实现左侧的代码。采用标签惯例:
cmp ax, bx ; if x (in ax) < y (in bx)
jge min_xy_else
min_xy_then: ; then
mov cx, ax ; min = x
jmp min_xy_end
min_xy_else: ; else
mov cx, bx ; min = y
min_xy_end: ; cx is min
...
至于你的代码,这是合理的。不确定为什么在返回前有nop
。