Refactor nasm hex di git печать кода для использования петель? - PullRequest
0 голосов
/ 23 февраля 2020

Хорошо, у меня почти та же проблема, что и здесь: Печать шестнадцатеричного кода из dx с помощью nasm , но мой исходный код и проблемы немного отличаются, поэтому я решил опубликовать свой собственный вопрос относительно того, как решить эту проблему. В целом, я просто пытаюсь напечатать 16-битное значение в виде строки, используя nasm, у меня уже есть процедура printf, и у меня есть действующий рабочий код для печати шестнадцатеричных цифр как таковой:

; dx: 16 bit argument to print
printh:
    pusha                           ; push all registers to stack

    mov bx, dx                      ; bx = dx
    shr bx, 12                      ; bx = 0x000*   
    mov bx, [bx + HEX_TABLE]        ; convert 4bit number to hex digit
    mov [HEX_PATTERN + 2], bl       ; replace in template string

    mov bx, dx
    shr bx, 8
    and bx, 0x000f
    mov bx, [bx + HEX_TABLE]
    mov [HEX_PATTERN + 3], bl

    mov bx, dx
    shr bx, 4
    and bx, 0x000f
    mov bx, [bx + HEX_TABLE]
    mov [HEX_PATTERN + 4], bl

    mov bx, dx
    and bx, 0x000f
    mov bx, [bx + HEX_TABLE]
    mov [HEX_PATTERN + 5], bl

    mov si, HEX_PATTERN             ; store start address of string for printf
    call printf

    popa                            ; pop registers from stack
ret


HEX_PATTERN: db '0x****', 0x0a, 0x0d, 0         ; null-char terminated string + LF + CR
HEX_TABLE: db '0123456789abcdef'

Проблема в том, что, пытаясь сделать код лучше, используя al oop, я получаю сообщение об ошибке, что я использую «недопустимые режимы адресации»:

printh_loop:
    pusha

    mov ax, 2
    mov cx, 0
    loop:
            mov bx, dx
            shr bx, [SHIFTS_TABLE + cx]     ; offset by 12, 8, 4, 0 respectively
            and bx, 0x000f                  ; mask to keep last 4 bits
            mov bx, [bx + HEX_TABLE]        ; convert 4 bit digit to ascii value
            mov [HEX_PATTERN + ax], bl      ; HEX_PATTERN[ax] = bl
            cmp cx, 3
            inc cx                          ; increment counters
            inc ax 
            jne loop

    mov si, HEX_PATTERN                     ; set string address to use for printf
    call printf

    popa
ret

HEX_PATTERN: db '0x****', 0x0a, 0x0d, 0         ; null-char terminated string + LF + CR
HEX_TABLE: db '0123456789abcdef'
SHIFTS_TABLE: db 'C840'

В строках, где я выполняю shr bx, [SHIFTS_TABLE + cx] и mov [HEX_PATTERN + ax], bl

Я почти уверен, что должен быть способ написать эффективный код, но Я в целом достаточно 1020 * в сборке, поэтому любая помощь в этом вопросе очень ценится

Редактировать: Вот пример ошибки

nasm -fbin main.asm -o main.bin
printh.asm:11: error: invalid effective address
make: *** [makefile:2: main.bin] Error 1
...