Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
x86为什么我在移动变量时总是在al寄存器中获取CD_X86_Dos_X86 16_Emu8086_Real Mode - Fatal编程技术网

x86为什么我在移动变量时总是在al寄存器中获取CD

x86为什么我在移动变量时总是在al寄存器中获取CD,x86,dos,x86-16,emu8086,real-mode,X86,Dos,X86 16,Emu8086,Real Mode,标题说明了这个问题。但基本上每次我使用MOV指令和一个变量来注册寄存器显示CD。但是当我使用一个实际的数字时,寄存器会显示这个数字吗 mov ax、@data是否意味着将数据段内存地址移动到ax寄存器,并且它是否必须是ax寄存器的专用地址。或者,如果我想处理bx寄存器中的变量,我可以执行类似于move mov bx、@data的操作。请回答 为什么我要做mov ds,ax ds做什么为什么我很困惑有人帮我。因为你使用的是.model small指令,汇编程序会创建一个.EXE类型的程序。您需要更

标题说明了这个问题。但基本上每次我使用MOV指令和一个变量来注册寄存器显示CD。但是当我使用一个实际的数字时,寄存器会显示这个数字吗

mov ax、@data是否意味着将数据段内存地址移动到ax寄存器,并且它是否必须是ax寄存器的专用地址。或者,如果我想处理bx寄存器中的变量,我可以执行类似于move mov bx、@data的操作。请回答

为什么我要做mov ds,ax ds做什么为什么我很困惑有人帮我。

因为你使用的是.model small指令,汇编程序会创建一个.EXE类型的程序。您需要更好地了解实模式分段寻址,才能从.EXE开始工作

幸运的是,还有一种更简单的程序格式。COM类型的程序从所有段寄存器彼此相等开始。CS=DS=ES=SS。您可以仅从偏移轻松工作。这是学习组装的最佳选择

例如:

ORG 256          ;              This asks for a .COM program

mov  bl, var1    ;              Very first instruction in the program
mov  ax, var2

mov  ax, 4C00h   ; DOS.TerminateProgram
int  21h

var1  db 4       ; Byte         Place all the data below the code!
var2  dw 1000    ; Word 
没什么了。

因为您使用的是.model small指令,所以汇编程序会创建一个.EXE类型的程序。您需要更好地了解实模式分段寻址,才能从.EXE开始工作

幸运的是,还有一种更简单的程序格式。COM类型的程序从所有段寄存器彼此相等开始。CS=DS=ES=SS。您可以仅从偏移轻松工作。这是学习组装的最佳选择

例如:

ORG 256          ;              This asks for a .COM program

mov  bl, var1    ;              Very first instruction in the program
mov  ax, var2

mov  ax, 4C00h   ; DOS.TerminateProgram
int  21h

var1  db 4       ; Byte         Place all the data below the code!
var2  dw 1000    ; Word 

没什么了。

您的代码没有设置DS寄存器,因此您的内存访问来自错误的位置。在代码开始时,您需要执行mov ax、@data mov ds、ax之类的操作来设置ds。您一直看到CD的原因是,在程序段前缀的偏移量0处,有一条int 20h指令用于终止程序。int 20h指令编码为0CDh,020h。我忘了在将DS设置为@data段之前,默认DS指向DOS。它比这更复杂,超出了注释中的解释范围。您需要了解实模式段偏移量寻址。你可能需要找到使用EMU8086的教程。我不确定在现代学习逆向工程时,实模式代码和EMU8086是否能很好地利用时间,因为EMU8086模拟16位DOS,并且大多数操作系统和运行在其中的代码都是在32位和64位模式下运行的。现代x86代码32位和64位模式使用平面内存模型,除了用于线程本地存储的FS或GS之外,所有段基址都设置为0,但它们的基址通常由不同的机制设置。对于现代逆向工程来说,16位分段记忆模型完全是在浪费你的时间和大脑中的记忆,特别是在实际模式中,分段寄存器的含义与保护模式或长模式不同。如果你想继续使用16位DOS代码,而不是使用普通Windows调用的32或64位代码,Sep的答案是好的。你的代码没有设置DS寄存器,因此你的内存访问来自错误的位置。在代码开始时,您需要执行mov ax、@data mov ds、ax之类的操作来设置ds。您一直看到CD的原因是,在程序段前缀的偏移量0处,有一条int 20h指令用于终止程序。int 20h指令编码为0CDh,020h。我忘了在将DS设置为@data段之前,默认DS指向DOS。它比这更复杂,超出了注释中的解释范围。您需要了解实模式段偏移量寻址。你可能需要找到使用EMU8086的教程。我不确定在现代学习逆向工程时,实模式代码和EMU8086是否能很好地利用时间,因为EMU8086模拟16位DOS,并且大多数操作系统和运行在其中的代码都是在32位和64位模式下运行的。现代x86代码32位和64位模式使用平面内存模型,除了用于线程本地存储的FS或GS之外,所有段基址都设置为0,但它们的基址通常由不同的机制设置。对于现代逆向工程来说,16位分段记忆模型完全是在浪费你的时间和大脑中的记忆,特别是在实际模式中,分段寄存器的含义与保护模式或长模式不同。如果你想继续使用16位DOS代码,而不是使用普通Windows调用的32或64位代码,Sep的答案是好的。