Assembly 模数余数的显示

Assembly 模数余数的显示,assembly,nasm,dos,x86-16,integer-division,Assembly,Nasm,Dos,X86 16,Integer Division,你好,这里是nasm的新成员。 这是在win32(组织0x100)中运行的。 要在给出输入(1-9)后,在mess4“余数为:”旁边显示模数余数,如果是7、8或9,则给出模数的余数。 另一个问题是,仍然使用语法,因此我的“cmp”从输入到7(也就是8和9作为7可以分成8,9,并有余数1,2)捕捉到输入值1和2,因为这与余数相同,在将8和9除以7后,有余数1和2,因此给出错误的读数。 任何帮助都将不胜感激。谢谢大家! 尝试在注册器中更改和移动,但无效 更新:我能够在屏幕上显示余数,唯一的问题是在除

你好,这里是nasm的新成员。 这是在win32(组织0x100)中运行的。 要在给出输入(1-9)后,在mess4“余数为:”旁边显示模数余数,如果是7、8或9,则给出模数的余数。 另一个问题是,仍然使用语法,因此我的“cmp”从输入到7(也就是8和9作为7可以分成8,9,并有余数1,2)捕捉到输入值1和2,因为这与余数相同,在将8和9除以7后,有余数1和2,因此给出错误的读数。 任何帮助都将不胜感激。谢谢大家!

尝试在注册器中更改和移动,但无效

更新:我能够在屏幕上显示余数,唯一的问题是在除法7时得到适当的调用,这样它只在给定值7,8,9时调用'isdiv'

bits 16
org 0x100 ; start offset at memory position 100
jmp main ; jump to main program
;
; Data definitions
;
mess1: db 'Input any number (1 - 9)', 0dh,0ah,'$'
mess2: db 'The number is divisible by 7',0dh,0ah,'$'
mess3: db 'The number is not a divisible by 7',0dh,0ah,'$'
mess4: db 'The remainder is: ',0ah, 0dh,'$'                     ;Not sure
errmess: db '**',0dh,0ah,'$'
crlf: db 0dh,0ah, '$'
;
; Display a string on the screen
; DX contains the address of the string
;
display:
    mov ah,09 
    int 21h 
    ret
;
;Display the remainder
remainder:

    mov dx,mess4
    call display
    ret
; Set the cursor position
;
cursor:
    mov ah,02
    mov bh,0 ; screen number mov
    mov dh,05h ; row
    mov dl,0 ; column
    int 10h
    ret
;
; Display a user prompt
;
prompt:
    mov dx,mess1
    call display
    ret
;
; Read one character from the keyboard
;
input:
    mov ah,01
    int 21h
    ret
;
; Clear screen and change screen colour
;
screen:
    mov ah,06 ; scroll up screen
    mov al,0 ; lines to scroll where 0 clear entire screen
    mov cx,0 ; starting row:column
    mov dl,80 ; ending row;column
    mov dh,80
    mov bh,00011110b ; colour: yellow on blue
    int 10h
    ret
;
; Carriage returnm and line feed
;
newline:
    mov dx,crlf
    call display
    ret
;
; Main program
;
main:
    call screen
    call cursor

next:
    call prompt
    call input
    cmp al,'1' ; character < 1?
    jl error ; yes, error message
    cmp al,'9' ; character > 9?
    jg error ; yes, error message   
    sub al,30h ; convert from ASCII to numeric
    xor ah,ah ; clear AH
    mov bl,7    
    idiv bl ; divide by 7
    mov ch,ah
    ;cmp ah,0  ; remainder = n0?
    je isdiv ; yes: divisible by 7
    call newline
    mov dx,mess3 ; not divisible by 7
    call display
    jmp fin



isdiv:
    call newline
    mov dx,mess2
    call display ; divisible by 7
    call remainder
    add ch,30h
    mov dl,ch
    mov ah,2h
    int 21h

fin:
    ;
    int 20h ; terminate program
    ; Display error message. Number out of range
    ;

error:
    mov dx,errmess
    call display
    jmp next
