Tag: x86 16

如何从ASM堆栈中的C代码访问双指针

我有一个main.c函数,它有以下声明: int initarr(int**arr, int n, int (*initfunc)(int)); 然后我在c调用函数: success = initarr(&arr, n, getNum); 问题是,在汇编代码中,在MODEL SMALL ,上面函数中的第一个参数将作为WORD或DWORD存在于内存中? 换句话说,当我编写代码时,这会工作: PUSH BP MOV BP,SP PUSH DI MOV DI, WORD PTR[BP+4] ; DI will hold &arr. 现在DI将持有arr的地址。 如果是,如果是这样,我怎样才能访问arr [0]的值? PUSH BP MOV BP,SP PUSH DI PUSH BX MOV DI, WORD PTR[BP+4] MOV BX, WORD PTR[DI] BX会保存数组的地址吗? 我的意思是,第一个细胞的地址? 如果是这样,我现在如何访问arr [0]? […]

从C调用的Intel 8086汇编程序

我需要为汇编语言开发一个过程,并从C语言调用该过程(传递一个字符串并返回一个整数值)。 我的assembly程序很好“独立”。 我需要帮助将它们连接在一起。 程序应该在Intel 8086上运行。我需要使用MASM或emu8086作为汇编程序/模拟器。 请推荐一个C编译器,以及制作能够调用汇编过程并获取返回值的简单C程序的方法。 如何将字符串传递给此外部函数? 如何连接ASM文件和C文件? (编译器如何知道此过程的定义/代码在哪里?) 如何从汇编语言中获取从C发送的字符串,以及如何将整数返回到C?

当我按下键盘上的键时,如何防止重复的字符

我试图学习如何防止键盘发送多个字符到屏幕和DOS下扫描。 我正在使用带有内联汇编的Turbo-C。 如果键盘上输入的字符是: 嗯嗯嗯嗯 在控制台上看到并由scanf处理的字符将是: 我的名字是Haim 基本输出来自C中的代码,我不允许触摸。 我必须实现eliminate_multiple_press和uneliminate_multiple_press而不触及uneliminate_multiple_press的代码。 我到目前为止写的Turbo-C代码是: #include #include #include volatile char key; volatile int i=0; void interrupt (*Int9save) (void); void interrupt kill_multiple_press() { asm{ MOV AL, 0 MOV AH,1 INT 16h PUSHF CALL DWORD PTR Int9save MOV AX,0 } asm{ JZ notSet MOV key, AL MOV AH, 04H INT 16H } notSet: […]

解释AF标志在x86指令中的工作原理?

我有一个小的8086模拟器,我有一个长期的错误2年,现在AF在sub内部表现不正常并添加说明。 我目前计算其值的方法是8位数和减法: uint8_t base=… , subt=… base=base&0xF; subt=subt&0xF; //isolate bottom nibble if((int16_t)base-subt>7 || (int16_t)base-subt<-7){ flags.af=1; }else{ flags.af=0; } (假设像sub base,subt这样的指令) 并添加它是这样的: uint8_t base=… , adder=… base=base&0xF; adder=adder&0xF; //isolate bottom nibble if(base+adder>7 || base+adder<-7){ flags.af=1; }else{ flags.af=0; } (对于像add base,adder这样的指令) 如何正确计算模拟器中的AF标志以获取此类指令?

如何用C语言编写linux启动代码?

我是学习OS开发的新手。 从我读过的书中,它说启动加载器会将第一个MBR复制到0x7c00,并从实模式开始。 并且,示例从16位汇编代码开始。 但是,当我查看今天的linux内核时, arch / x86 / boot有’header.S’和’boot.h’,但实际代码是在main.c中实现的。 这似乎是“不编写汇编”有用的。 但是,这是如何在Linux中专门完成的? 我可以粗略地想象可能有特殊的gcc选项和链接策略,但我看不到细节。

是否有针对8086的C编译器?

我有一个8086 CPU仿真器。 它仅模拟8086条指令。 我正在寻找一个C编译器来定位这个模拟器。 有没有可以做到这一点的C编译器? 此外,拥有一个可用的libc等对我来说并不重要。 模拟器使用自定义(即非PC)硬件,因此任何libc甚至ctr0都可能不得不重写

什么是近,远和巨大的指针?

任何人都可以用适当的例子向我解释这些指针……当这些指针被使用时?