2016-11-23 6 views
1

テーブルを合計してアセンブラ言語を使用して結果を表示できるコードを記述しています。ここで私は、これまでに作ってみたものです:バイトのシーケンスを追加するアセンブラを使用したテーブルの合計の表示8086

data segment 
    tab  db 9 dup(3 5 8 4 7 1 6 7 0) 
    resultat db ? 
data ends 

code segment 
    xor di, di 
    mov cx, 9 
Prog: 
    mov al, tab[di] 
    add ax, al 
    inc di 
loop prog 
    mov resultat ,ax 
    mov ah, 09h 
    int 21h 
end code 
+0

どのアセンブラを使用しますか? MASM、TASM、FASM、NASM ...? – zx485

+0

Ela、あなたの結果は 'ax'のバイナリです。表示するには文字列に変換する必要があります。 'ax'を表示すると、画面に奇妙な文字が表示されます。 –

+0

emuを使用しています8086 –

答えて

4

私はあなたのコード内のいくつかの変更を行い、(あなたが理解するのに役立つコメントの完全な)別の答えからprocのnumber2stringを盗んだ:

data segment 
tab db 3,5,8,4,7,1,6,7,0 ;ARRAY OF NUMBERS. 
resultat db '  $' ;STRING WITH 5 CHARS. 
data ends 
code segment 
mov ax,@data ;INITIALIZE 
mov ds,ax  ;DATA SEGMENT. 

xor di,di 
mov cx,9 
xor ax,ax  ;CLEAR THE SUM ACCUMULATOR. 
Prog: 
add al,tab[di] 
inc di 
loop prog  

call number2string ;CONVERT AX TO STRING IN RESULTANT. 

lea dx,resultat 
mov ah,09h 
int 21h 

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

;------------------------------------------ 
;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. 
;THE STRING IS STORED IN VARIABLE "RESULTAT". 

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. 
    lea si, resultat 
cycle2: 
    pop dx   
    add dl, 48 ;CONVERT DIGIT TO CHARACTER. 
    mov [si], dl 
    inc si 
    loop cycle2 

    ret 
endp 
;------------------------------------------ 

end code 

procのnumber2stringを文字列に斧や店舗内の任意の数を変換し、結果は変数resultatになります(データセグメントで定義されているため)。

+0

ありがとう –

+0

ありがとうございました。私は 'lea si、resultat'何をしているのですか? –

+0

@ElaHidri、 'si'は' resultat'を指し示します。これはあなたの 'tab [di]'のようです。 –

2

は、この方法を行うことができます。

code segment 
    xor ax, ax  ; clear AX 
    xor dx, dx  ; accumulator for result value 
    lea si, tab  ; SI = address of TAB 
    mov cx, 9  ; LEN of TAB in BYTEs 
Prog: 
    lodsb   ; AL = BYTE PTR [SI] and increment SI 
    add dx, ax  ; add 0:AL to DX 
loop prog   ; decrements CX and jumps if not 0 
    mov resultat, dx ; mov DX=accumulator to variable 
    ; PROBLEM !!! 
    mov ah, 09h  ; !!! prints string and not a number !!! 
    int 21h 
    ; PROBLEM END!!! 
    mov ah, 4Ch  ; exit program 
    int 21h   
end code 

このコードは、DXでのCX = 9 BYTE値を追加します。 DXはなく数:

Int 21/AH=09h - DOS 1+ - WRITE STRING TO STANDARD OUTPUT 
--- 
AH = 09h 
DS:DX -> '$'-terminated string 
--- 
Return: 
AL = 24h (the '$' terminating the string, despite official docs which states that nothing is returned) (at least DOS 2.1-7.0 and 
NWDOS) 

だから、あなたにそれを変換する必要があると思いますDXに番号を印刷する機能AH=09h of INT 21hがDSで文字列を出力するので、問題は、あなたの「印刷」機能が動作しないということですまず文字列。

+0

どのように私はそれを文字列に変換することができます –

+2

すでにいくつかのそのトピックをカバーする答えがあります:[this](http://stackoverflow.com/a/40505492/1305969)、[this](http://stackoverflow.com/a/39577676/1305969)および[this](http://stackoverflow.com/a/32102489/1305969)に記載されている。私はこれがあなたにこの問題を解決させることを願っています。 – zx485

+0

ありがとうございました –

-2
[bits 16] 
[org 0x100] 

jmp _start 

_start: 
    mov cl, 0 
    mov ah, 0x0e 

_loop: 
    cmp cl, 10 
    je _end 

    mov al, byte cl 
    or al, 30h ;Convert number to char 
    int 0x10 

    ;Print a space 
    mov al, 0x20 
    int 0x10 

    inc cl 
    jmp _loop 

_end: 
    mov ax, 0x4c 
    int 0x21 
+0

ようこそ!投稿コードを常に説明してください。 – rbr94

+0

thnxはうまく動作しません –

+1

次回は –

関連する問題