【问题标题】:Simple assembly function wont work简单的组装功能不起作用
【发布时间】:2014-01-29 17:02:38
【问题描述】:

我无法运行以下代码。它编译但只给出一个空白输出。我试图取 HEX_OUT 的值,删除尾随的零,然后将它与寄存器 dx 的值一起使用,这样 HEX_OUT 的值现在就是 dx 的值。任何帮助将不胜感激。

谢谢,

; prints the value of DX as hex.
print_hex:
pusha

mov ax, HEX_OUT     ; ax = 0x00000
shr ax, 1       ; remove trailing 0
and ax, dx      ; and registers and store in ax

        ; TODO :manipulate chars at HEX_OUT to reflect DX

mov bx, ax          ; print the string pointed to      
call print_string   ; by BX

popa
ret

; global variables
HEX_OUT : db '0x0000',0

【问题讨论】:

  • 您收到什么错误消息?你用的是什么汇编程序? print_string 定义在哪里?
  • 打印字符串在另一个 .asm 文件中定义,两者都是“主”文件的一部分。使用 nasm 编译没有错误,但是当你运行它时,它只是给出空白输出
  • 另外,如果我注释掉 shr 行和 and 行,它会显示 0x0000 ....所以它必须与这两行有关
  • 想想你在这些方面做了什么。 mov ax,HEX_OUT 将您的字符串0x0000地址 放入ax。随着shrand 被注释掉,接下来发生的事情是使用print_string 打印ax 指向的字符串。如果您取消注释这些行,您将在ax 中获取0x0000 的地址并对其进行操作(除以2 和and-ing 谁知道dx 中的内容)并获得一些新地址这指向...什么?谁知道呢,但可能不太好。在这种情况下,您操作的是地址,而不是值。

标签: assembly operating-system


【解决方案1】:

HEX_OUT 不是二进制数;它是 string 的地址(恰好是数字的十六进制表示)。 shr ax,1 不操作字符串;它不会移动字符。它操纵二进制数;它移动

最简单的方法是完全避免使用字符串:

HEX_OUT: dw 0000h    ; or whatever number you like

我希望你可以使用像print_number 这样的函数:

mov bx, ax           ; or whatever register is the input for that function
call print_number    ; or whatever is the name of that function

因为否则您必须编写(或find)代码将二进制数转换为其十六进制字符串表示,以便您可以将其提供给print_string

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2011-09-10
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多