- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试通过 eax 从 asm proc 返回一个 long int,后来又尝试通过 dx:ax。两者都不适合我,因为 C printf 打印的数字与所需的 320L 不同。
x.asm:
.model SMALL
.stack 100h
.code
.386
; extern int get_buffered_long(long int **arr, int num_of_elements, int i);
; [BP+4] [BP+6] [BP+8]
PUBLIC _get_bufferred_long
_get_bufferred_long PROC NEAR
push BP
mov BP,SP
push SI
push DI
push BX
call locate_slot
;mov EAX, DWORD PTR [DI] ;something here doesn't work. the way i return a long int to borland C, or other issue.
mov ax,[DI]
mov dx,[DI+2]
pop BX
pop DI
pop SI
pop BP
ret
_get_bufferred_long ENDP
; extern void set_bufferred_long(long int *arr[], int buff_size, int i,long int value);
; [BP+4] [BP+6] [BP+8] [BP+10]
PUBLIC _set_bufferred_long
_set_bufferred_long PROC NEAR
push BP
mov BP,SP
pushad
call locate_slot
mov EAX,[BP+10]
mov DWORD PTR [DI],EAX
popad
pop BP
ret
_set_bufferred_long ENDP
; helper function that makes DI point to the slot wanted.
locate_slot PROC NEAR
calc_slot:
mov SI,[BP+4]
mov AX,[BP+8]
mov BX,[BP+6]
xor DX,DX
div BX
locate_slot_in_array:
shl AX,1
add SI,AX
mov DI,[SI]
shl DX,2
add DI,DX
ret
locate_slot ENDP
end
y.c:
#include "stdio.h"
#include "stdlib.h"
extern int get_bufferred_long(long int**,int,int);
extern void set_bufferred_long(long int**,int,int,long int);
int main(){
long int **arr;
int i,j,n,m;
n = 5;
m = 4;
arr=(long int**)malloc(n*sizeof(long int*));
for(i=0; i < n; i = i + 2) arr[i] = malloc( m*sizeof(long int));
for(i=1; i < n; i = i + 2) arr[i] = malloc( m*sizeof(long int));
for(i=0; i < n; i++)
for(j=0; j < m; j++)
set_bufferred_long(arr, m, i*m+j, i*100+j*10);
printf("get_bufferred_long(arr, %d, %d) = %ld\n", m, 14, get_bufferred_long(arr,m, 14));
return 0;
}
set 函数有效(数组看起来与需要的完全一样)。 get函数也可以工作,它在asm中获取320L,但是当传递给C时,出现了问题。
没有编译错误或警告。borland c++ 5.02
最佳答案
嗯,在 386 bcc 上确实在 16 位模式下使用 AX:DX;不知道32位。
但是看看你的代码!
...
mov dx,[DI+2]
mov ax,[DI]
mov dx,[DI+2]
pop DX
...
您正在将结果加载到 DX 寄存器,然后将堆栈弹出到其中,从而清除它所具有的值。 DX 不必通过简单过程中的推送/弹出来保存(仅在 DOS ISR 中)。
编辑
好的,我看到您在代码中解决了上述问题。下一个问题可能是您声明
/* After execution, return value is assumed to be in AX. */
extern int get_bufferred_long(long int**,int,int);
然后期望一个 32 位返回值。您提到 printf
正在推送 AX
寄存器。这意味着您正在编译为 16 位代码。如果您想要 16 位代码中的 32 位返回值,则必须声明返回值 long
并将其放置在 DX:AX
中。
/* After execution, return value is assumed to be in DX:AX reg pair. */
extern long get_bufferred_long(long int**,int,int);
您可以通过使用 -S
选项将一个小程序编译为程序集来验证正确的返回约定。尝试例如:
long val(void) { return 0x12345678L; }
查看生成的程序集,看看编译器如何返回这个长值。
关于c - 8086/386 asm 与 bcc5 : returning long int from asm proc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13925605/
我正在尝试使用 y 组合器在 Scala 中定义 gcd: object Main { def y[A,B]( f : (A => B) => A => B ) : A => B = f(y(f)
我正在尝试了解返回指向函数的指针的函数,在我尝试编译代码后,它给了我这种错误: cannot convert int (*(int))(int) to int (*(int))(int) in ass
所以我一直在关注 youtube 上的游戏编程教程,然后弹出了这段代码:bufferedImageObject.getRGB(int, int, int, int, int[], int, int);
我正在将时间现在 与存储在数据库某处的时间进行比较。数据库中存储的时间格式为“yyyyMMddHHmmss”。例如,数据库可能会为存储的时间值返回 201106203354。然后我使用一个函数将时间现
例如 Maze0.bmp (0,0) (319,239) 65 120 Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) Maze0.bmp (0,0) (
评论 Steve Yegge的post关于 server-side Javascript开始讨论语言中类型系统的优点和这个 comment描述: ... examples from H-M style
我正在研究 C 的指针,从 Deitel 的书中我不明白 int(*function)(int,int) 和 int*function(int, int) 表示函数时。 最佳答案 C 中读取类型的经验
您好,我使用 weblogic 11g 创建 war 应用程序,我对 joda time 的方法有疑问 new DateTime(int, int, int, int, int, int); 这抛出了
Create a method called average that calculates the average of the numbers passed as parameters. The
var a11: Int = 0 var a12: Int = 0 var a21: Int = 0 var a22: Int = 0 var valueDeterminant = a11 * a12
我正在为一个项目设置 LED 阵列。我得到了一个 LED 阵列,可以根据引脚变化电压进行更改,但我无法添加更多引脚。 当我尝试时,编译失败并显示错误:函数“int getMode(int, int,
除了创建对列表执行简单操作的函数之外,我对 haskell 还是很陌生。我想创建一个列表,其中包含 Int 类型的内容, 和 Int -> Int -> Int 类型的函数. 这是我尝试过的: dat
这个问题已经有答案了: Java add buttons dynamically as an array [duplicate] (4 个回答) 已关闭 7 年前。 StackOverFlow问题今天
我有几个 EditText View ,我想在其中设置左侧的图像,而 setCompoundDrawablesWithIntrinsicBounds 似乎不起作用。图形似乎没有改变。 有人知道为什么会
#include using namespace std; int main() { static_assert(is_constructible, int(*)(int,int)>::val
fun sum(a: Int, b: Int) = a + b val x = 1.to(2) 我在找: sum.tupled(x),或者 sum(*x) 当然,以上都不能用 Kotlin 1.1.3
有一个函数: func (first: Int) -> Int -> Bool -> String { return ? } 返回值怎么写?我对上面 func 的返回类型感到很困惑。 最
type foo = A of int * int | B of (int * int) int * int 和 (int * int) 有什么区别?我看到的唯一区别在于模式匹配: let test_
我正在尝试制作一个 slider 游戏。在这个类中,我使用 Graphics 对象 g2 的 drawImage 方法来显示“拼图”的 block 。但在绘制类方法中,我收到此错误:找不到符号方法dr
我试着理解这个表达: static Func isOdd = i => (i & 1) == 1; 但是这是什么意思呢? 例如我有 i = 3。然后 (3 & 1) == 1 或 i = 4。然后
我是一名优秀的程序员,十分优秀!