Assembly 将值移动到ax寄存器,但打印时交换值

Assembly 将值移动到ax寄存器,但打印时交换值,assembly,Assembly,我正在尝试使用aam指令并尝试打印它。从下面的代码中,我已将ax reg复制到结果,但当我尝试打印它时,输出结果是相反的。在下面的代码中,我尝试将9乘以9,输出变成18。我不知道为什么。从我读到的,啊变成了十位,艾尔变成了一位。但当我尝试将其移动到结果时,值是交换的。ah不应该是ax注册表中的前8位吗?然后是艾尔?我真的很困惑。使用mov指令是否切换这些位置?有人能解释一下原因吗。我不熟悉集会,所以请容忍我。我正在使用Tasm btw,并且在Windows下。谢谢 .model small .

我正在尝试使用aam指令并尝试打印它。从下面的代码中,我已将ax reg复制到结果,但当我尝试打印它时,输出结果是相反的。在下面的代码中,我尝试将9乘以9,输出变成18。我不知道为什么。从我读到的,啊变成了十位,艾尔变成了一位。但当我尝试将其移动到结果时,值是交换的。ah不应该是ax注册表中的前8位吗?然后是艾尔?我真的很困惑。使用mov指令是否切换这些位置?有人能解释一下原因吗。我不熟悉集会,所以请容忍我。我正在使用Tasm btw,并且在Windows下。谢谢

.model small

.stack 100h

.data

num1 db 2 dup('0')

num2 db 2 dup('0')

result dw 2 dup('0')


.code
    main proc

    mov ax, @data
    mov ds, ax

    mov ah, 0
    mov al,9
    mov ah,9
    mul ah
    aam

    or ax, 3030h
    mov result, ax  


    mov dx, result
    mov ah, 02
    int 21h

    mov dx, result + 1
    mov ah, 02
    int 21h

    mov ax, 4c00h
    int 21h

main endp
end main
ah不应该是ax注册表中的前8位吗?然后是艾尔

这取决于“前8位”是什么意思。AL是最低有效8位;如果从0到15对位进行编号,则AL对应于位0到7,AH对应于位8到15

在您的示例中,您将AX寄存器存储到内存位置,
result
。由于体系结构是小端的,AL寄存器的内容将在
结果
处找到,而AH的内容将在
结果+1
处找到。你把它们弄混了

事实上,正是little endian表示确定了AH值相对于AL值的存储位置。您可能希望读取,但简而言之,当您存储多字节值时,最低有效字节存储在最低寻址内存位置。这与大端体系结构相反

ah不应该是ax注册表中的前8位吗?然后是艾尔

这取决于“前8位”是什么意思。AL是最低有效8位;如果从0到15对位进行编号,则AL对应于位0到7,AH对应于位8到15

在您的示例中,您将AX寄存器存储到内存位置,
result
。由于体系结构是小端的,AL寄存器的内容将在
结果
处找到,而AH的内容将在
结果+1
处找到。你把它们弄混了


事实上,正是little endian表示确定了AH值相对于AL值的存储位置。您可能希望读取,但简而言之,当您存储多字节值时,最低有效字节存储在最低寻址内存位置。这与big-endian体系结构形成对比,后者的作用正好相反。

Wow。谢谢但如果我可以问一下,这是否适用于使用mov指令时的所有情况?我也读过关于大端和小端的书。我想我遇到的问题是小问题。有没有办法确定我使用的是小端还是大端?@random x86总是小端。另外,endianess仅在从寄存器移动到内存时才重要,反之亦然。谢谢但如果我可以问一下,这是否适用于使用mov指令时的所有情况?我也读过关于大端和小端的书。我想我遇到的问题是小问题。有没有办法确定我使用的是小端还是大端?@random x86总是小端。此外,endianess仅在从寄存器移动到内存时才重要,反之亦然。