我正在学习使用Intel语法的汇编语言。我使用的是Win XP和MASM 4.0,一切都很好。最近我将我的所有作业迁移到Linux(Ubuntu 10.04),尝试使用nasm
或nasm
汇编代码我收到了很多错误(几乎在每一行)。我还在第一行添加了.intel_syntax
。这是我的第一个装配程序:
.intel_syntax
stksg segment stack
db 32 dup ("stack")
stksg ends
datasg segment para 'data'
m1 db "Enter 1st number: " , '$'
m2 db "Enter 2nd number: " , '$'
number1 label byte
max1 db 10
ln1 db ?
n1 db 10 dup(0)
dollar db '$'
number2 label byte
max2 db 10
ln2 db ?
n2 db 10 dup(0)
p1 db 10 dup(' ')
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg, cs:codesg, ss:stksg
mov ax, datasg
mov ds, ax
mov ah,06h ;clear screen
mov al,25 ;number of rows to clear
mov ch,0 ;UL row
mov cl,0 ;UL col
mov ch,24 ;BR row
mov cl,79 ;BR col
mov bh,07h ;attribute (back:black, text:white)
int 10H
mov dx, offset m1 ;prints m1
mov ah,9h
int 21h
mov ah,0ah ;gets number 1
mov dx,offset number1
int 21h
mov ah,02h ;move cursor
mov dh,1
mov dl,0
mov bh,0
int 10h
mov dx, offset m2 ;prints m2
mov ah,9h
int 21h
mov ah,0ah ;gets number 2
lea dx,number2
int 21h
mov ah,09h
mov bl,ln1
lea ax,ln1
;mov [ln1+1],'$'
mov p1,bl
add ln1,30h
;lea dl,(offset p1)+1
;mov [dl],'$'
;mov offset p1+1,'$'
lea dx,ln1
int 21h
; mov bx,0
; mov cx,1
;f1: mov dl,[offset n1+cx]
; sub dl,30h ;convert to number
; mov al,10
; mul bx ; ax = bx*10
; mov bx,ax ; bx=ax === bx=bx*10
; add bx,dl
; inc cx
; cmp cx,ln1
; jne f1
mov ah,01h
int 21h
mov ax, 4c00h
int 21h
main endp
codesg ends
end main
end
答案 0 :(得分:0)
您是否阅读过GCC为您提供的错误消息?有很多“没有这样的指令”的错误。
错误:没有这样的指令:`stksg segment stack
您可以阅读Intel Instruction Set for x86并查看可以使用的说明。
所以你需要做的就是通过英特尔指令集并确保你使用appropriet指令。
例如,当您想要创建一个程序时,您可以写下:
procedureName:
以及冒号后该过程的代码。 data
细分和text
细分受众群的定义均与此.data
和.text
相同。以下是从IO system I wrote获取的正确编写程序的示例。
setinpos:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl %eax, BUFFERT_POSITION_POINTER
movl %ebp, %esp
popl %ebp
ret
从逐行转换代码的小部分开始。
答案 1 :(得分:0)
Nasm是一个Intel语法汇编程序。 MASM和NASM有一些差异,在NASM手册中提到。此外,您不能在Linux中使用DOS中断。 Linux系统调用是通过intterupt 80h。