位16
org 0x100;存储器位置100处的起始偏移量
jmp-main;跳转到主程序
;
; 数据定义
;
消息1:db'输入任意数字(1-9)'、0dh、0ah、'$'
消息2:db'数字可被7',0dh,0ah,'$'整除
mess3:db'数字不能被7',0dh,0ah,'$'整除
mess4:db'余数为:',0ah,0dh',$;不确定
errmess:db'**',0dh,0ah',$'
crlf:db 0dh,0ah,“$”
;
; 在屏幕上显示字符串
; DX包含字符串的地址
;
显示:
莫夫啊,09
int 21h
ret
;
;显示余数
剩余部分:
mov dx,信息4
呼叫显示
ret
; 设置光标位置
;
光标:
mov啊,02
mov-bh,0;屏幕编号mov
mov-dh,05h;一行
movdl,0;柱
int 10h
ret
;
; 显示用户提示
;
提示:
mov dx,消息1
呼叫显示
ret
;
; 从键盘上读一个字符
;
输入:
莫夫啊,01
int 21h
ret
;
; 清除屏幕并更改屏幕颜色
;
屏幕:
mov-ah,06;向上滚动屏幕
mov-al,0;要滚动的行,其中0清除整个屏幕
mov-cx,0;起始行:列
mov-dl,80;结束行;柱
莫夫dh,80
莫夫伯克希尔,0001110B;颜色:蓝底黄
int 10h
ret
;
; 回车和换行
;
新行:
mov-dx,crlf
呼叫显示
ret
;
; 主程序
;
主要内容:
呼叫屏幕
调用游标
下一步:
呼叫提示
呼叫输入
cmp-al,'1';字符<1?
jl错误;是,错误消息
cmp-al,'9';字符>9?
jg误差;是,错误消息
sub-al,30h;从ASCII转换为数字
xor啊,啊,;清楚啊
mov bl,7
idiv bl;除以7
莫夫奇,啊
;cmp-ah,0;余数=n0?
杰伊斯迪夫;是:可以被7整除
呼叫新线
mov dx,mess3;不能被7整除的
呼叫显示
jmp翅片
isdiv:
呼叫新线
mov dx,消息2
呼叫显示;可被7整除的
调用余数
添加ch,30小时
mov-dl,ch
mov啊,2h
int 21h
鳍:
;
int 20h;终止程序
; 显示错误消息。数字超出范围
;
错误:
mov-dx,errmess
呼叫显示
下一个jmp

增加了mov cl,al;复制初始输入以供以后在cmp cl 7上使用,并使用jge isdiv显示余数。 这解决了我的问题

idiv
指令未定义任何标志。如果不显式比较零的
AH
,条件跳转将以非辐照方式执行

当代码发现输入的数字不能被7整除时,它不应该跳到末尾(
jmp fin
),而是跳到一个可以决定是否需要显示余数的点。
您只希望看到输入“7”、“8”和“9”的余数。
您可以很容易地过滤掉这些,因为对于较小的输入“1”到“6”,商将是1,而不是0

冒号表示您希望剩余部分显示在文本后面。最好放下回车和换行符。之后你可以打电话单独换行

mess4: db 'The remainder is: $'

80x25文本屏幕以列
DL=79
和行
DH=24

结束,使用
cmp-cl,7
跳到isdiv将显示一条不需要为真的消息!
    sub  al, 30h   ; convert from ASCII to numeric
    cbw
    mov  bl, 7    
    div  bl
    mov  cx, ax    ; SAVE for parts 1 and 2 of the task
    call newline
    test ch, ch    ; Remainder saved earlier
    jz   isdiv     ; Divisible by 7
    mov  dx, mess3 ; Not divisible by 7
    call display
    jmp  part2
isdiv:
    mov  dx, mess2
    call display

part2:
    cmp  cl, 1     ; Quotient saved earlier
    jne  fin       ; Input was "1", "2", ... , "6"
    mov  dx, mess4
    call display
    mov  dl, ch    ; Remainder saved earlier
    add  dl, 30h
    mov  ah, 02h
    int  21h
    call newline

fin:
    int  20h
mess4: db 'The remainder is: ',0ah, 0dh,'$'                     ;Not sure
mess4: db 'The remainder is: $'
screen:
mov ah,06 ; scroll up screen
mov al,0 ; lines to scroll where 0 clear entire screen
mov cx,0 ; starting row:column
mov dl,80 ; ending row;column
mov dh,80
mov bh,00011110b ; colour: yellow on blue
int 10h
ret