在nasm

时间:2017-10-22 10:09:47

标签: assembly nasm

简短版本:如何将十六进制数字与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命令输出它们。

但我不明白如何形成这样的十六进制数字。我真的不明白我在这里使用的数字是否需要在eaxax,或者我如何获取结果。所以我想请一些解释。

此数字的工作原理:1f是属性,这是蓝色背景上的白色字母。 65e的ASCII代码,48代表h。所以我需要将48乘以10000(所有数字都是十六进制)并添加到1f001f00h,然后将65添加到先前操作的结果中并将其全部移动到eax寄存器。

我也对寄存器的使用感到困惑。 cx寄存器用于,即'循环迭代'; bx将用于迭代数组;结果数字需要放在eax中。除了edx进行临时计算之外,我只剩下这个,是否有可能只用这个做我需要的东西?

我在qemu的freedos模拟中使用NASM。

1 个答案:

答案 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