【发布时间】:2018-09-10 09:38:12
【问题描述】:
我正在尝试理解用汇编语言编写的代码,谁能告诉我下面代码中“hiticks”和“loticks”的含义?它们是寄存器还是变量?我检查了 n=internet,但找不到任何示例。
mov dx,1AH
mov ax,[loticks]
sub dx,ax
mov [hiticks],dx
mov ax,[hiticks]
jmp end
hiticks dw 0H
loticks dw 10H
end
感谢您的回答。
【问题讨论】:
-
两者都不是。底部的
lotick后面跟dw是符号/标签的定义,即内存地址的“名称”(标签就像内存中的书签)。dw将发出两个字节的机器代码(形成字值10h,因此这两个字节将是 16 和 0)并且标签loticks指向第一个字节。然后在源的其他部分,如mov ax,[loticks]- 这是内存操作数,使用loticks作为内存地址=> 针对这两个字节,所以mov之后的ax将包含该值16(除非内存那里的内容同时被修改为其他内容)。 -
而且我不会在下面的答案中称它们为“变量”,因为在汇编中它们缺少任何高级语言功能,例如您可以(在 80386+ CPU 上)@987654333 @ 它将同时加载四个连续字节的内存,即同时加载“hiticks”和“loticks”“变量”,将这 16+16 位连接成 32 位
100000h。如果您愿意,汇编程序或 CPU 不会阻止您执行此操作,因此将其视为内存和书签更安全,而不是将其视为“变量”并期待某种类型检查。这取决于程序员。 -
我还是不明白。这是否意味着 loticks 和 hiticks 的值都是 0?
-
不,它们是内存地址。确切的值取决于它们链接的位置(和/或由 OS 加载程序重新定位)...例如,如果这是在 DOS COM 文件中,从偏移量 100h 加载,那么前面的代码是 11h 字节长,所以
hiticks = 111h和loticks = 113h。所以mov ax,[loticks]是mov ax,[113h],如果ds指向该代码所在的正确内存段,ax将从内存中加载值10h(由dw 10h在该地址初始化)。 -
也许可以尝试阅读这个homepage.cs.uri.edu/faculty/wolfe/book/Readings/Reading04.htm(我只是快速浏览了一下,没有看到任何完全错误/可怕的地方,虽然我也没有完全感到惊讶......关于页面末尾的内存寻址,但可能足以了解 asm 源中的这些标签如何成为实际内存地址的占位符)
标签: variables assembly assemblies cpu-registers