Assembly 8086装配部

Assembly 8086装配部,assembly,nasm,x86-16,Assembly,Nasm,X86 16,下面的代码将数字转换为ASCII“数字文本”,我遇到了这个问题。然而,代码似乎在“div”操作码处循环 ;Main Program main: mov ax, 0x0000 mov ds, ax ; setup data segment register mov si, GreetString ; setup data segment offset call print_string ; call print string procedure mov si

下面的代码将数字转换为ASCII“数字文本”,我遇到了这个问题。然而,代码似乎在“div”操作码处循环

;Main Program
main:
    mov ax, 0x0000
    mov ds, ax ; setup data segment register
    mov si, GreetString ; setup data segment offset
    call print_string ; call print string procedure
    mov si, DataWord ; setup data segment offset
    mov bl, 0x000A ; base 10
    call format_string ; call format string procedure
    mov si, GreetString ; setup data segment offset
    call print_string ; call print string procedure
prevent_overflow:
    hlt ; halt the CPU
    jmp prevent_overflow

format_string:
mov ax, [ds:si] ; load register ax with data
xor cx, cx ; set counter to 0
mov si, GreetString ; set pointer to address of GreetString

.format_char:
div bl ; divides by register bl
add ah, 48 ; convert to ascii numeric
mov [ds:si], ah ; move ascii numeric to ds:si
inc cx ; increase counter
inc si ; increase si
xor ah, ah ; clear ah register
or ax, ax
jnz .format_char ; jump to format next char
ret
你知道为什么会这样吗?我之所以说“循环”,是因为我的CPU处于最大值,并且在div之后不会继续操作代码


*更新。谢谢newgre。添加了main section以使其更具可读性(^.^)

问题是您会得到除法溢出异常,因为商(在我下面的示例中是12345 div 10=1234+5的余数)不适合
al
的8位(请记住,
ah
已被余数使用?)

每当商或余数不适合目标寄存器时,就会出现除法溢出异常。造成这种情况的不仅仅是0的除法

您希望进行32/16=16:16除法,而不是16/8=8:8除法

以下是在DOS中使用我的更改(标记为
;;
)的方法:

它打印:

Hello World!
54321

bl有什么价值?你从来没有明确分配过。是的,很抱歉。我确实在主节mov bl中分配了它,0x000A;基本10调用格式\u字符串;调用格式字符串过程hanks alot Alex=D这当然对我有帮助!我想我仍然很困惑为什么它会导致“循环”?如果默认的分区异常处理程序(在BIOS或DOS中)简单地返回(使用IRET),那么您会得到一个循环:DIV->exception handler->DIV->exception handler->DIV->exception handler->DIV->。。。处理程序不能做任何更合理的事情,因为它不“知道”该指令在哪里(在哪个程序或系统软件的一部分中)以及在每种情况下应该采取什么适当的操作。这是它能做的最好的了。但是,您可以重新定义处理程序,并将适合您的程序的逻辑放入其中。有关如何重新定义处理程序的任何建议或参考资料。它只是一个结构吗?它是一个例程,很像一个中断服务例程。它保留它修改的所有寄存器,执行它的工作,恢复寄存器,然后返回IRET。阅读Intel/AMD CPU手册。请参阅有关中断和异常处理以及说明的章节
INT
IRET
。非常感谢:D将阅读相关内容。希望我能理解文档:D
Hello World!
54321