【问题标题】:How data saved in memory DOS 16 bit ASM?DOS 16位ASM如何将数据保存在内存中?
【发布时间】:2016-03-14 08:42:46
【问题描述】:

我是 ASM 的新手。我对数据如何保存在内存中存有疑问。

这是我的 ASM 16 位代码

;db.com
.model small
.code
org 100h
start:
jmp proses
A db '123'
B dw 0abcdh
proses:

int 20h
end start

然后我尝试使用-d 命令进行调试

上图显示A变量在十六进制值中的顺序正确,但B变量在CD然后是AB

我的问题是为什么 A 变量中的数据与 B 变量保存的不同,你能解释一下吗?

【问题讨论】:

  • 您正在观察会发生什么,因为 x86 是一个小端系统。 A db '123' 只是连续存储 3 个字节。当您超出大小超过一个字节的数据元素时,字节以相反的顺序存储。 B dw 0abcdh 是一个 16 位的值,因此字的字节以相反的顺序存储在内存中,因此在内存中它显示为 cd ab。如果您有C dd 11223344h,则字节将以相反的顺序存储为44 33 22 11
  • 参见维基百科中的endianness
  • 指令序列的情况稍微复杂一些。它以指令操作码开始,如果有一个 16 位操作数,它将按 little-endian 顺序排列,即最低有效字节在前。指令序列总是以操作码开头(不管字节序),否则处理器将不知道指令包含多少字节。

标签: assembly dos 16-bit


【解决方案1】:

x86 使用 little endian,因此 word 将存储为 low-byte, high-bytedword 将存储为 low -word,高词

0x1020 将在内存中为 0x20 0x10
0xabcd1234 将是0x34 0x12 0xcd 0xab

通过定义db <string>,您命令汇编器将字符串用作字节序列,并且每个字节以相同的顺序逐个存储

例如
db '012345",13,0 将是 0x30 0x31 0x32 0x33 0x34 0x35 0x0D 0x00

【讨论】:

  • 我更正了您的回答中的一个错误。您错误地写了 quaddword 不同!
猜你喜欢
  • 2015-12-21
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2015-08-30
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多