当尝试在 x86 程序集中为引导加载程序编写一些例程时,我遇到了一个错误,当发生除法错误时,程序将陷入无限循环。通过调查,我发现调用 int 0 会正常通过异常处理程序,然后继续执行程序的其余部分。为 x86 编写自己的异常处理程序,发生除法错误异常时的返回地址是指令的地址,这意味着它将永远循环执行除法。这是正常行为还是 Virtualbox/我的 cpu 特有的错误?
org 0x7c00 ;put all label addresses at offset 0x7c00
xor ax, ax ;set up all segment registers
mov ds, ax
mov ax, 0x9000
mov ss, ax
mov sp, 0x1000
mov ax, 0xB800 ;video text memory starts at this address
mov es, ax
mov ah, 0x00
mov al, 0x02
int 0x10 ;go into 80x25 monochrome text
mov [0x0000], word DivideException
mov [0x0002], word 0x0000
xor di, di
xor bx, bx …Run Code Online (Sandbox Code Playgroud) 我正在Windows机器上的8086程序集中处理一个项目,我需要知道单击了哪个鼠标按钮.这有什么中断?或者我该如何找到这个?
谢谢
找一个程序员程序员很难帮助我
我是一个成熟的Delphi程序员,它有一个Delphi的旧版本,不是.net而且我有一个*.dll,我正在转换为.net的Delphi代码我在一个很大的学习曲线听到我知道的很少.net呢.我今天刚拿到一台装有.net的电脑!!!!!!
我通过一个解析器运行*.dll并开始在Delphi程序集中编写跳转链接,你不做任何寻址,只是引用链接.
该文件具有固定的字符串结构(我认为C++)ASCII和ANSI字符串1 /我不知道如何识别代码如何引用这些结构
2 /我不知道功能是否开始以及它们的外形
代码是免费的,任何人都可以看到它们的功能并不多.但我必须通过电子邮件发送它,因为堆栈溢出不允许我显示它.
你可以为我提供技术,或者你可以将我推荐给你认识的朋友,请给我技术人员吗?
首先,我要道歉,英语不是我的母语,我无法想出一个更适合我的情况的头衔.
我得到了这个不完整的汇编代码:
.code
mov [mybyte],______
mov SP,0574h
xor ax,ax
here:
add AL,[mybyte]
push AX
dec BYTE PTR [mybyte]
jnz here
pop es
nop
Run Code Online (Sandbox Code Playgroud)
问题是:_____应该写什么,这样当我们达到"nop"命令时,SP的值将是570.
我理解这个问题,我认为我也理解代码,但问题是,我看到它的方式 - SP永远不会改变.代码中唯一引用SP的位置在该行mov sp,0574h.所以无论我们在____所在的位置写什么,SP都不会改变.
我对么?或者我误解了代码?
我正在学习组装测试和"位置无关代码"的主题,我发现相对跳跃和绝对跳跃混淆之间的区别.我怎么知道它是什么样的跳跃?
我理解相对跳跃是什么(从当前线的偏移).但绝对跳跃是什么样的?它什么时候发生?
我开始掌握asm编程但我觉得我遗漏了一些关于使用寄存器来存储变量的东西.我遇到的问题是,由于内部原因,某些指令会修改其他寄存器.在某些情况下,我使用这些寄存器来存储应用程序逻辑.如何使用寄存器有什么黄金法则吗?
例如:以下代码更改dx寄存器并清除当前变量.
mov ax, 04h mov bx, 02h mul bx
我不想也不说我希望dx寄存器被清除掉.这里发生了什么?
8086和其他处理器的复位引脚将使CS:IP指向FFFF:0000,这是内存的最低16字节.在该位置,存在到存储器空间中的其他地方的跳转指令以初始化处理器.
我的问题是,为什么指向最后一节然后故意跳到其他地方?为什么处理器制造商不将CS:IP重置为0000:0000?然后,他们可以写一些初始指令,没有任何跳跃!!
这没有意义吗?
我在我的旧书中研究了DOS的x86汇编编程,在关于中断的讨论中,我看到了13h的编程.这本书说我可以用它来格式化一个驱动器.但不幸的是,在我的书中没有提供关于如何做到这一点的更多信息.
我变得非常好奇,并试图自己使用它,但它不起作用.如何使用16位x86汇编在驱动器A:中格式化软盘?这样做很简单吗?我正在使用TASM编译和链接,并在MS-DOS中运行.
也许除了使用之外还有其他方法int 13h吗?
我在为gets()我的一个类做的C代码上创建一个函数时遇到了一些问题.所以我已经有一个getchar()功能,但在汇编,我从C调用它extern的东西是,目前我正在运行代码我输入一个字符串,它不显示完整的字符串而不是一些字符.
这是我的代码:C代码:
extern char getchar(void);
extern void putchar(char data);
void gets(char *str);
void puts(char *str);
void new_line();
char string[20];
int main(){
while(1){
gets(string);
new_line();
puts(string);
}
return 0;
}
void new_line(){
putchar(0xD);
putchar(0xA);
}
void gets(char *str){
unsigned char i = 0;
while((*str = getchar()) != 0xD){
str[i] = getchar();
i++;
}
}
void puts(char *str){
while(*str){
putchar(*str++);
}
}
Run Code Online (Sandbox Code Playgroud)
和我的ASM代码以防万一:
.MODEL tiny
.CODE
public _putchar
public _getchar
_putchar PROC
push bp
mov bp, …Run Code Online (Sandbox Code Playgroud) 我试图理解此递归代码,但对的目的感到困惑add bx, 2。我已经在相关行上打上了标记。据我了解,我们必须用值增加指向数组的指针,但是为什么我们要加2而不是1?
.model small
.stack 100
.data
arr dw 38, 39, 90, 94, 13, 24, 53, 59, 63
size dw 9
result dw ?
.code
func proc
push bp
mov bp, sp
push ax
push bx
push cx
push dx
mov cx, [bp+4]
mov bx, [bp+6]
mov ax, [bx]
cmp cx, 1
ja more
mov [bp+6], ax
jmp done
more:
**add bx, 2**
push bx
dec cx
push cx
call func
pop dx
cmp dx, ax
jg …Run Code Online (Sandbox Code Playgroud)