我有一个任务是采用现有的汇编程序打印有符号数字(字号),我需要更改它以便打印无符号数字(字大小)... 请帮助我理解其中的差异以及如何实现这一目标。
这是打印签名号码的程序:
.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
谢谢!
答案 0 :(得分:1)
由于您的字大小为16位,有符号数字的范围将从-32768到32767,其中无符号数字的范围从0到65535.而当您将num声明为-32768时,计算机以十六进制表示为0x8000,如果它执行签名操作将为-32768,但如果执行无符号操作则为+32768。
如果使用不同的负数,例如-1,则十六进制为0xFFFF。如果对它执行无符号运算,则它将被解释为65535。
请注意,idiv指令执行有符号除法,而div指令执行无符号。