2014-01-29 2 views
-1

Я не могу получить следующий код для запуска. Он компилируется, но просто дает пустой результат. Im пытается взять значение HEX_OUT, удалить конечный ноль, а затем и со значением регистра dx, так что значение HEX_OUT теперь является значением dx. Любая помощь приветствуется.Простая функция сборки не работает

Спасибо,

Ash

; prints the value of DX as hex. 
print_hex: 
pusha 

mov ax, HEX_OUT  ; ax = 0x00000 
shr ax, 1  ; remove trailing 0 
and ax, dx  ; and registers and store in ax 

     ; TODO :manipulate chars at HEX_OUT to reflect DX 

mov bx, ax   ; print the string pointed to  
call print_string ; by BX 

popa 
ret 

; global variables 
HEX_OUT : db '0x0000',0 
+1

Какие сообщения об ошибках вы получаете? Какой ассемблер вы используете? Где указано 'print_string'? – lurker

+0

Строка печати определяется в другом файле .asm, оба являются частью файла «master». Все это компилируется без ошибок, используя nasm, но когда вы запускаете его, его просто давая пустой вывод – user3249855

+0

, также, если я прокомментирую строку shr и строку и он отображает 0x0000 .... так что это должно быть чем-то связано с этими две строки – user3249855

ответ

0

HEX_OUT не является двоичным числом; это адрес строки (это просто шестнадцатеричное представление числа). shr ax,1 не управляет строками; он не сдвигает символы. Он управляет двоичными числами; он сдвигает бит.

Самый простой выход, чтобы избежать строк вообще:

HEX_OUT: dw 0000h ; or whatever number you like 

Я надеюсь, что у вас есть функция, как print_number в вашем распоряжении:

mov bx, ax   ; or whatever register is the input for that function 
call print_number ; or whatever is the name of that function 

Потому что в противном случае вам придется написать (или find) код для преобразования двоичного числа в шестнадцатеричное строковое представление, так что вы можете подать его до print_string.

Смежные вопросы