Assembly 我的简介汇编程序看起来还好吗?马斯姆

Assembly 我的简介汇编程序看起来还好吗?马斯姆,assembly,x86,masm,Assembly,X86,Masm,这是作业要求和评分标准。基于这些因素,有什么建议吗?多谢各位 .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,

这是作业要求和评分标准。基于这些因素,有什么建议吗?多谢各位

.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

看起来肯定比很多问题要好得多,不知道其他学生会在哪里,但就我而言,你可能会得到10分之7或8分,考虑到我脾气有多暴躁,这有点太棒了

遗憾的是,您没有在几行中尝试一些简单的任务/逻辑,以获得更多的抨击……;)另外,我的一些评论可能只是你提供“假”来源的结果,也许有了真实的来源,你在某些方面(符号名称)自然会做得更好,因为事情会有更明确的目的

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

.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汇编程序行分析器基于列位置的历史原因,我更喜欢为行的特定部分设置固定的列,即,
,到目前为止,每个列都通过tab合理地缩进,通常几乎所有的行都适合该“模板”。但这也取决于你是否会发现它更吸引你,更容易阅读。我可以看到您已经在注释中使用了它,因此您可以重新考虑操作数的位置(特别是检查选择器示例,如果有:)。例如,在这两个初始数据行中,字符串可以在换行控制点处自然拆分,因此它将有两个较短的行,并且您可以直观地看到它将如何在屏幕上着陆:

  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!"

长度1
-什么长度?那么
messageLength
呢。。。并不是说
message
本身就是一个惊人的名字,而是整个应用程序中的一条消息。否则我会使用类似于
txt\u welcome
txt\u welcome\u len
的东西

在汇编之后,还可以通过检查清单文件来验证,如果多行代码没有中断
SIZEOF
(我不使用该行,所以我不确定它是如何工作的,您也可以通过从当前位置减去起始地址来计算占用的字节,如
$-message
,至少我希望它在MASM下编译)

出于某种原因,我倾向于使用
eq
的所有大写字母,因为它们不是源于机器代码的符号,只是纯粹的抽象定义,但这并不重要,请随意找到自己的风格。保持一致

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

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

这里我有我的角色与MASM语法的争论。当我阅读我的源代码时,我希望看到所有的内存访问都很容易,所以我更喜欢
mov[input],200
,用方括号标记内存操作。它还使其与
mov[edi],200
一致。因为在这种特殊情况下,数据的大小并不明显,所以我需要明确声明我的意图,比如
mov BYTE PTR[input],200
,这样我就不必检查
.data
部分来猜测在查看代码时会写入内存的内容(另外,其他常见的x86汇编程序(如NASM或gas)不会从其定义中扣除数据大小,因此如果没有显式的大小修饰符,它们将无法正确编译此类代码)

下一条
inc
指令也是如此

请注意,很多可能只是个人喜好和偏见,然后我又写了几百KB的汇编源代码(可能更像兆字节)在我的生活中,我的大部分偏见都是由战场上的经验形成的。你可能想将你的源代码复制到几个文件中,尝试不同的风格,然后花几个小时的时间暂停,试着阅读它们中的每一个+回顾它们的工作,看看它们对你有何影响。记住,特别是在汇编编码方面,你很可能会花费大量的时间阅读源代码(并寻找!@$#@$#bug)比编写源代码要花更多的时间,因此在编写源代码时,请确保其可读性良好:

关于指导意见:试着讲述故事中缺失的部分,举个例子:

mov   BYTE PTR [input], 200    ; store 200 into input variable
   ;;; - not very good, describing the instruction function
   ;;; (which is obvious for assembly programmer)
mov   BYTE PTR [input], 200    ; set up maximum input length
   ;;; - the comment now displays the author intent, so the reader/reviewer
   ;;; may contemplate whether setting 200 into "input" achieves that intent


编辑:我并没有对照你们的作业检查它,因为我完全忽略了那个链接,因为它不是问题的一部分。真倒霉,我现在不去查了,对不起。这个“答案”只是风格建议。

不确定为什么要在200赋值中使用二进制常量。如果200实际上意味着某种比特模式,我宁愿使用十进制,或者十六进制。在你的问题中使用外部链接(以及一般的链接)会损害你问题的寿命,所以尽量避免使用它们。2.格式化您的代码并将其添加为代码片段(在每行代码之前添加4个空格,或在代码块的开头和结尾添加3个空格。欢迎使用stackoverflow顺便说一句:)在此处发布标题和类似内容可能会有所帮助,因为我们中的一些人无法从现在的位置访问google Drive:)非常感谢您的及时回复和建议!应该是打开的。尼斯样式指南,同意将操作数缩进到一致的列,这样就很容易找到写入特定寄存器的指令。因此,您可以将助记符与操作数分开查看,而不必像墙一样堆满参差不齐的文本。
  input     BYTE ?       ; ...
.code
  main PROC                     ; Start of main procedure
    mov input, 11001000b        ; Assign 200 to variable "input"
mov   BYTE PTR [input], 200    ; store 200 into input variable
   ;;; - not very good, describing the instruction function
   ;;; (which is obvious for assembly programmer)
mov   BYTE PTR [input], 200    ; set up maximum input length
   ;;; - the comment now displays the author intent, so the reader/reviewer
   ;;; may contemplate whether setting 200 into "input" achieves that intent