【问题标题】:DB ASM variable in Inline ASM C++内联 ASM C++ 中的 DB ASM 变量
【发布时间】:2015-06-10 03:16:04
【问题描述】:

我正在尝试弄清楚如何将 DB 变量从 ASM 用于内联 ASM C++

我有这个 ASM 代码:

filename db "C:\imagen.bmp"
eti0:
mov ah,3dh 
mov al,0 
mov dx,offset filename 
int 21h  

在 C++ 中:

//ASCII of C:\imagen.bmp plus zero in the end because of int 21h
int filename=6758921051099710310111046981091120;

asm{
    mov ah,3dh 
    mov al,0 
    mov dx,offset filename
    int 21h
}

这是正确的吗?

【问题讨论】:

  • 奇怪的是,内联汇编部分看起来是正确的,而 C++ 部分则完全错误。通常情况是相反的。你用的是什么编译器?

标签: c++ assembly inline-assembly dos borland-c++


【解决方案1】:

int 类型只能保存 16 位有符号整数,而您尝试分配给 filename 的数字超出了它的范围。由于int 变量有两个字节长,它们对于存储文件名并不是那么有用。相反,您应该将名称存储在 char 的数组中,如下所示:

char filename[] = "C:\\imagen.bmp";

数组将包含一个零字节作为其最终元素,这与 C++ 中的字符串一样。

您也可以将整个内容替换为:

int handle;
_dos_open("C:\\imagen.bmp", 0, &handle);

【讨论】:

  • 我收到这些错误link
  • 啊,我应该将句柄声明为int。我已经相应地更新了我的答案。
  • 如果我使用以下代码:#include<stdio.h> 987654330 #include<iostream.h> 987654332 #include<stdlib.h> 987654334 #include<share.h> 987654336 { 987654338 int handle; 987654340 @ cout<<handle; getch(); } 我得到一个 6 的值,一个 6 的错误值对应于 06h Invalid handle
  • 6的值是句柄的值,不是错误值。如果要检查错误,则需要检查_dos_open 的返回值。如果返回 0 则没有错误,其他都是 MS-DOS 错误代码。
  • 谢谢!现在没有错误。但我想知道您是否可以帮助我完成接下来需要做的事情。我现在需要运行下一个 ASM 代码:unsigned char buffer; for(int i=118;i>0;i--){ asm{ mov ah,3fh mov bx,handle mov dx,offset buffer mov cx,1 int 21h } } 在缓冲区中使用 unsigned char 很好,或者我需要使用其他类型?
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2015-09-22
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多