Assembly 如何在8086汇编中打印字节大小的数字
下面是如何打印字号大小的数字。我不能让它适用于字节大小的数字Assembly 如何在8086汇编中打印字节大小的数字,assembly,dos,x86-16,Assembly,Dos,X86 16,下面是如何打印字号大小的数字。我不能让它适用于字节大小的数字 .model small .stack 100h .data num dw 300 ; <----- See below numS db 6 dup(' '),'$'** .code mov ax, @data mov ds, ax mov ax, num mov bx, 10 mov si, offset numS+5 cmp ax,
.model small
.stack 100h
.data
num dw 300 ; <----- See below
numS db 6 dup(' '),'$'**
.code
mov ax, @data
mov ds, ax
mov ax, num
mov bx, 10
mov si, offset numS+5
cmp ax,0
jge next
neg ax
next:
mov dx,0
div bx
add dl, 48
mov [si], dl
dec si
cmp ax, 0
jne next
cmp num,0
jge sof
mov byte ptr[si], '-'
dec si
sof:
inc si
mov ah, 9
mov dx, si
int 21h
.exit
end
。型号小
.烟囱100小时
.数据
数字DW300 好消息是,您可以继续使用现有的转换。如果将行num dw 300
更改为类似num db 36
的内容,则代码中需要修改的就是加载AX
寄存器的方式。您现在编写的不是mov-ax,num
,而是mov-al,num
cbw
。(显然,你期待的是有签名的数字!)
全字节解决方案是可能的,但:
mov ax, @data
mov ds, ax
mov al, num
mov bl, 10
mov si, offset numS+5
cmp al,0
jge next
neg al
next:
mov ah, 0
div bl ; Calculates AX / BL --> AL is quotient, AH is remainder
add ah, 48
dec si
mov [si], ah
cmp al, 0
jne next
cmp num, al ; AL == 0
jge sof
dec si
mov byte ptr [si], '-'
sof:
mov dx, si
mov ah, 09h ; DOS.PrintString
int 21h
好消息是,您可以继续使用现有的转换。如果将行num dw 300
更改为类似num db 36
的内容,则代码中需要修改的就是加载AX
寄存器的方式。您现在编写的不是mov-ax,num
,而是mov-al,num
cbw
。(显然,你期待的是有签名的数字!)
全字节解决方案是可能的,但:
mov ax, @data
mov ds, ax
mov al, num
mov bl, 10
mov si, offset numS+5
cmp al,0
jge next
neg al
next:
mov ah, 0
div bl ; Calculates AX / BL --> AL is quotient, AH is remainder
add ah, 48
dec si
mov [si], ah
cmp al, 0
jne next
cmp num, al ; AL == 0
jge sof
dec si
mov byte ptr [si], '-'
sof:
mov dx, si
mov ah, 09h ; DOS.PrintString
int 21h
提示:将int21h
与movah,2
一起使用,而不是9
@Dai:这有什么帮助?一个字节仍然可以表示最多3位数字(-128到127)。存储到缓冲区是按最重要的第一次打印顺序打印的一种简单方法。如果切换到ah=2
,则需要将最后的系统调用替换为一个循环,而不会改变任何其他内容。给出了这个起始代码,最明显的事情就是将字节扩展为一个字。(或在处理符号后进行零扩展。)我需要在一个数组中打印一个字节大小的数字,如2/26/25/78…如果在这里更有用,我需要做的是:.model small、.stack 100h、.DataA db 36,48,22,15,32,“$”,N eq 5,代码:mov ax@data,mov dx,ax,mov si,0,mov cx,N,myloop:cmp A[si],A[si+1],jg swich,inc-si,dec-cx,cmp-cx,1,je-final,jmp-myloop,swich:mov-bl,A[si],mov-al[si+1],xchg-bl,A[si],xchg-A[si],inc-si,dec-cx,jmp-myloop-final:---这里我需要打印数组,但数字是位大小而不是字,数组必须是位大小。提示:使用int 21h
withmov-ah,2
而不是9
@Dai:这有什么帮助?一个字节仍然可以表示最多3位数字(-128到127)。存储到缓冲区是按最重要的第一次打印顺序打印的一种简单方法。如果切换到ah=2
,则需要将最后的系统调用替换为一个循环,而不会改变任何其他内容。给出了这个起始代码,最明显的事情就是将字节扩展为一个字。(或在处理符号后进行零扩展。)我需要在一个数组中打印一个字节大小的数字,如2/26/25/78…如果在这里更有用,我需要做的是:.model small、.stack 100h、.DataA db 36,48,22,15,32,“$”,N eq 5,代码:mov ax@data,mov dx,ax,mov si,0,mov cx,N,myloop:cmp A[si],A[si+1],jg swich,inc-si,dec-cx,cmp-cx,1,je-final,jmp-myloop,swich:mov-bl,A[si],mov-al[si+1],xchg-bl,A[si+1],xchg-A[si],inc-si,dec-cx,jmp-myloop-final:---这里我需要打印数组,但数字是位大小而不是字,数组必须是位大小。