简短版本:如何将十六进制数字与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。
答案 0 :(得分:1)
这个数字的工作原理:1f是一个属性,这是蓝色背景上的白色字母。 65是e的ASCII码,48是h的ASCII码。所以我需要将48乘以10000(所有数字都是十六进制)并添加到1f001f00h,然后将65添加到先前操作的结果中并将其全部移动到eax寄存器。
如果你要遵循这个计算,你会在屏幕上看到一个WhiteOnBlue" eH"而不是" He"你期待的!
这里的好消息是,您不需要任何计算来显示文本
只需定义消息然后在循环中从中获取单个字符并将其放在屏幕上
由于这是.COM文件(org 100h
),DS
段寄存器已正确设置。
org 100h
start:
mov ax, 0003h ;Text video mode 80x25
int 10h
mov ax, 0B800h ;Segment of video memory
mov es, ax
mov di, 100 ;Address in video memory
cld
mov si, msg ;Where is the message
Again:
lodsb ;Get 1 character into AL
cmp al, 0 ;Is it terminating zero?
je EndOfLoop ;Yes
mov ah,1Fh ;Combine with attribute
stosw ;Store AX in video memory
jmp Again ;Continu the loop
EndOfLoop:
ret
msg db 'Hello world!',0