首页 文章

需要从MASM转换到NASM

提问于
浏览
-4

附加文件:文件dosbox_003.png(5.722 KB)编写一个NASM,它将:

在一行显示您的姓名 . (使用int 21h,函数9.回车和换行的字符分别为0Dh和0Ah . )在下一行,显示提示(再次使用int 21h,function9)并从键盘读取三个字符(使用int 21h,fcn 1.)将字符存储在适当标记的字节变量中 . 打印三个字符,每行一个(根据您的实现方式,使用int 21h,函数9或函数2,您的选择 . )使用NASM组装程序并使用DOSBox执行它 .

用命令提示符组装

鉴于此代码(错误加粗和突出显示行)我有这些错误

C:\NASM>nasm bal-lab2.asm -o bal-lab2.com
bal-lab2.asm:5: error: attempt to define a local label before any non-local 
labels
bal-lab2.asm:5: error: parser: instruction expected
bal-lab2.asm:6: error: attempt to define a local label before any non-local 
labels
bal-lab2.asm:6: error: parser: instruction expected
bal-lab2.asm:7: warning: label alone on a line without a colon might be in 
error [-w+orphan-labels]
bal-lab2.asm:7: error: attempt to define a local label before any non-local 
labels
bal-lab2.asm:17: warning: label alone on a line without a colon might be in 
error [-w+orphan-labels]
bal-lab2.asm:18: error: parser: instruction expected
bal-lab2.asm:127: error: symbol `main' redefined
bal-lab2.asm:127: error: parser: instruction expected
bal-lab2.asm:128: error: parser: instruction expected

用这个代码

;ff
;ff
;ff

.model small line ***LINE 5***
.stack 100h ***LINE 6***
.data ***LINE 7***  
nameString db 'my name here $' ;replace by your name
prompt1 db 'Enter first character : $' ;ask for character
prompt2 db 'Enter second character : $' ;ask for character
prompt3 db 'Enter third character : $' ;ask for character

character1 DB ? ;memory to store character
character2 DB ? ;memory to store character
character3 DB ? ;memory to store character

.code ***LINE 17**
main proc ***LINE 18***


mov ax,@data ;move data address to ax
mov ds,ax ;move ax to data segment  


lea dx , nameString ;move content to dx

mov ah,9 ;ask to print array of string
int 21h

mov dx,10 ;print \n
mov ah,2
int 21h  

mov dx,13 ;cursor at first position
mov ah,2
int 21h

lea dx , prompt1 ;if use lea no need to use offset

mov ah,9 ;print prompt
int 21h  
;ask for character input
mov ah,1
int 21h

mov character1,al ; move to labled memory


mov dx,10 ;print \n
mov ah,2
int 21h  

mov dx,13 ;cursor at first position
mov ah,2
int 21h

lea dx , prompt2 ;if use lea no need to use offset

mov ah,9 ;print prompt
int 21h  
;ask for character input
mov ah,1
int 21h

mov character2,al ; move to labled memory


mov dx,10 ;print \n
mov ah,2
int 21h  

mov dx,13 ;cursor at first position
mov ah,2
int 21h

lea dx , prompt3 ;if use lea no need to use offset

mov ah,9 ;print prompt
int 21h  
;ask for character input
mov ah,1
int 21h

mov character3,al ; move to labled memory  


mov dx,10 ;print \n
mov ah,2
int 21h  

mov dx,13 ;cursor at first position
mov ah,2
int 21h

mov dl,character1 ;move character value to dl for print
mov ah,2
int 21h

mov dx,10 ;print \n
mov ah,2
int 21h  

mov dx,13 ;cursor at first position
mov ah,2
int 21h

mov dl,character2 ;move character value to dl for print
mov ah,2
int 21h


mov dx,10 ;print \n
mov ah,2
int 21h  

mov dx,13 ;cursor at first position
mov ah,2
int 21h

mov dl,character3 ;move character value to dl for print
mov ah,2
int 21h


mov ah,4ch
int 21h
main endp ***LINE 127***
end main ***LINE 128***

错误突出显示,并且线条太过感激任何帮助,我对汇编语言非常新

1 回答

  • 2
    • 删除前7行程序并替换为 org 0x100

    • .data 中的所有内容移动到文件末尾 . COM文件中不需要的部分 .

    • db ? 的所有出现更改为 db 0

    • 删除第17至22行 mov ax,@datamov ds,ax 不是必需的

    • 您使用过的每个地方 lea 更改为 mov

    • character? 的所有实例更改为 [character?]

    进行这些更改,你的程序将工作,我使用DOSBox 0.74进行测试,输出看起来像这样;

    我的名字在这里
    输入第一个字符:R
    输入第二个字符:a
    输入第三个字符:m
    [R
    一个

    这是您为NASM修改的程序,以及一些个人调整,如缩短标签

    org 256
    
            mov     dx, Nme         ;move content to dx
    
            mov     ah, 9       ;ask to print array of string
            int     21h
    
            mov     dx, 10      ;print \n
            mov     ah, 2
            int     21h  
    
            mov     dx, 13      ;cursor at first position
            mov     ah, 2
            int     21h
    
            mov     dx, prompt1     ;if use lea no need to use offset
            mov     ah, 9       ;print prompt
            int     21h  
    
            mov     ah, 1       ;ask for chr input
            int     21h
            mov     [chr1] ,al  ; move to labled memory
    
            mov     dx, 10      ;print \n
            mov     ah, 2
            int     21h  
    
            mov     dx, 13      ;cursor at first position
            mov     ah, 2
            int     21h
    
            mov     dx , prompt2    ;if use lea no need to use offset
    
            mov     ah, 9       ;print prompt
            int     21h  
    
            mov     ah,1        ;ask for chr input
            int     21h
            mov     [chr2], al  ; move to labled memory
    
            mov     dx, 10      ;print \n
            mov     ah, 2
            int     21h  
    
            mov     dx, 13      ;cursor at first position
            mov     ah,2
            int     21h
    
            mov     dx, prompt3     ;if use lea no need to use offset
            mov     ah, 9       ;print prompt
            int     21h
    
            mov     ah, 1
            int 21h
            mov     [chr3], al   ; move to labled memory 
    
            mov     dx, 10      ;print \n
            mov     ah, 2
            int     21h  
    
            mov     dx, 13      ;cursor at first position
            mov     ah, 2
            int     21h
    
            mov dl, [chr1]      ;move chr value to dl for print
            mov     ah, 2
            int 21h
    
            mov     dx, 10      ;print \n
            mov     ah, 2
            int     21h  
    
            mov     dx, 13      ;cursor at first position
            mov     ah, 2
            int     21h
    
            mov     dl, [chr2]  ;move chr value to dl for print
            mov     ah, 2
            int     21h
    
            mov     dx, 10      ;print \n
            mov ah, 2
            int     21h  
    
            mov     dx, 13      ;cursor at first position
            mov     ah, 2
            int     21h
    
            mov     dl, [chr3]  ;move chr value to dl for print
            mov     ah, 2
            int     21h
    
            mov ah,4ch
            int 21h
    
            Nme:        db  'my name here $' ;replace by your name
            prompt1:    db  'Enter  first chr: $' ;ask for chr
            prompt2:    db  'Enter second chr: $' ;ask for chr
            prompt3:    db  'Enter  third chr: $' ;ask for chr
    
            chr1:   DB 0    ;memory to store chr
            chr2:   DB 0    ;memory to store chr
            chr3:   DB 0    ;memory to store chr
    

相关问题