如何使用Dosbox将此汇编代码转换为可以在Win上编译的经典i8086 NASM代码?程序必须在Intel 8086上运行。
.model SMALL
.stack 50
.data
RET1 DB 10,13,'Bolo zadane iba jedno slovo$'
POCET Dw 0
poc db 0
zhod dw 0
sum db 0
suma dw 0
jed db 0
des db 0
sto db 0
.code
getchar PROC
MOV AH,01
INT 21H
RET
getchar ENDP
napln proc
mov ax,50
mov si,ax
mov ax,150
mov di,ax
mov cx,pocet
pokr: mov bl,[si]
mov [di],bl
inc di
inc si
dec cx
cmp cx,0
jnz pokr
ret
napln endp
START: mov ax,50
mov si,ax
MOV AX,@data
MOV DS,AX
slovo: CALL getchar
CMP AL,32
JZ MEDZ
CMP AL,13
JZ malo
cmp poc,0
mov cx,pocet
jnz kontr
skok: mov [si],al
inc si
INC POCET
inc poc
JMP slovo
kontr: mov si,50
kon: cmp al,[si]
jz slovo
inc si
dec cx
cmp cx,0
jnz kon
jmp skok
MEDZ: cmp poc,0
jz slovo
call napln
CALL GETCHAR
CMP AL,13
JZ MALO
CMP AL,32
JNZ CITAT
JMP MEDZ
malo: MOV DX,offset RET1
MOV AH,09
INT 21H
mov ax, 4c00h
INT 21h
CITAT: CMP AL,13
JZ posledne
cmp al,32
jz space
mov si,150
mov cx,pocet
zisti: cmp al,[si]
jnz dalej
mov bl,0
mov [si],bl
inc zhod
dalej: inc si
dec cx
cmp cx,0
jnz zisti
dalsi: CALL GETCHAR
JMP CITAT
posledne: mov cx,pocet
cmp zhod,cx
jnz prevod
inc sum
inc suma
jmp prevod
space: mov cx,pocet
cmp zhod,cx
jnz zle
inc sum
inc suma
zle: mov zhod,0
call napln
jmp dalsi
prevod: jmp vypis
vypis:
MOV AH,02
MOV DL,0AH
INT 21H
MOV AL,sum
ADD AL,48
MOV DL,AL
INT 21H
mov ax, 4c00h
INT 21h
END START或者有人能做到?程序应该列出包含输入字符串中第一个单词的所有字母的单词数。语句应该在十进制中。这是我第一次接触汇编语言,所以我不知道该怎么做。
发布于 2022-04-29 08:40:59
第一步可能是将代码转换为DOS的NASM源代码。要做到这一点,您通常会删除不必要的内容(例如,getchar PROC变成getchar:,getchar ENDP被删除,等等)。您还必须弄清楚如何让NASM生成与DOS兼容的".exe“文件(参见https://www.nasm.us/xdoc/2.15.05/html/nasmdoc9.html#section-9.1 )。在这样做之后(并测试它是否正常工作);第二步可能是将DOS的NASM源代码转换为Windows的NASM源代码。
但是,Windows使用了非常不同的API,有更多的负担。具体来说,您应该使用DLL(和动态链接),以便Microsoft可以在不破坏所有内容的情况下从根本上改变内核的API,并且内核的API被故意无文档化,以防止人们编写当内核被更改时会中断的代码。对于其中的一些问题,API的性质也有根本的不同。例如,您不必调用API来获取用户的下一个键按,而是注册一个事件处理程序,当用户按下一个键时,API会调用您。当然,(现代的) Windows也需要32位或64位代码(这也意味着非常不同的调用约定)。
其结果是,为Windows设计和编写新程序可能更容易(而不是将旧程序转换为DOS)。
考虑到这一点,更好的第一步是将原始程序的源代码转换为描述其行为的文档(用简单的英语,没有可执行代码)。
https://stackoverflow.com/questions/72049857
复制相似问题