我想拆解我的可启动x86磁盘的MBR(前512字节).我已经将MBR复制到了一个文件中
dd if=/dev/my-device of=mbr bs=512 count=1
Run Code Online (Sandbox Code Playgroud)
对可以反汇编文件的Linux实用程序的任何建议mbr?
我是C的新手,它是继Java之后的第二种高级编程语言.我已经掌握了大部分基础知识,但无论出于何种原因,我无法将单个字符写入屏幕内存.
该程序使用Turbo C for DOS编译,运行速度为120mhz的Am486-DX4-100.该显卡是使用Trio32芯片的非常标准的VLB Diamond Multimedia Stealth SE.
对于操作系统,我运行的PC-DOS 2000加载了ISO代码页.我正在使用标准的MDA/CGA/EGA/VGA 80列文本模式运行.
这是我编写的程序:
#include <stdio.h>
int main(void) {
unsigned short int *Video = (unsigned short int *)0xB8000;
*Video = 0x0402;
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如我所说,我对C很新,所以如果我的错误显而易见,我道歉,我无法找到一个可以理解的如何做到这一点的可靠来源.
据我所知,在x86平台上的实模式下,文本模式的屏幕内存从0xB8000开始.每个字符存储在两个字节中,一个用于字符,一个用于背景/前景.我的想法是将值0x0402(应该是一个红色的笑脸)写入0xB8000.这应该放在屏幕的左上角.
我已经考虑了屏幕可能滚动的可能性,因此在执行时会立即以两种方式删除我的角色.要解决此问题,我尝试过:
我可以读取并打印我写入内存的值,所以它显然仍然在内存中,但无论出于何种原因,我都没有在屏幕上显示任何内容.我显然做错了,但我不知道会出现什么问题.如果需要任何其他细节,请询问.感谢您提供任何可能的帮助.
我很好奇有多少种方法可以在x86汇编中将寄存器设置为零.使用一条指令.有人告诉我,他设法找到了至少10种方法.
我能想到的是:
xor ax,ax
mov ax, 0
and ax, 0
Run Code Online (Sandbox Code Playgroud) 我已经学会了如何使用80x86汇编程序,所以在逐位移位操作中,我遇到了SAL和SHL使用的问题.我的意思是代码行之间的区别如下:
MOV X, 0AAH
SAL X, 4
MOV X, 0AAH
SHL X, 4
Run Code Online (Sandbox Code Playgroud)
什么时候应该使用SHL和使用SAL?它们有什么区别?
我想在标准 C++ 中将任何大小整数的前导零位设置为 1。
例如。
0001 0011 0101 1111 -> 1111 0011 0101 1111
我发现执行此操作的所有算法都需要相当昂贵的前导零计数。然而,这很奇怪。有非常快速且简单的方法来执行其他类型的位操作,例如:
int y = -x & x; //Extracts lowest set bit, 1110 0101 -> 0000 0001
int y = (x + 1) & x; //Will clear the trailing ones, 1110 0101 - > 1110 0100
int y = (x - 1) | x; //Will set the trailing zeros, 0110 0100 - > 0110 0111
Run Code Online (Sandbox Code Playgroud)
因此,这让我认为必须有一种方法可以在由基本位运算符组成的一行简单代码中设置整数的前导零。请告诉我还有希望,因为现在我正在准备反转整数中的位顺序,然后使用设置尾随零的快速方法,然后再次反转整数以将前导零设置为 1。这实际上比使用前导零计数要快得多,但与上面的其他算法相比仍然相当慢。
template<typename T>
inline constexpr void reverse(T& x)
{
T rev …Run Code Online (Sandbox Code Playgroud) 因此,正如问题所述,在英特尔8086中CS和IP寄存器的目的是什么
我找到了这个解释:
代码段(CS)是一个16位寄存器,包含带有处理器指令的64 KB段的地址.处理器使用CS段来访问指令指针(IP)寄存器引用的指令.CS寄存器不能直接更改.CS寄存器在远跳,远程调用和远程返回指令期间自动更新.
这对于IP:
指令指针(IP)是一个16位寄存器.
我真的不明白这基本上意味着什么,所以如果有人能提供更"生动"的解释,那就太棒了:)
我现在正在参加一个装配课程,那个检查我们家庭作业的人是一个非常迂腐的老派优化狂.例如,如果他看到,他会扣除10%:
mov ax, 0
Run Code Online (Sandbox Code Playgroud)
代替:
xor ax,ax
Run Code Online (Sandbox Code Playgroud)
即使它只使用一次.
我不是一个完整的汇编程序初学者,但我不是一个优化专家,所以我需要你的帮助(可能是一个非常愚蠢的问题,但无论如何我都会问):如果我需要将寄存器值设置为1或(-1)最好使用:
mov ax, 1
Run Code Online (Sandbox Code Playgroud)
或做类似的事情:
xor ax,ax
inc ax
Run Code Online (Sandbox Code Playgroud)
我真的需要一个好成绩,所以我试图让它尽可能优化.(我需要优化时间和代码大小)
我想将高级语言中的简单循环转换为汇编语言(对于emu8086)说,我有这样的代码:
for(int x = 0; x<=3; x++)
{
//Do something!
}
Run Code Online (Sandbox Code Playgroud)
要么
int x=1;
do{
//Do something!
}
while(x==1)
Run Code Online (Sandbox Code Playgroud)
要么
while(x==1){
//Do something
}
Run Code Online (Sandbox Code Playgroud)
我如何在emu8086中执行此操作?