2015-04-10 1 views
0
include 'emu8086.inc' 
#make_com# 

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 
    ;printf AX doesn't work and i want to print the contents of AX 
+2

Вы должны преобразовать его в строку, затем отобразите его. –

ответ

2

; Printf AX не работает, и я хочу, чтобы распечатать содержимое AX

Вы не показали нам, что PRINTF должен делать. Таким образом, все ваши вызовы макросов PRINTf AX могут быть в порядке.

Но ваша программа имеет 2 ошибки, которые мешают правильному выполнению.

  1. Программа .COM запускается сверху, но именно там вы разместили свои данные. Это не должно быть выполнено! Поэтому либо помещайте данные под кодом, либо перепрыгивайте данные.
  2. Данные, которые вы используете, имеют размер слова и, следовательно, вам нужно добавить 2 в регистр SI при итерации по данным.
1

Вы можете отобразить AX как есть, но вы увидите странные символы на экране. Необходима процедура преобразования из двоичного кода (AX) в строку. Следующий код помещает число в AX, преобразует AX в строку и отображает строку. Вы можете использовать процедуру number2string для ваших будущих программ. Скопируйте и вставьте следующий код в EMU8086 и запустить его:

.stack 100h 
;------------------------------------------ 
.data 
str db 6 dup('$') ;STRING TO STORE NUMBER. 
;------------------------------------------ 
.code   
;INITIALIZE DATA SEGMENT. 
    mov ax, @data 
    mov ds, ax 

;CONVERT NUMBER TO STRING. 
    mov ax, 10382  ;ANY NUMBER. 
    call number2string ;CONVERT AX. RESULT IN "STR". 

;DISPLAY STRING. 
    mov ah, 9 
    mov dx, offset str ;NUMBER CONVERTED. 
    int 21h 

;WAIT FOR USER TO PRESS ANY KEY. 
    mov ah,7 
    int 21h 

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

;------------------------------------------ 

;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 

немного больше объяснений: для будущих программ, процедуру number2string требует переменную в сегменте данных с именем «ул». Как вы видите в коде, «str» имеет длину 6, поскольку AX может содержать несколько 5 цифр или меньше, и, если вы хотите отобразить его, строки требуют знак «$», поэтому длина равна 6. Параметр для номер2string должен быть размещен на AX. Конечно, вы можете изменить имя переменной (str) и используемый регистр (AX).

Смежные вопросы