我是一名开发人员,他使用高级语言,在业余时间学习汇编语言。请参阅下面的NASM计划:
section .data
section .bss
section .text
global main
main:
mov eax,21
mov ebx,9
add eax,ebx
mov ecx,eax
mov eax,4
mov ebx,1
mov edx,4
int 0x80
push ebp
mov ebp,esp
mov esp,ebp
pop ebp
ret
以下是我使用的命令:
ian @ ubuntu:〜/ Desktop / NASM / Program4 $ nasm -f elf -o asm.o SystemCalls.asm ian @ ubuntu:〜/ Desktop / NASM / Program4 $ gcc -o program asm.o ian @ ubuntu:〜/ Desktop / NASM / Program4 $ ./program
我没有收到任何错误,但终端没有打印任何内容。我使用以下链接确保寄存器包含正确的值:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html
答案 0 :(得分:1)
您必须将整数值转换为字符串才能使用sys_write
(系统调用4)进行打印。转换可以像这样(未经测试)完成:
; Converts the integer value in EAX to a string in
; decimal representation.
; Returns a pointer to the resulting string in EAX.
int_to_string:
mov byte [buffer+9],0 ; add a string terminator at the end of the buffer
lea esi,[buffer+9]
mov ebx,10 ; divisor
int_to_string_loop:
xor edx,edx ; clear edx prior to dividing edx:eax by ebx
div ebx ; EAX /= 10
add dl,'0' ; take the remainder of the division and convert it from 0..9 -> '0'..'9'
dec esi ; store it in the buffer
mov [esi],dl
test eax,eax
jnz int_to_string_loop ; repeat until EAX==0
mov eax,esi
ret
buffer: resb 10
答案 1 :(得分:0)
汇编编程需要了解ASCII代码和一些基本的转换例程。例如:十六进制到十进制,十进制到十六进制是保存在某个存储上某个地方的好例程。 没有寄存器可以打印,你必须转换(很多)。 为了更有帮助: ASCII 0只打印一些文本编辑器(kde linux中的kate)将在屏幕上显示某些内容(正方形或...)。在更高级别的语言中,如C和C ++,它用于指示NULL指针和字符串结尾。 也可用于计算字符串长度。 10是行尾。取决于Linux或Windows,也会有回车(Linux)(Windows / Dos)。 13是回车 1B是ESC键(Linux用户现在会更多关于此) 255是一个艰难的回归,我从来不知道它为什么有益,但它必须有它的目的。 检查http://www.asciitable.com/是否有整个列表。
答案 2 :(得分:-1)
将整数值转换为字符串。 在这里,我使用宏包和解压缩将整数转换为字符串和宏解压缩,以反之亦然
%macro write 2
mov eax, 4
mov ebx, 1
mov ecx, %1
mov edx, %2
int 80h
%endmacro
%macro read 2
mov eax,3
mov ebx,0
mov ecx,%1
mov edx,%2
int 80h
%endmacro
%macro pack 3 ; 1-> string ,2->length ,3->variable
mov esi, %1
mov ebx,0
%%l1:
cmp byte [esi], 10
je %%exit
imul ebx,10
movzx edx,byte [esi]
sub edx,'0'
add ebx,edx
inc esi
jmp %%l1
%%exit:
mov [%3],ebx
%endmacro
%macro unpack 3 ; 1-> string ,2->length ,3->variable
mov esi, %1
mov ebx,0
movzx eax, byte[%3]
mov byte[%2],0
cmp eax, 0
jne %%l1
mov byte[%2],1
push eax
jmp %%exit2
%%l1:
mov ecx,10
mov edx,0
div ecx
add edx,'0'
push edx
inc byte[%2]
cmp eax, 0
je %%exit2
jmp %%l1
%%exit2:
movzx ecx,byte[%2]
%%l2:
pop edx
mov [esi],dl
inc esi
loop %%l2
%endmacro
section .data ; data section
msg1: db "First number : " ;
len1: equ $-msg1 ;
msg2: db "Second number : " ;
len2: equ $-msg2 ;
msg3: db "Sum : " ;
len3: equ $-msg3 ;
ln: db 10
lnl: equ $-ln
var1: resb 10
var2: resb 10
str1: resb 10
str2: resb 10
ans: resb 10
ansvar: resb 10
ansl: db ''
l1: db ''
l2: db ''
section.text ;code
global _start
_start:
write msg1,len1
read str1,10
pack str1,l1,var1
write msg2,len2
read str2,10
pack str2,l2,var2
mov al,[var1]
add al,[var2]
mov [ansvar],al
unpack ans,ansl,ansvar
write msg3,len3
write ans,10
write ln,lnl
mov ebx,0 ; exit code, 0=normal
mov eax,1 ; exit command to kernel
int 0x80 ; interrupt 80 hex, call kernel
汇编,链接和运行:
nasm -f elf add.asm
ld -s -o add add.o
./add