【问题标题】:Multiplying hexadecimal numbers in nasm在nasm中乘以十六进制数
【发布时间】: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 命令循环输出它们。

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

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

我也对寄存器的使用感到困惑。 cx 寄存器用于,可以说,“循环迭代”; bx 将用于遍历数组;结果数字需要输入eax。这让我只剩下edx 用于临时计算,是否有可能只用这个来做我需要的事情?

我在 qemu 的 freedos 仿真下使用 NASM。

【问题讨论】:

  • 您还有esiediebp。无论如何,你要做的是一个简单的memcpy,你只需要一个rep movsw。此外,nasm 非常有能力为您提供 ascii 代码,因此您可以执行 db 'H', 0x1f, 'e', 0x1f, ... 之类的操作
  • @Jester 你能详细解释一下吗?我对asm很陌生。提前致谢!
  • 你想解释哪一部分?关于rep movsw请查阅指令集参考。
  • @Jester 最后一部分,关于db 'H', 0x1f,请。
  • 这只是一个说明,您不必手动转换 ascii 代码,因为 nasm 可以做到这一点。所以你只需要一个一个地列出字符和属性。

标签: assembly nasm


【解决方案1】:

这个数字的工作原理:1f 是一个属性,用于蓝色背景上的白色字母。 65 是 e 的 ASCII 码,48 是 h。所以我需要将 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

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2016-08-25
    相关资源
    最近更新 更多