В настоящее время у меня есть задание, в котором я должен кодировать на языке ассемблера, где вы вводите пользовательский ввод, чтобы получить 4-значное шестнадцатеричное значение и преобразовать его в двоичное, а затем, после того, как вы получите двоичное значение, вы должны преобразовать его в день месяца и год, где первые 7 цифр — год, следующие четыре — месяц, а последние 5 — день.
У меня все преобразовано в двоичный формат, и я знаю, как преобразовать его из двоичного в обычные целые значения года, месяца и дня. Когда я запускаю свой код, вывод равен 0/0/0
. Я не уверен, то ли это, где я испортил свое переключение или что-то еще. Не могли бы вы, ребята, взглянуть и дать мне информацию о том, где исправить? В коде, который я вставляю, я добавляю только calcYear и полагаю, что могу понять это, а затем работать над остальными оттуда.
Мой код:
firstLine:
call crlf
mov si, offset programOne
mov cx, programOneLen
call putStrng ;displays 'Program by Joe Remaklus'
call crlf
call crlf
call inputVal ;prompt for hex input
call putBin ;display the value in AX as binary
call crlf
call calcYear ;display the year of the first 7 binary digits.
mov si, offset slash
mov cx, slashLen
call putStrng
call calcMonth ;display the month of the next 4 binary digits.
mov si, offset slash
mov cx, slashLen
call putStrng
call calcDay ;display the day of the next 5 binary digits.
call crlf
call inputVal
call putBin
mov ah,04c
int 021
prompt db 'Enter a 4-digit hex value'
lenPrompt = $-prompt
inputVal:
push si, cx
mov si, offset prompt
mov cx, lenPrompt
call putStrng
call crlf
call getHex
call crlf
pop cx, si
ret
;---------------------------------------------------------------
putBin:
push ax, cx, dx
mov cx, 16 ;number of bits to display
putBinLoopTop:
mov dl, '0' ;assume bit to display is zero
shl ax, 1 ;shift bit to display into Carry Flag
jnc putBinSkipInc ;if the top bit was zero skip the inc
inc dl ;else inc DL to '1'
putBinSkipInc:
call putChar ;display the character in DL
loop putBinLoopTop ;continue until 16 bits are displayed
pop dx, cx, ax
ret
;---------------------------------------------------------------
calcYear:
mov year, 0
mov si, 0
shl ax, 1
adc si, 0
iMul onetwoeight
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul sixfour
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul threetwo
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul sixteen
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul eight
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul four
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul two
add year, si
mov si, 0
shl ax, 1
adc si, 0
iMul one
add year, si
mov si, year
add si, 1980
call putPos
ret
shl ax
/adc si, 0
эквивалентно тестированию бита на топоре, а затем использованиюsetcc
. (например,xor dx,dx
/bt ax, 3
/setc dl
, за исключением того, что это не изменяетax
) Я совсем не уверен, что вашиimul
имеют смысл. Может быть, это действительно окольный способ сделать что-то, но я не понял, что. Вы же знаете, что умножение на степень двойки — это то же самое, что сдвиг, верно? Кроме того, вы можете все время хранитьyear
вsi
вместо того, чтобы все время использовать место назначения в памяти. - person Peter Cordes   schedule 28.04.2016