我的介绍装配程序看起来不错吗? MASM

时间:2018-02-15 17:29:21

标签: assembly x86 masm

Assignment Grading Rubric

这是分配要求和评分规则。基于这些元素,对我有什么建议吗?谢谢。

.386
.MODEL FLAT, stdcall
.STACK 4096
  ExitProcess PROTO, dwExitCode: DWORD    
.data
  sum       DWORD 10000h
  message   BYTE "Welcome to Assembly programming.", 0dh, 0ah, "You grade will be randomly assigned", 0dh, 0ah, "by the Intel 8086 processor!"
  length1   DWORD SIZEOF message                    ; SIZEOF operator returns the size of variable "message"
  lengthConstant EQU 5 + LENGTHOF message           ; Declaring a symbolic constant. LENGTHOF returns the length of variable "message"
  length5   DWORD lengthConstant                    ; lengthConstant here will eventually be replaced with result of the expression (5 + LENGTHOF message) 
  input     BYTE ?                                  ; uninitialized variable 

.code
  main PROC                     ; Start of main procedure
    mov input, 11001000b        ; Assign 200 to variable "input"
    inc length5                 ; Add 1 to length5
    INVOKE ExitProcess,0        ; Exit the process
  main ENDP                     ; End of main procedure
END main

1 个答案:

答案 0 :(得分:1)

看起来肯定比许多SO问题好多了,不确定其他学生会在哪里,但就我而言,你可能会得到7分或8分,这是一个很好的考虑我是多么脾气暴躁

可惜你没有在几行上尝试一些简单的任务/逻辑,以获得更多的抨击......;)我的一些评论可能只是你提出的结果"假&#34 ;来源,也许是真实的,你会在某些方面(符号名称)自然更好,因为事情会有更明确的目的。

现在我会尝试解决我能想到的那些微小细节:

.data
  sum       DWORD 10000h
  message   BYTE "Welcome to Assembly programming.", 0dh, 0ah, "You grade will be randomly assigned", 0dh, 0ah, "by the Intel 8086 processor!"

我会避免长线,在现代IDE中通常100是合理的限制,在屏幕上可以看到整条线,如果你有可能在上课期间在某个投影机上结束,那么目标只是80.

由于基于列位置的Z80汇编程序行解析器的历史原因,我更倾向于为特定的行部分(即<label> <instruction> <operands> <comment>)设置固定列,每个字段合理地缩进到目前为止,通常几乎所有线条符合&#34;模板&#34;。但取决于你是否会发现你看起来更有吸引力,更容易阅读。我可以看到你已经将它用于评论,所以你也可以重新考虑操作数的位置(尤其是检查lectors的例子,如果有的话:)。例如,这两条初始数据线,字符串可以在换行控制点自然分割,因此它将有两条较短的线条,您也可以直观地看到它将如何落在屏幕上:

  sum       DWORD   10000h
  message   BYTE    "Welcome to Assembly programming.", 0dh, 0ah
            BYTE    "You grade will be randomly assigned", 0dh, 0ah
            BYTE    "by the Intel 8086 processor!"
  length1   DWORD SIZEOF message                    ; SIZEOF operator returns the size of variable "message"

length1 - 长度是多少?怎么样messageLength ...不是message本身就是一个了不起的名字,而是整个应用程序中的单个消息。否则我会使用txt_welcometxt_welcome_len之类的东西。

也可以通过检查列表文件验证装配后,如果该多行没有中断{​​{1}}(我不会使用那个,所以我不确定它是如何工作的,你也可以通过从当前位置减去起始地址来计算占用的字节,比如SIZEOF,至少我希望在MASM下编译)。

$ - message

出于某种原因,我倾向于使用 lengthConstant EQU 5 + LENGTHOF message ; Declaring a symbolic constant. LENGTHOF returns the length of variable "message" 的全部大写,因为那些不是源于机器代码的符号,而只是纯粹的抽象定义,但这并不重要,随时可以找到你自己的风格。只是保持一致。

EQU

最终没有,但在组装期间,在发出生成的机器代码之前,即在编译时(不是链接或运行时)。总的来说,这些评论很好,作为解释MASM指令的教程,但对于真正的代码注释来说有点过于冗长,在 length5 DWORD lengthConstant ; lengthConstant here will eventually be replaced with result of the expression (5 + LENGTHOF message) 这些注释中更为必要。

; memory value = length of message+5

未初始化的数据属于&#34; BSS&#34;部分,我认为在MASM中有 input BYTE ? ; ... 快捷方式(类似于.data?指令)。

.data

在这里,我的角色与MASM语法争吵。当我阅读我的源代码时,我希望很容易看到所有内存访问,所以我更喜欢带有方括号的.code main PROC ; Start of main procedure mov input, 11001000b ; Assign 200 to variable "input" ,标记内存操作。它也与mov [input],200保持一致。因为在这种特殊情况下,数据的大小并不明显,我要明确声明我的意图,例如mov [edi],200,所以我不必检查mov BYTE PTR [input],200部分来猜测会是什么当我查看代码时(或者其他常见的x86汇编程序,如NASM或不要从他们的定义中扣除数据大小)写入内存,因此如果没有明确的大小修饰符,他们将无法正确编译此类代码。

下一个.data指令也是如此。

请注意,很多可能只是个人偏好和偏见,然后我在我的生活中再次写了几百千字节的汇编源(可能更像兆字节),所以我的大部分偏见都来自于战斗中的经验领域。您可能希望将源复制到多个文件中,尝试不同的样式,然后暂停几个小时,并尝试阅读每个文件+查看它们的作用,看看它是如何工作的。请记住,特别是在汇编编码时,你很可能会花更多的时间阅读你的资源(并寻找它!@ $#@ $ #bug),而不是写它,所以要确保你在编写时,它是读得好。 :)

关于指导评论:尝试讲述故事的缺失部分,只是一些例子:

inc
编辑:我没有根据你的任务检查它,因为我完全忽略了这个链接,因为它不是问题的一部分。运气好,现在不去检查,抱歉。这个&#34;答案&#34;只是风格建议。