assembly 有谁能帮我理解一个16位的DOS.COM小程序的指令和说明吗?

klsxnrf1  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(118)

我正在学习汇编,我想得到一些帮助。如果有人能帮助我理解这段相当基本的代码,我将不胜感激。

org 100h; directive for compiler
        cpu 8086; cpu architecture 
        jmp START; this will jump the address of START from what i understood
BYTE1:  db 32; define byte 32 not sure what it does to be honest
TEXT1:  db 'Hardwarenahes Programmieren'; define a double byte
        times 4 db 0,'1';??? 
WORT1:  dw 1,2,3,4,1234 ;Define Word ???
        dd 1234h';??
START:  mov bx, BYTE1;move value if byte1 to bx register
WDH:    mov al, [bx]; pointer for bx register to move value into al register
        out 0, al;?
        inc bx;increment value of bx
        jmp WDH; jump to WDH and execute again
pgpifvop

pgpifvop1#

org 100h; directive for compiler

“编译器”一词是不恰当的:汇编程序不是“编译”的。如果你要把一种“更抽象”的编程语言翻译成一种更具体的“编程”语言,你就说“编译”。例如,Java → Java字节码。
汇编语言→机器代码不被认为是“编译”,因为这两种“语言”都有同样的“能力”,都有能力描述一种算法。
org指令的文档。

cpu 8086; cpu architecture

cpu指令 * 限制了 * 可用指令集。例如,在下面的代码中,nasm(1)将拒绝汇编cpuid指令。

jmp START; this will jump the address of START from what i understood

是的。在这里使用它,因为在平面bin中没有节。这意味着,没有“这是数据”与“这是(指令)代码”的指示。从处理器的Angular 来看,一切都是代码。跳过后续数据很重要,因为否则处理器会将后续数据值解释为指令。

BYTE1:  db 32; define byte 32 not sure what it does to be honest

应该有一个注解来解释这一点。在ASCII中,32是空格字符(' ')的十进制值。

TEXT1:  db 'Hardwarenahes Programmieren'; define a double byte

我相信db中的d代表datum/data(我从来没有看到一个明确的来源声称这一点)。d…伪指令定义(显式初始化)数据。

times 4 db 0,'1';???

这是db 0, '1', 0, '1', 0, '1', 0, '1'的简写。* 可能 * 0意味着(如果写入适当的设备)“换行”,而(在IBM大型机上)将'1'写入一行的第一列意味着“前进到下一页”(≈换页)。

WORT1:  dw 1,2,3,4,1234 ;Define Word ???
        dd 1234h';??

后缀是(摘录):
| 字尾|代表|尺寸大小|
| - -|- -|- -|
| b|位元组|8位量|
| w个|字|16位数量|
| d个|双字|32位数量|
| q|四字|64位数量|
整数常数的尾端h表示十六进制基底。

START:  mov bx, BYTE1;move value if byte1 to bx register

BYTE1是一个标签。标签是地址的符号表示。此行将BYTE1表示的 * 地址 * 加载到寄存器bx中。

WDH:    mov al, [bx]; pointer for bx register to move value into al register

我想你理解得很正确,但你的评论有点令人困惑,所以我宁愿把它写出来:

  • [bx]表示取bx寄存器并将其解释为内存地址。
  • alax寄存器的下半部分。(ah是上半部分。)
  • 与内存操作数配对的mov作为源,8位寄存器作为目标,将在源中找到的内容 * 复制 * 到目标。
out 0, al;?

x86上,硬件基本上是以类似array的方式访问的。这里0是这个数组中的索引,我们将al的内容写入端口0
如果将端口0连接到某种输出设备(打印机/屏幕),这将是有意义的,但端口0的意义取决于特定的硬件配置。

inc bx;increment value of bx
        jmp WDH; jump to WDH and execute again

是的。从德文文本中我可以假设WDH代表wiederholen”(重复)。
PS:也许你正在阅读的书/教程太旧了?(通过在第一列中写入'1'来前进到下一个[打印]页?)在x86 tag info page上有一些资源。

相关问题