2016-05-01 12 views
1

I wurde durch den folgenden Code aus Tutorial Punkt suchen:Subtraction in x86-Assembler

section .text 
    global _start  ;must be declared for using GCC 

_start:     ;tell linker entry point 
    sub  ah, ah 
    mov  al, '9' 
    sub  al, '3' 
    aas 
    or  al, 30h 
    mov  [res], ax 

    mov edx,len   ;message length 
    mov ecx,msg   ;message to write 
    mov ebx,1   ;file descriptor (stdout) 
    mov eax,4   ;system call number (sys_write) 
    int 0x80   ;call kernel 

    mov edx,1   ;message length 
    mov ecx,res   ;message to write 
    mov ebx,1   ;file descriptor (stdout) 
    mov eax,4   ;system call number (sys_write) 
    int 0x80   ;call kernel 

    mov eax,1   ;system call number (sys_exit) 
    int 0x80   ;call kernel 

section .data 
msg db 'The Result is:',0xa 
len equ $ - msg 
section .bss 
res resb 1 

Ich fühle mich wie ich diesen Code mit Ausnahme der Linie verstehen:

or al, 30h 

Ich verstehe, dass das oder ist eine bitweise oder und 30h ist 0011 0000 in binär. Ich verstehe nicht, warum das nötig ist, damit der Code funktioniert! Kann mir das jemand erklären?

+0

Es konvertiert nur einen ganzzahligen Wert im Bereich 0..9 (in diesem Fall 6) in sein ASCII-Äquivalent (0x36 = '6'). –

Antwort

1

Dies ist kein großartiges Beispiel.

Nach der Subtraktion, al enthält 6.

Die aas Anweisung tut nichts, weil das hohe Nibble al Null ist.

Der ASCII-Code für 0 ist 30h. "Oder" mit der 6 erzeugt 36h, das ist ASCII "6". Im Allgemeinen konvertiert dies den Binärwert für eine Dezimalziffer in seinen ASCII-Code.

Klingt so, als würden Sie davon profitieren, den Unterschied zwischen binären Werten und ihren ASCII-Darstellungen zu studieren. Siehe zum Beispiel an ASCII table.

Beachten Sie aber, dass dieser Code (AFAICS) fehlerhaft ist, weil er ein 16-Bit-Wort in einem einzelnen reservierten Byte speichert.

+0

Ah ich sehe .... Vielleicht sollte ich bessere Tutorials folgen, haben Sie irgendwelche Empfehlungen? –

+0

@TylerHilbert: Es gibt einige Links im [x86-Tag-Wiki] (http://stackoverflow.com/tags/x86/info), aber die meisten von ihnen sind alt (wie 16-Bit-DOS). Es gibt einen Link im Tag-Wiki zu einer Antwort, die ich mit Vorschlägen zum Lernen von Asm geschrieben habe. Finden Sie etwas, an dem Sie interessiert sind. Beginnen Sie vielleicht mit der Compiler-Ausgabe und sehen Sie, ob Sie es verstehen, indem Sie versuchen, es zu ändern. Aber es klingt wie Ihr Tutorial ist nicht sehr gut. Zwischen der Verwendung von "AAS" und der Speicherung von 2B, nachdem nur Platz für einen reserviert wurde, hört sich das nicht so an, als würden Sie einem guten Beispiel folgen. –

Verwandte Themen