Печатать маленький или большой порядок байтов в сборке 8086 - PullRequest
1 голос
/ 12 октября 2019

Я хочу проверить порядковый номер моего компьютера в сборочной программе (8086) и распечатать его.

Я знаю, что такое порядковый номер и как его найти. Это о том, как данные хранятся в памяти. Например, если вы храните 1234, он будет храниться 3412 (маленький) или 1234 (большой). Но я не знаю, как это сделать на ассемблере. Я думаю о сохранении чего-либо в памяти, чем загрузить его и сравнить с оригиналом. Это должно быть именно так, как говорит теория. Если я сохраню 1234, я буду загружать его как 3412 или 1234. У меня проблема, когда я пытаюсь создать оператор if.

litte db "little$" 
big db "big$"  

mov ax, var1
cmp ax, var2
je equal
jmp notequal


equal:
lea dx, big
notequal:
lea dx, little

Я ожидаю, что он будет печататься маленьким или большим, но независимо от того, чтозначения, которые я помещаю в var1 и var 2, он всегда печатает мало, потому что каким-то образом код выполняется построчно. Разве это не должно идти только к одному лейблу, «равно» или «нота»? Я хочу что-то вроде:

if var1==var2
print big
else
print little

1 Ответ

3 голосов
/ 12 октября 2019

Этот сегмент будет всегда печатать "немного", поскольку, даже если вы начнете выполнение в equal, он будет продолжаться до notequal:

equal:
    lea dx, big
notequal:
    lea dx, little

Что бы вынужно что-то вроде:

equal:
    lea dx, big
    jmp done
notequal:
    lea dx, little
done:
    ; carry on

Кроме того, вы должны сохранить слово 1234h в некоторой ячейке памяти y, а затем прочитать байт обратно из того же места.

Если 12h, то вы в порядке байтов. Значение 34h означает little-endian.

Все остальное означает, что у вас есть проблема с памятью: -)

Кстати, я почти уверен, что все процессоры x86 имеют младший порядок, поэтомуЕсли вы пишете это на ассемблере x86, вам, вероятно, не нужно для проверки.


В качестве примера вы можете использовать Coding Ground со следующим кодом, чтобы увидеть его в действии:

section .text
    global _start

_start:
    mov  ax, 0x1234        ; load up 1234 hex
    mov  [myword], ax      ; store that word to memory
    mov  al, [myword]      ; get first byte of that
    cmp  al, 0x12          ; 12 means big endian
    je   big
little:
    mov  edx, l_len        ; prepare for little message
    mov  ecx, l_msg
    jmp  print
big:
    mov  edx, b_len        ; prepare for little message
    mov  ecx, b_msg

print:
    mov  ebx, 1            ; file handle 1 = stdout
    mov  eax, 4            ; 'syswrite' function call
    int  0x80

    mov  eax, 1            ; 'exit' function call
    int  0x80

section .data

myword   dw   0

l_msg    db   'Little endian', 0xa
l_len    equ  $ - l_msg

b_msg    db   'Big endian', 0xa
b_len    equ  $ - b_msg

В окне вывода отображается, как и ожидалось:

$ nasm -f elf *.asm; ld -m elf_i386 -s -o demo *.o
$ demo
Little endian
...