注意事项:使用x86程序集(16位);使用Nasm;在DosBox中运行程序。
当我尝试在DosBox中运行程序时,模拟器冻结(我不确定冻结是正确的单词,因为光标仍然闪烁)并且拒绝响应输入。我第一次尝试运行它DosBox实际上崩溃了。
这是我的代码:
;ASSIGNMENT 3
org 100h
section.data:
prompt1 db 0dh, 0ah, 0dh, 0ah, "Please input a signed base-10 integer: $"
prompt2 db 0dh, 0ah, "Your number in binary is: $"
prompt3 db 0dh, 0ah, "Pretty sure that wasn't a number. Please enter a number value. $"
section.text:
START:
mov ah, 9 ;Display input prompt
mov dx, prompt1
int 21h
DEC_IN:
mov bx, 0 ;Get input
mov ah, 1
int 21h
cmp al, 0dh ;compare input to carriage return; check if user is finished
je DEC_OUT ;if yes, go display the prompt
cmp al, '0' ;compare to '0'
jg IS_DIGIT ;jump to IS_DIGIT to confirm that it is a number
jl NAN_ERROR ;if below 0, print error prompt and start over
IS_DIGIT:
cmp al, '9' ;confirms digit value
jl BIN_CONV ;if digit, convert to binary
jg NAN_ERROR ;if not, print 'not a number' error message
BIN_CONV:
and al, 0fh ;converts ASCII to binary
neg al ;one's complement
add al, 1 ;add 1 to make two's compliment
jmp ADDIT ;add to bx
ADDIT:
or bl, al ;adds new digit to sum in bx
int 21h
jmp DEC_IN
NAN_ERROR:
mov ah, 9 ;display error message
mov dx, prompt3
int 21h
jmp START ;Go back to beginning
DEC_OUT:
mov ah, 9 ;Display the signed decimal value
mov dx, prompt2
int 21h
如果重要,程序应该以无符号十进制值的形式获取输入,并将其输出为带符号的十进制值,然后作为八进制值输出。我知道我的程序没有这样做,即使它确实运行了;它还处于早期发展阶段。
提前致谢
答案 0 :(得分:0)
您应该学会尽可能使用调试器作为“早期开发”。
也就是说,确保你的数据在代码之后是,否则cpu会尝试执行它作为指令而且不会很漂亮。
请注意section.data:
是错误的,你不能使用冒号,因为它不是标签,你必须在点之前加一个空格,如section .data
。同样地,section.text:
当然也是如此。如果您这样做,nasm
将足够聪明,可以将数据放在代码之后。
尽管如此,DOS .com
文件没有部分,这只是我不建议使用的nasm
的便利功能。