Assembler - podstawy

0

Szukam kogos kto mógłby pomóc mi zrozumieć kod asseberowy. Nie jest on długi. Ma 25 linijek i dotyczny tylko działania rozkazów i zmain flag. Są to raczej zupełne podstawy ale po 18h nauki które nic nie dały widzę że sam nie dam rady. Ptrzebuję pomocy na szybko!

0

Dlaczego nie wrzucisz tego kodu tutaj?

0
[bits 32]

global _main
extern _printf


section .data

; Important! %hu - 16 bit, %u 32 bit, probably!

fmt: db "%hu", 0xA, 0
carry1: db "It was carry", 0
fmt2: db "%s", 0xA, 0

section .text

_main:
xor ebx, ebx

mov bx, 4



add bx, 65532

; bx <-- 65536 (carry) not fit in number 65535 ((2^16)-1) (16 bit register)

jc took_place


push word bx
push fmt
call _printf
add esp, 6

ret

took_place:

push carry1
push fmt2
call _printf
add esp, 8

ret


section .bss

; Compilation and execute: nasm -fwin32 name_file.asm && gcc name_file.obj && a.exe 

Wyjaśnienie: W rejestrze bx mieści się 16 bitów, więc maksymalna wartość posłana do tego rejestru to 65535 i ani ciut więcej. Gdy się przekroczy tę wartość występuje "carry flag" - flaga przeniesienia, która sygnalizuje, że nastąpiło przeniesienie, czyli że wartość przekroczyła swój dopuszczalny zakres 16 bitów. Jest to przydatne np. kiedy chcemy posłużyć się np. 2x tym samym rejestrem, aby operować na liczbach 32 bitowych (chyba tak jest/może być, ale nie jestem pewny).

https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf

1 użytkowników online, w tym zalogowanych: 0, gości: 1