我正在学习汇编,我想得到一些帮助。如果有人能帮助我理解这段相当基本的代码,我将不胜感激。
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
1条答案
按热度按时间pgpifvop1#
“编译器”一词是不恰当的:汇编程序不是“编译”的。如果你要把一种“更抽象”的编程语言翻译成一种更具体的“编程”语言,你就说“编译”。例如,Java → Java字节码。
汇编语言→机器代码不被认为是“编译”,因为这两种“语言”都有同样的“能力”,都有能力描述一种算法。
org
指令的文档。cpu
指令 * 限制了 * 可用指令集。例如,在下面的代码中,nasm(1)
将拒绝汇编cpuid
指令。是的。在这里使用它,因为在平面
bin
中没有节。这意味着,没有“这是数据”与“这是(指令)代码”的指示。从处理器的Angular 来看,一切都是代码。跳过后续数据很重要,因为否则处理器会将后续数据值解释为指令。应该有一个注解来解释这一点。在ASCII中,32是空格字符(
' '
)的十进制值。我相信
db
中的d
代表datum/data(我从来没有看到一个明确的来源声称这一点)。d…
伪指令定义(显式初始化)数据。这是
db 0, '1', 0, '1', 0, '1', 0, '1'
的简写。* 可能 *0
意味着(如果写入适当的设备)“换行”,而(在IBM大型机上)将'1'
写入一行的第一列意味着“前进到下一页”(≈换页)。后缀是(摘录):
| 字尾|代表|尺寸大小|
| - -|- -|- -|
|
b
|位元组|8位量||
w
个|字|16位数量||
d
个|双字|32位数量||
q
|四字|64位数量|整数常数的尾端
h
表示十六进制基底。BYTE1
是一个标签。标签是地址的符号表示。此行将BYTE1
表示的 * 地址 * 加载到寄存器bx
中。我想你理解得很正确,但你的评论有点令人困惑,所以我宁愿把它写出来:
[bx]
表示取bx
寄存器并将其解释为内存地址。al
是ax
寄存器的下半部分。(ah
是上半部分。)mov
作为源,8位寄存器作为目标,将在源中找到的内容 * 复制 * 到目标。在x86上,硬件基本上是以类似
array
的方式访问的。这里0
是这个数组中的索引,我们将al
的内容写入端口0
。如果将端口
0
连接到某种输出设备(打印机/屏幕),这将是有意义的,但端口0
的意义取决于特定的硬件配置。是的。从德文文本中我可以假设
WDH
代表wiederholen”(重复)。PS:也许你正在阅读的书/教程太旧了?(通过在第一列中写入
'1'
来前进到下一个[打印]页?)在x86 tag info page上有一些资源。