首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Dos重写程序集代码到NASM程序集

如何使用Dos重写程序集代码到NASM程序集
EN

Stack Overflow用户
提问于 2022-04-28 20:30:06
回答 1查看 129关注 0票数 -2

如何使用Dosbox将此汇编代码转换为可以在Win上编译的经典i8086 NASM代码?程序必须在Intel 8086上运行。

代码语言:javascript
运行
复制
.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

或者有人能做到?程序应该列出包含输入字符串中第一个单词的所有字母的单词数。语句应该在十进制中。这是我第一次接触汇编语言,所以我不知道该怎么做。

EN

回答 1

Stack Overflow用户

发布于 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)。

考虑到这一点,更好的第一步是将原始程序的源代码转换为描述其行为的文档(用简单的英语,没有可执行代码)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72049857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档