In Assembler x86 Windows ein ROT13 Converter programmieren?
Hi
Ich möchte in Assembler ein ROT13 Converter programmieren, d.h. jeder Buchstabe eines Strings wird um 13 Stellen im Alphabet verschoben. Da ich absoluter Assembler Anfänger bin, komme ich nicht weit (bis auf das Hello World programm).
Im 8bit online Simulator hat man das so gemacht:
MOV A, string ; Adresse von String in A
MOV D, [A] ; erste Stelle aus dem String in D
INC A ; nächste Stelle im String
Usw....
Aber in x86 windows funktioniert das nicht kann mir jemand helfen?
6 Antworten
Hatte Fehler im code! (Sprungbefehl zum rollover) hier die korrekte Version (komplett):
.686
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.CODE
_main:
push offset szText
call StdOut
xor ecx,ecx
xor eax,eax
_loop:
cmp BYTE PTR szText[ecx], 0
je _exit
mov al, BYTE PTR szText[ecx]
add al, 13
cmp BYTE PTR szText[ecx],'A'
jl _next
cmp BYTE PTR szText[ecx],'Z'
jl _caps
cmp BYTE PTR szText[ecx],'a'
jl _next
cmp BYTE PTR szText[ecx],'z'
jg _next
cmp al,'z'
ja _rollover
jmp _writeback
_caps:
cmp al,'Z'
ja _rollover
jmp _writeback
_rollover:
sub al,26
_writeback:
mov BYTE PTR szText[ecx], al
_next:
inc ecx
jmp _loop
_exit:
push offset szText
call StdOut
push 0
call ExitProcess
.DATA
szText db "Hier der Text",10,13,0
END _main
Kompilieren mit "ml rot13.asm /link /subsystem:console"
das EWDK hat die includes auch nicht.. es braucht die Installation von www.masm32.com, die gerneriert dann auch die libs und includes.
und zu dem "Problem" selbst. Ich hab' das jetzt mal so gemacht:
_main:
xor ecx,ecx
xor eax,eax
_loop:
cmp BYTE PTR szText[ecx], 0
je _exit
xor ah,ah
mov al, BYTE PTR szText[ecx]
add al,13
cmp BYTE PTR szText[ecx],'A'
jl _next
cmp BYTE PTR szText[ecx],'Z'
jl _caps
cmp BYTE PTR szText[ecx],'a'
jl _next
cmp BYTE PTR szText[ecx],'z'
jg _next
cmp ax,'z'
jge _rollover
jmp _writeback
_caps:
cmp ax,'Z'
jge _rollover
jmp _writeback
_rollover:
sub al,26
_writeback:
mov BYTE PTR szText[ecx], al
_next:
inc ecx
jmp _loop
_exit:
Kurze Gegenfrage: Wie sieht denn ein Setup aus?
Ich mach' grad den d/l vom EWDK für win10.. der MASM ist ja beim VS2019 dabei, aber die includes für MASM nicht..
Wenn das soweit alles da ist, versuch ich mal ob ich dir da helfen kann.. mein Assembler ist ein bisschen eingerostet _und_ die Umgebung hat sich sehr verändert. ;)
Als ich mit Assembler aufgehört hab' gab's Windows XP.. :P
Also ich würde es so probieren, dass ich ein C Programm für die Ein-/ und Ausgabe schreibe -quasi als Wrapper für die Systemfunktionen und dann Assembler für diese Funktion in C einbette. Aber ich habe keine Ahnung von x86 Assembler in Verbindung mit Betriebssystem.
Windows lässt (glaube ich) keine Direktspeicherzugriffe mehr zu.