Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在8086汇编中打印字节大小的数字_Assembly_Dos_X86 16 - Fatal编程技术网

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
with
mov-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:---这里我需要打印数组,但数字是位大小而不是字,数组必须是位大小。