在程序集中打印有符号和无符号数字有什么区别(80x86)?

时间:2014-05-31 23:06:16

标签: assembly

我有一个任务是采用现有的汇编程序打印有符号数字(字号),我需要更改它以便打印无符号数字(字大小)... 请帮助我理解其中的差异以及如何实现这一目标。

这是打印签名号码的程序:

.model  small
.stack   100h
.data
num  dw  -32768
numS db  6 dup(' '),'$'

.code
    mov ax, @data
    mov ds, ax

    mov ax, num
    mov bx, 10

    mov si, offset numS+5

next:   
        cwd
    idiv bx
    cmp dx, 0
    jge cont
    neg dx
cont:
    add dl, 48
    mov [si], dl
    dec si
        cmp ax, 0
    jz sof
    jmp next
sof:    
    cmp num, 0
    jge soff
    mov byte ptr[si],   '-'
soff:
    mov ah, 9
    mov dx, si
    int 21h
    .exit
end

谢谢!

1 个答案:

答案 0 :(得分:1)

由于您的字大小为16位,有符号数字的范围将从-32768到32767,其中无符号数字的范围从0到65535.而当您将num声明为-32768时,计算机以十六进制表示为0x8000,如果它执行签名操作将为-32768,但如果执行无符号操作则为+32768。

如果使用不同的负数,例如-1,则十六进制为0xFFFF。如果对它执行无符号运算,则它将被解释为65535。

请注意,idiv指令执行有符号除法,而div指令执行无符号。