x86为什么我在移动变量时总是在al寄存器中获取CD
标题说明了这个问题。但基本上每次我使用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。您可以仅从偏移轻松工作。这是学习组装的最佳选择 例如: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类型的程序。您需要更
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的答案是好的。