关于装配中的样式/组织的问题

时间:2014-08-26 14:05:47

标签: assembly nasm

这是我第一次参加集会,并且我喜欢关于组织/风格的一些指示。这段代码采用一个整数并打印多维数据集(我在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

1 个答案:

答案 0 :(得分:2)

通常的惯例是将每个指令缩进几个空格,标签留在左边缘,这样它们就很明显了。

有些人喜欢将操作数标记为直列。我发现这不太有帮助。

可读性需要解释性的通知。解释参数和返回值的大量详细函数头非常重要。另外,一种常见的风格是在右侧标签栏中保持一个正在运行的评论,解释左侧发生的事情的要点。抵制图形垃圾:ascii艺术盒等。它们只会掩盖代码。

当您开始实施更复杂的控制流程时,就会出现真正的可读性规则。最好的办法是模仿更高级别的语言结构whileforif/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