Assembly 我想要emu8086程序,它可以分类

Assembly 我想要emu8086程序,它可以分类,assembly,Assembly,我想要一个“EMU8086”程序,它可以在0-300之间的字符串中对数字进行分类 并在侧面打印数字0-100,在另一面打印数字100-200,或者200-300 我尽了最大努力,但我的程序不打印值 org 100h s1 dw 50,60,70,80,90,100,120,130,140,160,170,190,190,220,250,270,300 MOV SI,0 MOV CX,16 s2: MOV AX,s1[SI] s3: INC SI CMP AX,100 JBE s4 JA

我想要一个“EMU8086”程序,它可以在0-300之间的字符串中对数字进行分类 并在侧面打印数字0-100,在另一面打印数字100-200,或者200-300

我尽了最大努力,但我的程序不打印值

org 100h

s1 dw 50,60,70,80,90,100,120,130,140,160,170,190,190,220,250,270,300

MOV SI,0
MOV CX,16

s2:
MOV AX,s1[SI]

s3:
INC SI
CMP AX,100
JBE s4
JA s5

s4:
PRINTf AX
JMP s3

s5:
CMP AX,200
JB s6
JA s7

s6:
PRINTf AX
JMP s3

s7:
PRINTf AX
JMP s3


END

这是您的EMU8086英特尔语法程序。您只需复制粘贴并运行。这就是它的工作原理:DI指向数字,取决于数字是200,有必要确定数字是在左、中还是右列,然后我们执行gotoxy(将光标发送到屏幕坐标),现在我们必须将数字转换为字符串(因为二进制在屏幕上看起来很奇怪),最后,我们显示数字。如果下一个数字不是零(零完成该过程),则对下一个数字重复此操作

.stack 100h
.data

numbers dw 130,50,260,570,180,190,100,20,66,140,860,470,190,20,220,250,170,30,300,0

col1 db 0  ;ROW NUMBER FOR THIS COLUMN.
col2 db 0  ;ROW NUMBER FOR THIS COLUMN.
col3 db 0  ;ROW NUMBER FOR THIS COLUMN.

str  db 6 dup('$') ;STRING TO STORE NUMBER CONVERTED INTO STRING.

.code          
;INITIALIZE DATA SEGMENT.
  mov  ax, @data
  mov  ds, ax

  mov  di, offset numbers  ;DI POINTS TO THE NUMBERS.
while:
;FIND OUT IF NUMBER BELONGS TO LEFT, MIDDLE OR RIGHT COLUMN.
  mov  ax, [ di ]  ;GET CURRENT NUMBER.
  cmp  ax, 100
  jb   left_column  ;IF NUMBER < 100 LEFT_COLUMN.
  cmp  ax, 200
  ja   right_column  ;IF NUMBER > 200 RIGHT_COLUMN.
;IF NO JUMP, THEN NUMBER >= 100 AND NUMBER <= 200.
  mov  dl, 30    ;SCREEN COLUMN.
  mov  dh, col2  ;SCREEN ROW.
  call gotoxy    ;SET CURSOR POSITION.
  inc  col2      ;INCRESE ROW FOR NEXT NUMBER ON THIS COLUMN.
  jmp  continue

left_column:             
  mov  dl, 0     ;SCREEN COLUMN.
  mov  dh, col1  ;SCREEN ROW.
  call gotoxy    ;SET CURSOR POSITION.
  inc  col1      ;INCRESE ROW FOR NEXT NUMBER ON THIS COLUMN.
  jmp  continue

right_column:  
  mov  dl, 60    ;SCREEN COLUMN.
  mov  dh, col3  ;SCREEN ROW.
  call gotoxy    ;SET CURSOR POSITION.
  inc  col3      ;INCRESE ROW FOR NEXT NUMBER ON THIS COLUMN.
  jmp  continue

continue:           
;CONVERT CURRENT NUMBER TO STRING.
  call dollars  ;FILL "STR" WITH '$'. NECESSARY TO DISPLAY IT.
  mov  ax, [ di ]  ;GET CURRENT NUMBER.
  call number2string  ;CONVERT AX TO STRING. RESULT IN "STR".  
;DISPLAY NUMBER CONVERTED.  
  mov  ah, 9
  mov  dx, offset str
  int  21h        
;NEXT NUMBER TO PROCESS.  
  add  di, 2  ;2 BYTES FORWARD BECAUSE NUMBERS ARE "DW".
;CHECK IF PROCESS IS OVER.  
  mov  ax, [ di ]
  cmp  ax, 0
  jne  while  ;IF AX!=0 JMP WHILE.

;FINISH PROGRAM.
  mov  ax, 4c00h
  int  21h           

;------------------------------------------
;MOVES CURSOR TO SCREEN COORDINATES DL,DH (COLUMN,ROW).

proc gotoxy
  mov  ah, 2
  mov  bh, 0
  int  10h
  ret
endp  

;------------------------------------------
;NUMBER TO CONVERT MUST ENTER IN AX.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING.

proc number2string
  mov  bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
  mov  cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:       
  mov  dx, 0 ;NECESSARY TO DIVIDE BY BX.
  div  bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
  push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
  inc  cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
  cmp  ax, 0  ;IF NUMBER IS
  jne  cycle1 ;NOT ZERO, LOOP. 
;NOW RETRIEVE PUSHED DIGITS.
  mov  si, offset str
cycle2:  
  pop  dx        
  add  dl, 48 ;CONVERT DIGIT TO CHARACTER.
  mov  [ si ], dl
  inc  si
  loop cycle2  

  ret
endp  

;------------------------------------------
;FILLS VARIABLE STR WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THESE STRINGS WILL BE DISPLAYED.

proc dollars                 
  mov  si, offset str
  mov  cx, 6
six_dollars:      
  mov  al, '$'
  mov  [ si ], al
  inc  si
  loop six_dollars
  ret
endp
.stack 100h
.数据
编号dw 130,50260570180190100,20,66140860470190,20220250170,30300,0
col1db0;此列的行号。
col2db0;此列的行号。
col3db0;此列的行号。
str db 6 dup(“$”);字符串以存储转换为字符串的数字。
.代码
;初始化数据段。
mov-ax,@data
mov-ds,ax
mov di,偏移量编号;DI指向数字。
而:
;找出数字是属于左列、中列还是右列。
动产ax,[di];获取当前号码。
cmp ax,100
jb左_列;如果数字<100,则为左列。
cmp ax,200
ja右_列;如果数字>200,则为右箭头列。

;如果没有跳转,那么数字>=100,数字PRINTf的定义是什么?200-300是什么??什么意思?也许你可以举一个简单的例子。如果你喜欢我的答案,你可以接受它或投票(或两者都接受!)。