【发布时间】:2017-10-22 21:59:51
【问题描述】:
简短版本:如何将十六进制数字与 asm 相乘,结果将存储在哪里以及如何访问它并将其移动到 eax 寄存器?
更长的版本,它解释了我为什么需要这样做以及采用哪种格式:
我想要一个字节数组来存储一些我要输出到视频内存中的字符的 ASCII 码。我可以像这样输出两个字符:
org 100 h
start:
mov ax, 0003h
int 10h
mov ax, 0b800h
mov es, ax
mov di, 100
mov eax, 1f651f48h
stosd
ret
这将在屏幕左上角附近以蓝色背景上的白色字母输出He。但我想打印“Hello world!”。所以我想我会将符号代码存储在一个数组中,通过加法和乘法形成像1f651f48h 这样的十六进制数字,然后使用rep 命令循环输出它们。
但我不明白如何形成这样的十六进制数字。我真的不明白我在这里使用的数字是否需要在eax 或ax 中,或者我如何获取结果。所以我想请求一些解释。
这个数字的工作原理:1f 是一个属性,用于蓝色背景上的白色字母。 65 是 e 的 ASCII 码,48 是 h。所以我需要将 48 乘以 10000(所有数字都是十六进制)并添加到 1f001f00h,然后将 65 添加到先前操作的结果并将其全部移动到 eax 寄存器。
我也对寄存器的使用感到困惑。 cx 寄存器用于,可以说,“循环迭代”; bx 将用于遍历数组;结果数字需要输入eax。这让我只剩下edx 用于临时计算,是否有可能只用这个来做我需要的事情?
我在 qemu 的 freedos 仿真下使用 NASM。
【问题讨论】:
-
您还有
esi、edi和ebp。无论如何,你要做的是一个简单的memcpy,你只需要一个rep movsw。此外,nasm非常有能力为您提供 ascii 代码,因此您可以执行db 'H', 0x1f, 'e', 0x1f, ...之类的操作 -
@Jester 你能详细解释一下吗?我对asm很陌生。提前致谢!
-
你想解释哪一部分?关于
rep movsw请查阅指令集参考。 -
@Jester 最后一部分,关于
db 'H', 0x1f,请。 -
这只是一个说明,您不必手动转换 ascii 代码,因为
nasm可以做到这一点。所以你只需要一个一个地列出字符和属性。